Sagepay/Opayo PHP 7.4 集成,无需 mcrypt

问题描述 投票:0回答:1

我使用 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()

希望有人能帮忙。

谢谢,

php openssl mcrypt opayo
1个回答
0
投票

我的 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);
}
© www.soinside.com 2019 - 2024. All rights reserved.