我正在考虑将一个项目从PHP移植到NodeJS,其中包含一个用于加密和解密字符串的加密/解密类,我正在try 将其转换为NodeJS.
下面是现有的PHP函数
public function encrypt($data): string
{
return base64_encode(openssl_encrypt($data, 'AES-256-CBC', $this->cipher_key,
OPENSSL_RAW_DATA, $this->iv));
}
public function decrypt($encryptedString)
{
try
{
return $this->strippadding(openssl_decrypt(base64_decode($encryptedString), 'AES-256-CBC',
$this->cipher_key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $this->iv));
}
catch (\Exception $e)
{
Logger::log("Failed to decrypt string. Error: " . $e->getMessage());
return $encryptedString;
}
}
private function strippadding($string)
{
error_reporting(0);
$slast = ord(substr($string, -1));
$slastc = chr($slast);
//$pcheck = substr($string, -$slast);
if(preg_match('/'.$slastc.'{'.$slast.'}/', $string)){
return substr($string, 0, strlen($string)-$slast);
} else {
return null;
}
}
下面是我移植到NodeJS的代码
const encrypt = (data, key, iv) => {
const cipher = crypto.createCipheriv('AES-256-CBC', key, iv);
let encrypted = cipher.update(data, 'utf8', 'base64');
encrypted += cipher.final('base64');
return encrypted;
}
const decrypt = (encryptedString, key, iv) => {
try {
const decipher = crypto.createDecipheriv('AES-256-CBC', key, iv);
decipher.setAutoPadding(false);
let decrypted = decipher.update(encryptedString, 'base64', 'utf-8');
decrypted += decipher.final('utf-8');
return strippadding(decrypted);
return decrypted
} catch (e) {
console.log(`Failed to decrypt string. Error: ${e.message}`);
return encryptedString;
}
}
const strippadding = (string) => {
const slast = string.charCodeAt(string.length - 1);
const slastc = String.fromCharCode(slast);
const regex = new RegExp(`${slastc}{${slast}}`);
if (regex.test(string)) {
return string.substring(0, string.length - slast);
} else {
return null;
}
}
当我try 获取一个已有的加密字符串并使用相同的密钥和IV对其进行解密时,我得到了一个空的返回值,因为带添加函数中的正则表达式似乎不起作用,但我看不出原因.如果我不使用条带化,而只是打印解密的变量,我只会得到随机符号.
如果我try 加密一个字符串,那么我得到的字符串与我期望的完全不同,所以我得到了一些不太正确的东西,但不确定是什么.