我有这个问题,使用abs 256 cbc加密在python中加密某些内容,如python代码加密方法所示。
我正在尝试在php中创建一个Decrypt方法来实际解密使用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)
答案 0 :(得分:2)
好的,我让它上班了!
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' padding默认设置为PKCS#7。我认为,这就是为什么我们遇到坏块大小错误。
因此,密文必须是base64_decoded,我们需要为填充设置两个选项。
我能够解密您提供的密文并查看电子邮件地址。
您在数据阵列中提供了MAC,因此这将允许您在PHP脚本中检查MAC。这样可以确保数据未被篡改。
我最近做了一个加密项目并以open ssl开始,但最终改为libSodium库。我强烈建议您查看其他任何项目。
干杯!