【问题标题】:Length of the decryption(RSA) string is changing解密(RSA)字符串的长度正在改变
【发布时间】:2018-11-20 10:25:05
【问题描述】:

我有一个使用 RSA 算法加密的字符串,当我尝试解密时它工作正常。解密输出将在 byte[] 中。

我的问题是当我尝试将 byte[] 转换为新字符串(解密字符串)时,它的长度不同。

如果我尝试使用随机字符串,则长度保持不变。但如果我解密 生成 aesKey(AES) 字节[] 的长度在转换新字符串(解密字符串)时发生变化。

为什么我在 aesKey 解密的情况下得到不同的长度??? “随机字符串”和“生成的aeskey”有什么区别

字符串 == “t8xypyI6gKlKTkt4Qec7FCor4EpukZXqYQcIDm6YvbtRB9 + YBrX0CqyoHOHN91T8RBQS / JD2osbf4ao9Y” SgNbzhfDa2NpJKMEIBWH4TNlF4Ngb8yWdSm3hz3l8FdeFUIy3pyCxkLjU8n4VAxsmgoIQbgd7DJuPiSMZBA9 / IVlcCfo / tZjMtSkezITtoT5aVvLxLaTsp08UREdalvXxb5USKi3cAEdqR9TmLJxB004IMv5Eiuvdmcc3fJzO6mnwiHPuGKArd9LjjiqbPQ75uc8NDOFrvleLc5KwSuThS5Xx7tR1qfoX6qefh6SD7FRk5UzyCEnv + ED + mCQ588Jam1A ==“; P>

****以上字符串是aesKey的加密形式(由KeyGenerator生成)

如果我使用 RSA 解密这个字符串----

private String decrypt(String text, Key privatekey) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
    byte[] dectyptedText = null;

    Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPPadding");
    cipher.init(Cipher.DECRYPT_MODE, privatekey);
    dectyptedText = cipher.doFinal(Base64.getDecoder().decode(text));
    System.out.println(dectyptedText.length);                  //32
    System.out.println(new String(dectyptedText).length());    //30
    System.out.println(new String(dectyptedText).getBytes().length); //60
    return new String(dectyptedText);

}

以上,字节串转换中长度是变化的。

假设如果我用普通字符串加密和解密,长度不会改变????为什么????

【问题讨论】:

  • 分享代码。我不确定你的问题是什么。
  • 是的,我分享了代码请查看一次..
  • 我无法理解您的问题。首先你在谈论一个字符串,然后你在谈论一个 AES 密钥。使用 new String() 构造函数将 AES 密钥转换为字符串是没有意义的。

标签: java algorithm security aes rsa


【解决方案1】:

decryptedText 可能包含有趣的字节。 documentation 说:

public String(byte[] bytes)

通过使用平台的默认字符集解码指定的字节数组构造一个新的String。新字符串的长度是字符集的函数,因此可能不等于字节数组的长度

当给定字节在默认字符集中无效时,此构造函数的行为未指定。当需要对解码过程进行更多控制时,应使用 CharsetDecoder 类。

【讨论】:

  • 我敢打赌 OP 的字符集是 UTF-8。 AESkey 是有效的随机字节,统计其中近一半是无效的 UTF-8;尽管在现实中没有指定解码替代 U+FFFD 然后重新编码为 3 个字节,所以你得到一个接近 16+(3x16)=64 字节的随机长度。当然,实际的 AES 密钥值已被破坏。所以不要那样做。
  • 对了,如果我们将String转换为byte[]---> byte[] to String的行为并没有改变,如果我们将byte[]转换为new String,byte[的长度] 正在改变,它可能会影响 byte[]。
猜你喜欢
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多