我正在尝试使用 AES 解密和加密数据,并使用 TCP 通过网络发送数据。我希望我的算法以这种方式工作:
加密:
- 生成两个带
!
填充的 base64 盐(例如!9W5AQcaNjaWF2Q!) - 以这种方式排列消息 [salt][data][salt]
- 使用 AES/CBC/PKCS5Padding 加密消息,128 位密钥长度
- 发送[标识符][base64-message]
但是,如果我尝试解密 base-64 消息,前 128 位不包含盐,而是随机数据。
当我尝试解密消息时,我注意到前 128 位看起来像垃圾:(我确定那些是 128 位)
我的期望(256 位盐)
!R6NYI2DxsRt4Fb6PKZA+Itr0D5jqFo!ayy!CcHGYvN/1vW79KemKLQ39OjVcGI/3y!
我得到了什么
�*M�y��n�']e_PKZA+Itr0D5jqFo!ayy!CcHGYvN/1vW79KemKLQ39OjVcGI/3y!
另外,这是我的加密和解密代码
解密
private byte[] decryptAES(SecretKeySpec key, byte[] text) {
byte[] decryptedText = null;
try {
final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
decryptedText = cipher.doFinal(text);
} catch (GeneralSecurityException e) {
System.out.println("[WARNING] Could not decrypt data, wrong key?");
}
return decryptedText;
}
加密
private byte[] encryptAES(SecretKeySpec key, byte[] text) {
byte[] encryptedText = null;
try {
final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
encryptedText = cipher.doFinal(text);
} catch (GeneralSecurityException e) {
System.out.println("[ERROR] Could not encrypt data!");
e.printStackTrace();
}
return encryptedText;
}
如何修改这些函数以进行正确的加密/解密?