首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sage Pay / Opayo表单集成-用openssl替换mcrypt

Sage Pay / Opayo表单集成-用openssl替换mcrypt
EN

Stack Overflow用户
提问于 2021-06-15 14:16:26
回答 2查看 668关注 0票数 0

我们使用Sage Pay / Opayo表单集成将客户订单传递给Sage Pay进行支付,然后处理返回的报告。Sage Pay的示例代码依赖于PHP函数,而PHP7.2不再支持这些函数,因此我们需要将脚本更新为OpenSSL。

加密在这里被一个伟大的帖子所覆盖:Upgrade mcrypt to OpenSSL encryption in SagePay form

  • 这对我来说很好:

代码语言:javascript
复制
    function encryptAes_new ($string, $key) {
      $key = str_pad($key,16,"\0"); # if supplied key is, or may be, less than 16 bytes
      $crypt = openssl_encrypt($string, 'aes-128-cbc', $key, OPENSSL_RAW_DATA, $key);
      // Perform hex encoding and return.
      return "@" . strtoupper(bin2hex($crypt));
    }

...but我找不到一个匹配的代码来修复解密函数。

目前的代码是:

代码语言:javascript
复制
    function decryptAes($strIn, $password)
    {
        // HEX decoding then AES decryption, CBC blocking with PKCS5 padding.
        // Use initialization vector (IV) set from $str_encryption_password.
        $strInitVector = $password;
    
        // Remove the first char which is @ to flag this is AES encrypted and HEX decoding.
        $hex = substr($strIn, 1);
    
        $strIn = pack('H*', $hex);
    
        // Perform decryption with PHP's MCRYPT module.
        $string = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $password, $strIn, MCRYPT_MODE_CBC, $strInitVector);
        return removePKCS5Padding($string);
    }

有谁能帮忙制作一个OpenSSL版本吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-16 22:21:25

解密时,必须首先删除@前缀,然后执行十六进制解码,最后才能执行解密。openssl_decrypt()隐式地删除填充,因此不需要显式删除。这是在下面的decryptAes_new()中实现的:

代码语言:javascript
复制
<?php
function encryptAes_new ($string, $key) {
    $key = str_pad($key,16,"\0"); # if supplied key is, or may be, less than 16 bytes
    $crypt = openssl_encrypt($string, 'aes-128-cbc', $key, OPENSSL_RAW_DATA, $key);
    // Perform hex encoding and return.
    return "@" . strtoupper(bin2hex($crypt));
}

function decryptAes_new($string, $key) {
    $key = str_pad($key,16,"\0"); 
    $binary = hex2bin(substr($string, 1));
    return openssl_decrypt($binary, 'aes-128-cbc', $key, OPENSSL_RAW_DATA, $key);
}

$plaintext = 'The quick brown fox jumps over the lazy dog';
$key = '0123456789012345';
$ciphertext = encryptAes_new($plaintext, $key);
$decrypted = decryptAes_new($ciphertext, $key);
print('Ciphertext: ' . $ciphertext . PHP_EOL);
print('Plaintext:  ' . $decrypted . ' - Size: ' . strlen($decrypted) . PHP_EOL);
?>

它产生的输出:

代码语言:javascript
复制
Ciphertext: @3089E6BC224BD95B85CF56F4B967118AAA4705430F25B6B4D953188AD15DD78F3867577E7D58E18C9CB340647C8B4FD8
Plaintext:  The quick brown fox jumps over the lazy dog - Size: 43

检查解密后的明文长度(43个字节),显示填充已被自动删除。

票数 0
EN

Stack Overflow用户

发布于 2021-09-25 09:49:33

谢谢你,迈克,问这个问题,user16205441问你的答案。我发现这个答案适用于我的问题。我已经尝试了几个星期来做以下工作:字符串必须使用AES (块大小128位)加密,在CBC模式下使用PKCS#5填充。使用提供的密码作为密钥和初始化向量,并将结果编码为十六进制(确保字母为大写)。

当我操作以下代码时:

代码语言:javascript
复制
<?php

function encryptAes_new ($string, $key) {
    $key = str_pad($key,16,"\0"); # if supplied key is, or may be, less than 16 bytes
    $crypt = openssl_encrypt($string, 'aes-128-cbc', $key, OPENSSL_RAW_DATA, $key);
    // Perform hex encoding and return.
    return "@" . strtoupper(bin2hex($crypt));
}

function decryptAes_new($string, $key) {
    $key = str_pad($key,16,"\0"); 
    $binary = hex2bin(substr($string, 1));
    return openssl_decrypt($binary, 'aes-128-cbc', $key, OPENSSL_RAW_DATA, $key);
}

$plaintext = 'theLongStringIwasTryingToSend';

$key = 'abcdefghijklmnop';

$ciphertext = encryptAes_new($plaintext, $key);

$decrypted = decryptAes_new($ciphertext, $key);

print('Ciphertext: ' . $ciphertext . PHP_EOL);

print('Plaintext:  ' . $decrypted . ' - Size: ' . strlen($decrypted) . PHP_EOL);

?>

它产生了Opayo团队说我的字符串应该产生的加密版本。

我有点惊讶,因为Opayo团队提到初始化向量($iv),用户16205441的答案没有明确提到。但如果成功的话,这对我来说才是最重要的。

现在我将再次尝试表单集成过程,看看团队会怎么说!

万事如意

NeverSayDai

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67988034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档