【问题标题】:Trying to get asymmetric RSA encryption to work试图让非对称 RSA 加密工作
【发布时间】:2015-10-27 04:41:23
【问题描述】:

以下方法无效。 decodedMessage 最终会出现垃圾而不是预期的结果。

我正在关注一个应该有效的示例 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();
    }


}

任何帮助将不胜感激。 谢谢, 院长

【问题讨论】:

  • 代码看起来不错。你确定你得到垃圾? decodedMessage 应该是秘密消息的 Base64 编码版本。你有例子吗?

标签: android encryption encryption-asymmetric


【解决方案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);

【讨论】:

  • "您需要撤消 Base64 编码才能解密消息" 有问题的代码不是尝试解密 Base64 版本。它直接处理加密的字节。 Base64 值根本不用,大概是为了显示或调试。代码应该可以正常工作。
  • OP使用“编码”和“解码”这两个词是不正确的,现在我仔细阅读它,我能理解你的意思。我仍然不明白这个问题在问什么。 encodedMessage 是 RSA 加密和 Base64 编码的字符串,而 decodedMessage 是 Base64 编码的明文。关于这里试图实现的目标的一些背景信息会有所帮助。
【解决方案2】:

事实证明,在我的原始代码中,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 密钥可以在发送代码中随机生成。

【讨论】:

  • 我不会将 Base64 称为垃圾,但很高兴看到您解决了问题并在此过程中学到了一些东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多