Java如何使用公钥/私钥对数据进行加密和解密?

3

有没有人知道如何使用RSA公钥和私钥加密和解密字符串对象?

我已经使用KeyPair生成器创建了下面的私钥和公钥,但现在我想使用公钥加密数据,使用私钥解密数据。

public class Keys {

    private static KeyPairGenerator generator;

    private static KeyPair keyPair;

    private static PrivateKey mPrivateKey;

    private static PublicKey mPublicKey;

    private static SecureRandom secureRandom;

    private static final String SHA1PRNG = "SHA1PRNG";

    public static final String RSA = "RSA";

    private Keys() throws NoSuchAlgorithmException {
        generator = KeyPairGenerator.getInstance("RSA");
    }

    /**
     * Generate private and public key pairs
     * 
     * @throws NoSuchAlgorithmException
     */
    private static void generateKeyPair() throws NoSuchAlgorithmException {
        // create SecureRandom object used to generate key pairs

        secureRandom = SecureRandom.getInstance(SHA1PRNG);

        // initialise generator
        generator = KeyPairGenerator.getInstance(RSA);
        generator.initialize(1024, secureRandom);

        // generate keypair using generator
        keyPair = generator.generateKeyPair();

        // asssign private and public keys
        setPrivateKey(keyPair.getPrivate());
        setPublicKey(keyPair.getPublic());

    }

    /**
     * Get private key from key generated
     * @return
     * @throws NoSuchAlgorithmException
     */
    public static PrivateKey getPrivateKey() throws NoSuchAlgorithmException {

        if (mPrivateKey == null) {
            generateKeyPair();
        }
        return mPrivateKey;
    }

    private static void setPrivateKey(PrivateKey privateKey) {
        mPrivateKey = privateKey;
    }

    /**
     * Get public key from key pair generated
     * 
     * @return
     * @throws NoSuchAlgorithmException
     */
    public PublicKey getPublicKey() throws NoSuchAlgorithmException {
        if (mPublicKey == null) {
            generateKeyPair();
        }
        return mPublicKey;
    }

    private static void setPublicKey(PublicKey publicKey) {
        mPublicKey = publicKey;
    }

这是否可能?还是加密必须共享并使用相同的密钥?
主要目的是这样的。
我将有两个客户端,它们可以互相发送和接收加密数据。
对于客户端A来说,要接收加密数据:
1. 客户端B请求客户端A的公钥。 2. 客户端B加密字符串并将其发送给客户端A。 3. 客户端A收到此加密字符串,然后使用自己的私钥进行解密。
客户端B希望接收加密数据也是同样的过程。

1
你的密钥生成代码有什么问题吗?如果没有,那么它可能可以从问题中删除。 - Duncan Jones
1个回答

5
RSA加密只能用于加密数据小于密钥模数的情况。即,一个2048位的RSA公钥只能加密256字节的数据。其中一些数据需要用于填充字节,因此通常留给我们玩耍的空间更少。
通常使用混合加密方案来解决这个问题。也就是说,数据本身使用临时对称会话密钥进行加密,然后会话密钥使用接收者的公钥进行加密。加密的数据和加密的会话密钥都被发送到接收者。
您可能希望考虑使用OpenPGP等实现此行为(及更多其他功能)的东西。BouncyCastle提供了Java的OpenPGP实现。

这就是为什么RSA通常只用于加密像密码字段这样的小数据吗? - Jono
@jonney 是的。如果你的数据肯定永远都很小,你可以直接用RSA公钥加密它。否则,你需要采用不同的方案(如上所建议)。 - Duncan Jones

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接