我有这个简单的代码,我在互联网上找到..我正在学习这个加密/解密的东西..这段代码似乎工作正常,但我不明白的东西......为什么在“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);
}`
谢谢!
答案 0 :(得分:9)
doFinal
返回的加密数据是二进制的,因此无法打印(它看起来像一堆乱码。)Base64编码将二进制转换为一组ASCII字符,这使得易于阅读,也可以在只能使用明文数据的情况下使用加密数据。
Base64编码不会添加任何额外的加密或安全性,它只会使加密数据在您无法使用二进制文件的情况下可用。
答案 1 :(得分:4)
生成的AES-256加密值可以包含一些不常见的字符,当打印或通过互联网发送时,可以在传输或视觉表示过程中修改或误解,截断或替换。
Base64提供了一种编码/解码值的机制,因此它们可以“移动”而不会修改内容。编写此代码的用户可能需要存储或传输此值。
您可以自己尝试,并在编码到Base64之前检查生成的字符串。
答案 2 :(得分:0)
因为doFinal()返回一个字节数组,字节通常很难理解。暂且没有这个程序可以使用AES-128而不是AES-256。