试图让非对称RSA加密工作



以下方法不起作用。decodedMessage最终会产生垃圾,而不是预期的结果。

我在这里遵循一个应该可以工作的例子。

public static void POCSimple()
{
    String secretMessage = "short message";
    PublicKey publicKey = null;
    PrivateKey privateKey = null;
    String encodedMessage = "";
    byte[] encodedBytes = null;
    String decodedMessage ="";
    byte[] decodedBytes = null;

    try
    {
        KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
        kpg.initialize(1024);
        KeyPair kp = kpg.genKeyPair();
        publicKey = kp.getPublic();
        privateKey = kp.getPrivate();
        Cipher c1 = Cipher.getInstance("RSA");
        c1.init(Cipher.ENCRYPT_MODE, publicKey);
        encodedBytes = c1.doFinal(secretMessage.getBytes());
        encodedMessage = Base64.encodeToString(encodedBytes, Base64.DEFAULT);
        Cipher c2 = Cipher.getInstance("RSA");
        c2.init(Cipher.DECRYPT_MODE, privateKey);
        decodedBytes = c2.doFinal(encodedBytes);
        decodedMessage = Base64.encodeToString(decodedBytes, Base64.DEFAULT);
        String mystring = "look at results";
    }
    catch (Exception e)
    {
        String status = e.toString();
    }

}

任何帮助将是最感激的。谢谢,院长

当然你得到的是垃圾,这是你的序列:

Plaintext message -> Encrypt -> Encode -> Encoded message
Encoded message -> Decrypt -> Decode -> GARBAGE

在解密消息之前,您需要撤销Base64编码,您正在以错误的顺序执行相反的过程!

编辑

实际上它更糟,这是你的序列:

Plaintext message -> Encrypt -> Encode -> Encoded message
Encrypted message -> Decrypt -> Encode -> GARBAGE

试试这个:

Cipher c1 = Cipher.getInstance("RSA");
c1.init(Cipher.ENCRYPT_MODE, publicKey);
encodedBytes = c1.doFinal(secretMessage.getBytes());
encodedMessage = Base64.encodeToString(encodedBytes, Base64.DEFAULT);
Cipher c2 = Cipher.getInstance("RSA");    
c2.init(Cipher.DECRYPT_MODE, privateKey)      
decodedBytes = Base64.decode(encodedMessage.toByteArray(), Base64.DEFAULT);
decryptedMessage = c2.doFinal(decodedBytes);

原来在我的原始代码中,decodedBytes包含正确解密的字节。下面的命令将decodedBytes转换为垃圾字符…

decodedMessage = Base64.encodeToString(decodedBytes, Base64.DEFAULT);

我将代码替换为…

String str = new String(decodedBytes, "UTF-8");

这解决了这个问题,可能是因为decodedBytes从一开始就没有被Base64编码过。

我还发现,使用直接RSA,如果我使用2048位密钥,我只能加密最多245字节。如果我使用1024位的密钥,会更少。

如果更大的字符串需要使用非对称公钥/私钥加密,那么我需要首先使用对称AES加密字符串,然后用公共RSA密钥加密AES密钥,并在接收方可以使用其私有RSA密钥解密AES密钥的地方发送加密的AES密钥和加密的消息。AES密钥可以在发送码中随机生成。

最新更新