AES-256 Java加密

9

我有这个简单的代码,在网上找到的... 我正在学习加密/解密的内容... 这段代码似乎运行良好,但是我不明白一点... 为什么在"c.doFinal()"(用于使用AES-256进行加密/解密)之后,这个人要用BASE64对加密值进行编解码?只使用AES就不够吗?


`private static final String ALGO = "AES";
 private static final byte[] keyValue = 
 new byte[] { 'T', 'h', 'e', 'B', 'e', 's', 't', 'S', 'e', 'c', 'r','e', 't', 'K', 'e', 'y' };


 public static String encrypt(String Data) throws Exception {
    Key key = generateKey();
    Cipher c = Cipher.getInstance("AES");
    c.init(Cipher.ENCRYPT_MODE, key);
    byte[] encVal = c.doFinal(Data.getBytes());
    String encryptedValue = new BASE64Encoder().encode(encVal);
    return encryptedValue;
}

public static String decrypt(String encryptedData) throws Exception {
    Key key = generateKey();
    Cipher c = Cipher.getInstance(ALGO);
    c.init(Cipher.DECRYPT_MODE, key);
    byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedData);
    byte[] decValue = c.doFinal(decordedValue);
    String decryptedValue = new String(decValue);
    return decryptedValue;
}
private static Key generateKey() throws Exception {
    Key key = new SecretKeySpec(keyValue, ALGO);
    return key;
}

public static void main(String[] args) throws Exception {

    String data = "SOME TEXT";
    String dataEnc = AES.encrypt(data);
    String dataDec = AES.decrypt(dataEnc);

    System.out.println("Plain Text : " + data);
    System.out.println("Encrypted Text : " + dataEnc);
    System.out.println("Decrypted Text : " + dataDec);
}`

谢谢!

1
实际上使用的是128位AES,而不是256位。密钥为16字节;16字节*每字节8位=128位密钥。 - daiscog
3个回答

9
< p > doFinal 返回的加密数据是二进制格式的,因此无法打印出来(看起来像一堆乱码)。Base64 编码将二进制转换成 ASCII 字符集,这使得数据易于阅读,并且也使得在只能使用纯文本数据的情况下使用加密数据成为可能。< /p> < p > Base64 编码不会增加任何额外的加密或安全性,它只是使加密数据在不能使用二进制数据的情况下可用。< /p>

4

生成的AES-256加密值可能包含一些不常见的字符,当这些字符被打印或通过互联网发送时,可能会在传输或视觉呈现过程中被修改、误解、截断或替换。

Base64提供了一种编码/解码值的机制,使得它们可以无损地“旅行”,而不会改变内容。编写您发现的此代码的用户可能需要存储或传输该值。

您可以自己尝试并检查编码为Base64之前的生成字符串。


是的,你说得对。在来这里问之前,我已经尝试过了,它打印出了类似于“??'.????-”这样的东西。我正在开发一个程序,需要通过互联网发送数据,所以我认为在发送之前应该进行base64编码。 - Gerardo agustin Riera
实际上,我尝试通过 "System.out.println(new String(encVal,"ASCII"));" 进行打印。 - Gerardo agustin Riera

0

因为 doFinal() 返回一个字节数组,而字节通常很难理解。撇开这个程序,它执行的是 AES-128 而不是 AES-256。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接