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);
}`

谢谢!!

4

3 回答 3

9

返回的加密数据doFinal是二进制的,因此无法打印(会出现一堆乱码) Base64编码将二进制转换为一组ASCII字符,这使得它易于阅读,也可以在只能使用明文数据的情况下使用加密数据。

Base64 编码不会添加任何额外的加密或安全性,它只是使加密数据在您无法使用二进制的情况下可用。

于 2013-08-21T16:00:33.477 回答
4

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

Base64 提供了一种对值进行编码/解码的机制,因此它们可以“旅行”而无需修改内容。您发现编写此代码的用户可能需要存储或传输此值。

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

于 2013-08-21T15:56:25.290 回答
0

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

于 2014-04-16T10:42:36.013 回答