我有这个问题,在使用 aes 256 cbc 加密在 python 中加密某些内容,如 python 代码加密方法所示。
我正在尝试在 php 中创建一个解密方法,以实际解密使用 python 类加密的内容。
这是我尝试将python解密方法转换为php的尝试,它看起来是否正确,或者我在转换中缺少某些内容,因为每次我使用php版本解密时,它都说hmac失败了?
我将不胜感激将 Python 类转换为 PHP 的任何帮助。
public function decrypt(){
$encrypt_method ="AES-256-CBC";
$secret_key =base64_decode('samekeyusedintheencryption');
$encrypted=(string)'some encrypted text to be decrypted';
$data=json_decode(base64_decode($encrypted),true);
$secret_iv =base64_decode($data['iv']);
$output = openssl_decrypt($data['value'],
$encrypt_method,$secret_key,0,$secret_iv);
return json_encode($output);
}
def decrypt(self, payload):
data = json_c.decode(base64.b64decode(payload))
value = base64.b64decode(data['value'])
iv = base64.b64decode(data['iv'])
crypt_object=AES.new(self.key,AES.MODE_CBC,iv)
plaintext = crypt_object.decrypt(value)
return loads(plaintext)
好的,我让它工作了!
function decrypt($encryptedText, $secret_key){
$secret_key = base64_decode($secret_key);
$encrypt_method ="AES-256-CBC";
$data = json_decode(base64_decode($encryptedText),true);
$data['iv'] = base64_decode($data['iv']);
$data['value'] = base64_decode($data['value']);
return openssl_decrypt($data['value'], $encrypt_method, $secret_key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $data['iv']);
}
我学到的一些东西:如果 openssl 函数中的选项设置为"0",则需要密文的base64_encoded输入。 此外,如果默认选项设置为"0",则填充默认值设置为 PKCS#7。 我认为,这就是我们出现坏块大小错误的原因。
因此,需要base64_decoded密文,我们需要为填充设置两个选项。
我能够解密您提供的密码文本并查看电子邮件地址。
在数据数组中为您提供了MAC,因此这将允许您在PHP脚本中检查MAC。 这使您可以确保数据未被篡改。
我最近做了一个加密项目,从开放的SSL开始,但最终改为libSodium 库。 我强烈建议您查看任何进一步的项目。
干杯!