我用crypto-js在react中一个一个地加密了多个字符串。
我用的加密-
encryptAES = (text, key) => {
return CryptoJS.AES.encrypt(text, key).toString();
};为了解密,我使用了如下功能-
decryptAES = (encryptedBase64, key) => {
const decrypted = CryptoJS.AES.decrypt(encryptedBase64, key);
if (decrypted) {
try {
console.log(decrypted);
const str = decrypted.toString(CryptoJS.enc.Utf8);
if (str.length > 0) {
return str;
} else {
return 'error 1';
}
} catch (e) {
return 'error 2';
}
}
return 'error 3';
};我已经上传了这个加解密这里的工作示例项目。
例如,如果我用密钥“地球”加密“我生活在印度”,它将输出为- "U2FsdGVkX1+cBvU9yH5fIGVmliJYPXsv4AIosUGH4tA=",,类似地,它将成功地用正确的密钥解密。
现在,我在我的数据库中存储了多个加密字符串,但现在需要它们存储未加密的字符串,所以我想用对它们进行解密。我可以使用上面提到的函数在js中解密它们,但是我无法弄清楚如何在PHP中这样做。我已经尝试过这 github存储库,但是我无法为我的用例定制它。
发布于 2022-09-20 15:35:41
要解密,首先必须确定盐和密文。为此,必须对CryptoJS代码的加密数据进行Base64解码。salt是Base64解码数据的第二个8个字节,后面是实际的密文(前8个字节是Salted__的ASCII编码,可以忽略)。
确定盐后,用EVP_BytesToKey()求出key和IV。您可以在web上找到各种PHP实现,例如这里。注意,CryptoJS使用MD5作为摘要,因此必须相应地修改链接代码中的摘要。
一旦确定了密钥和IV,就可以解密实际的密文。
合在一起:
<?php
// Separate salt and actual ciphertext
$ctOpenSSL = base64_decode("U2FsdGVkX1+cBvU9yH5fIGVmliJYPXsv4AIosUGH4tA=");
$salt = substr($ctOpenSSL, 8, 8);
$ciphertext = substr($ctOpenSSL, 16);
// Derive key and IV
$keyIv = EVP_BytesToKey($salt, "earth");
$key = substr($keyIv, 0, 32);
$iv = substr($keyIv, 32, 16);
// Decrypt
$decrypted = openssl_decrypt($ciphertext, "aes-256-cbc", $key, OPENSSL_RAW_DATA, $iv);
print($decrypted . PHP_EOL); // I live in India
function EVP_BytesToKey($salt, $password) {
$bytes = '';
$last = '';
while(strlen($bytes) < 48) {
$last = hash('md5', $last . $password . $salt, true);
$bytes.= $last;
}
return $bytes;
}
?>https://stackoverflow.com/questions/73787380
复制相似问题