我尝试在PHP中解密来自ionic的数据,但它没有使用openssl_decrypt()
解密。
在我的离子应用程序中,我可以加密,也测试了解密功能,效果很好。下面是加密和解密功能:
加密
encrypt(key, iv, value){
const encrypted = CryptoJS.AES.encrypt(value, key, { iv: iv });
const encryptedMessage = encrypted.toString();
return encryptedMessage;
}
解密
decrypt(value, keys, ivs){
const decryptedMessage = CryptoJS.AES.decrypt(value, keys, { iv: ivs
}).toString(CryptoJS.enc.Utf8);
return decryptedMessage;
}
使用密钥和iv加密数据
$iv = "048eb25d7a45ff00";
$key = "feda4f2f67e7aa96";
$encrypted = "U2FsdGVkX1+kBV6Q5BQrjuOdi4WLiu4+QAnDIkzJYv5ATTkiiPVX8VcDUpMqSeIwCfyTNQOosp/9nYDY4Suu4/Lmhh2quKBU7BHGOtKwu9o=";
**To decrypt in PHP**
<?php
// Use openssl_decrypt() function to decrypt the data
$output = openssl_decrypt($encrypted, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
echo $output;
?>
我该怎么解密这个?
1条答案
按热度按时间n3schb8v1#
在CryptoJS代码中,密钥材料作为字符串传递,这就是为什么它被解释为密码并应用密钥派生。使用的密钥派生函数是OpenSSL专有的
EVP_BytesToKey()
。在加密期间,CryptoJS.AES.encrypt()
执行以下操作:EVP_BytesToKey()
根据salt和密码派生32字节密钥和16字节IV。048eb25d7a45ff00
)!encrypted.toString()
):Salted__
的ASCII编码的Base64编码,后跟8字节salt和实际密文。因此,必须按如下方式进行解密:
EVP_BytesToKey()
从salt和password派生32字节的密钥和16字节的IV。注意,IV048eb25d7a45ff00
不是必需的。一种可能的实现方式:
注意:
EVP_BytesToKey()
现在被认为是不安全的,不应该使用。一个更安全的选择是PBKDF 2,它被CryptoJS和PHP支持。