我正在使用AES加密和解密。我使用Appache commons库进行字符串到字节的转换,反之亦然。但是,当我解密数据时,它与使用相同密钥加密的输入数据不同?为什么会如此
这是我的代码:
public static void main(String[] args) throws Exception {
String key="this is key";
String message="This is just an example";
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, new SecureRandom(Base64.decodeBase64(key)));
// Generate the secret key specs.
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted= cipher.doFinal(Base64.decodeBase64(message));
String encryptedString=Base64.encodeBase64String(encrypted);
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] original =
cipher.doFinal(Base64.decodeBase64(encryptedString));
System.out.println(Base64.encodeBase64String(original));
}
我得到输出“Thisisjustanexamplc =”它应该是“这只是一个例子”。我需要在代码中进行更改。提前致谢
答案 0 :(得分:3)
您对纯文本邮件进行base-64解码。您应该使用message.getBytes(StandardCharsets.UTF_8)
(或其他一些编码)来转换为字节。 Base-64对加密操作的结果进行编码,然后在解密之前对其进行base-64解码。使用new String(original, StandardCharsets.UTF_8)
将解密操作的结果转换回文本。
换句话说,使用字符编码在文本和字节之间进行转换。使用base-64编码和解码以文本形式编码二进制数据。