试图使非对称RSA加密工作

时间:2015-10-25 23:57:34

标签: android encryption encryption-asymmetric

以下方法不起作用。 decodeMessage最终会使用垃圾而不是预期的结果。

我正在关注一个可能有效的例子here

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();
    }


}

任何帮助都将非常感激。 谢谢, 迪安

2 个答案:

答案 0 :(得分:1)

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

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);

答案 1 :(得分:1)

事实证明,在我的原始代码中,decodingBytes包含正确解密的字节。以下命令将decodeBytes转换为垃圾字符......

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

我用...替换了那段代码。

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

这解决了这个问题,可能是因为decodeBytes从来没有进行过Base64编码。

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

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