当前位置: 代码迷 >> Android >> 试图使非对称RSA加密起作用
  详细解决方案

试图使非对称RSA加密起作用

热度:70   发布时间:2023-08-04 11:58:22.0

以下方法不起作用。 最后,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编码。

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

如果需要使用非对称的公钥/私钥对较大的字符串进行加密,那么我首先需要使用对称的AES对字符串进行加密,然后使用公共RSA密钥对AES密钥进行加密,并通过网络同时发送加密的AES密钥和加密的消息,其中接收者可以使用其专用RSA密钥解密AES密钥。 AES密钥可以在发送代码中随机生成。

  相关解决方案