我有一个用RSA算法加密的String,当我尝试解密时,它工作正常。解密输出将在byte []中。
我的问题是,当我尝试将byte []转换为新的String(解密的String)时,它的长度有所不同。
如果我尝试使用随机字符串,则长度保持不变。但是,如果我解密 生成的aesKey(AES),在转换新的String(解密的String)时,byte []的长度正在改变。
为什么在aesKey解密的情况下我得到的长度不同??? “随机字符串”和“生成的密钥”之间有什么区别
字符串== “t8xypyI6gKlKTkt4Qec7FCor4EpukZXqYQcIDm6YvbtRB9 + YBrX0CqyoHOHN91T8RBQS / JD2osbf4ao9Y” SgNbzhfDa2NpJKMEIBWH4TNlF4Ngb8yWdSm3hz3l8FdeFUIy3pyCxkLjU8n4VAxsmgoIQbgd7DJuPiSMZBA9 / IVlcCfo / tZjMtSkezITtoT5aVvLxLaTsp08UREdalvXxb5USKi3cAEdqR9TmLJxB004IMv5Eiuvdmcc3fJzO6mnwiHPuGKArd9LjjiqbPQ75uc8NDOFrvleLc5KwSuThS5Xx7tR1qfoX6qefh6SD7FRk5UzyCEnv + ED + mCQ588Jam1A ==“;
****上面的字符串是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);
}
上面,字节字符串转换的长度在变化。
假设我使用普通字符串进行加密和解密,长度没有变化吗????为什么????
答案 0 :(得分:1)
同样,decryptedText
包含有趣的字节。 documentation说:
public String(byte[] bytes)
通过使用平台的默认字符集解码指定的字节数组来构造新的
String
。新String的长度是字符集的函数,因此可能不等于字节数组的长度。未指定默认字符集中给定字节无效时此构造方法的行为。当需要对解码过程进行更多控制时,应使用CharsetDecoder类。