为什么解密数据与使用java加密的原始数据不同?

时间:2012-05-08 14:23:13

标签: java encryption aes

我正在使用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 =”它应该是“这只是一个例子”。我需要在代码中进行更改。提前致谢

1 个答案:

答案 0 :(得分:3)

您对纯文本邮件进行base-64解码。您应该使用message.getBytes(StandardCharsets.UTF_8)(或其他一些编码)来转换为字节。 Base-64对加密操作的结果进行编码,然后在解密之前对其进行base-64解码。使用new String(original, StandardCharsets.UTF_8)将解密操作的结果转换回文本。

换句话说,使用字符编码在文本和字节之间进行转换。使用base-64编码和解码以文本形式编码二进制数据。