我使用 PHP 类为 SagePay/Opayo 生成 crypt 字段,但它使用 mcrypt。我的托管公司现已将我的网络服务器升级到 PHP7.4,并且不再支持 mcrypt。
理想情况下,我只想将以下两个函数替换为不使用 mcrypt 的函数(但做同样的事情):
protected function encryptAndEncode($strIn) {
$strIn = $this->pkcs5_pad($strIn, 16);
return "@".bin2hex(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $this->encryptPassword, $strIn, MCRYPT_MODE_CBC, $this->encryptPassword));
}
protected function decodeAndDecrypt($strIn) {
$strIn = substr($strIn, 1);
$strIn = pack('H*', $strIn);
return mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $this->encryptPassword, $strIn, MCRYPT_MODE_CBC, $this->encryptPassword);
}
*加密密码是我的SagePay/Opayo加密密码。
SagePay 曾经提供示例代码,但他们不再这样做了。他们说 crypt 字符串必须使用 AES(块大小 128 位)在 CBC 模式下使用 PKCS#5 填充进行加密。使用提供的加密密码作为密钥和初始化向量,并将结果编码为十六进制(确保字母为大写)。
在编码结果的开头添加“@”符号。 要解密,请确保在解密模式下使用相同的过程之前删除“@”符号。
我确实在论坛上找到了两个类似的帖子(没有 mcrypt 的 Sagepay 集成和 Sage Pay / Opayo Form 集成 - 用 openssl 替换 mcrypt),都使用了 openssl,但答案特定于发布者提供的代码,我无法弄清楚了解如何修改它以适合我的两个功能。
如果我尝试现有的代码,我会收到此错误:
Fatal error: Uncaught Error: Call to undefined function mcrypt_encrypt()
希望有人能帮忙。
谢谢,
我的 Sagepay 表格一直使用以下内容
protected function encryptAndEncode($strIn) {
$strIn = $this->pkcs5_pad($strIn, 16);
return $this->encryptAes($strIn, $this->encryptPassword);
}
protected function decodeAndDecrypt($strIn) {
$strIn = substr($strIn, 1);
return $this->decryptAes($strIn, $this->encryptPassword);
}
function encryptAes($string, $key) {
$cipher = 'AES-128-CBC';
$crypt = openssl_encrypt($string, $cipher, $key, OPENSSL_RAW_DATA, $key);
return "@" . strtoupper(bin2hex($crypt));
}
function decryptAes($string, $key) {
$cipher = 'AES-128-CBC';
$strIn = hex2bin(substr($string, 1));
return openssl_decrypt($strIn, $cipher, $key, OPENSSL_RAW_DATA, $key);
}
这可以替代以下 mcrypt 函数
protected function encryptAndEncode($strIn) {
$strIn = $this->pkcs5_pad($strIn, 16);
return "@".bin2hex(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $this->encryptPassword, $strIn, MCRYPT_MODE_CBC, $this->encryptPassword));
}
protected function decodeAndDecrypt($strIn) {
$strIn = substr($strIn, 1);
$strIn = pack('H*', $strIn);
return mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $this->encryptPassword, $strIn, MCRYPT_MODE_CBC, $this->encryptPassword);
}