我们在从 Java 到 Python 重新构建加密逻辑时遇到了问题:
工作 Java 逻辑:下面的代码将 JSON 返回到客户端系统(解密成功使用 JSON)
message = "sampleplaintext..";
byte[] ivData = new byte[16];
byte[] keyData = new byte[16];
IvParameterSpec initializationVector = new IvParameterSpec(ivData);
SecretKey secretKey = new SecretKeySpec(keyData, "AES"); //equivalent line/logic for python ?
Cipher symmetricalCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
symmetricalCipher.init(1, secretKey, initializationVector);
byte[] encryptedBytes = symmetricalCipher.doFinal(message.getBytes());
return (new JSONObject())
.put("key", StringCodec.encodeBase64(msgkey))
.put("iv", StringCodec.encodeBase64(msgiv))
.put("messageContent", StringCodec.encodeBase64(encryptedBytes));
使用 pycryptodome lib 的 Python 逻辑:下面的代码将 JSON 返回到客户端系统(其中解密无法使用 JSON)
message = "sampleplaintext..";
data = bytes(message, 'utf-8')
msgiv = Random().read(AES.block_size)
msgkey = Random().read(AES.block_size)
AESCipherEncryptor = AES.new(msgkey, AES.MODE_CBC, msgiv)
EncryptedMSGContent = AESCipherEncryptor.encrypt(data)
ResEncrypted_string = json.dumps({
'key':base64.b64encode(msgkey).decode("utf-8"),
'iv':base64.b64encode(msgiv).decode("utf-8"),
'message':base64.b64encode(EncryptedMSGContent).decode("utf-8")
})
我们怀疑密钥是导致问题的原因,因为在 Java 中它需要 AES Keyspec 对象,而我们不确定如何在 python 中做同样的事情?