php之PHP中的AES/CBC/PKCS#5加密算法

daizhj 阅读:24 2025-05-04 20:05:19 评论:0

我正在尝试使用“表单集成”方法将 SagePay 支付网关集成到网站中。

基本上,表单集成方法的工作原理是在网页中插入一个表单,并在选择表单的提交按钮时将信息发布到 SagePay 的服务器。在将信息发送到 SagePay 的服务器之前,必须使用 AES/CBC/PKCS#5 算法对其进行加密,然后再进行 Base 64 编码。

我有加密的基本知识,但我没有在 PHP 中使用它的经验。谁能帮我用 PHP 制定 AES/CBC/PKCS#5 算法?

这是我到目前为止的努力:

$CRYPT = "Text Goes Here"; 
 
$blocksize = 16;//Does 16 Refer To 16 Bytes Or 16 Bits? 16 Bytes = 128 Bits. 
$cryptLength = strlen($CRYPT); 
$cryptLengthModuloBlocksize = $cryptLength % $blocksize; 
$pad = $blocksize - $cryptLengthModuloBlocksize; 
$padString = str_repeat(chr($pad), $pad); 
$CRYPT = $CRYPT . $padString; 
 
$encryptionPassword = 'password'; 
$Encrypted_CRYPT = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $encryptionPassword, $CRYPT, MCRYPT_MODE_CBC); 
 
$Base64_Encrypted_CRYPT = base64_encode($Encrypted_CRYPT); 
 
echo    "<form action = 'https://test.sagepay.com/gateway/service/vspform-register.vsp' method = 'POST'> 
 
            <input type = 'hidden' name = 'VPSProtocol' value = '3.00' />// 
            <input type = 'hidden' name = 'TxType' value = 'PAYMENT' /> 
            <input type = 'hidden' name = 'Vendor' value = 'vendorName' /> 
            <input type = 'hidden' name = 'Crypt' value = '" . $Base64_Encrypted_CRYPT . "' /> 
            <input type= 'submit' value = 'Submit'> 
 
        </form>"; 

非常感谢任何帮助。

请您参考如下方法:

这是 AES/CBC/PKCS#5 与 Sagepay 的表单集成一起工作的有效实现 您将需要安装 mcrypt。 sp_encryption 是加密 key 的定义。

/** 
* @param string $data - the key=value pairs separated with &  
* @return string 
*/ 
protected function encode_data($data) { 
    $strIn = $this->pkcs5_pad($data); 
    $strCrypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, sp_encryption, $strIn, MCRYPT_MODE_CBC, sp_encryption); 
    return "@" . bin2hex($strCrypt); 
} 
 
/** 
* @param string $data - crypt response from Sagepay 
* @return string 
*/ 
protected function decode_data($data) { 
    if (substr($data, 0, 1) == "@") { 
        $strIn = hex2bin(substr($data, 1)); 
        return $this->pkcs5_unpad(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, sp_encryption, $strIn, MCRYPT_MODE_CBC, sp_encryption)); 
    } 
    return ''; 
} 
 
protected function pkcs5_pad($text) { 
$size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); 
    $pad = $size - (strlen($text) % $size); 
    return $text . str_repeat(chr($pad), $pad); 
} 
 
protected function pkcs5_unpad($text) { 
    $pad = ord($text{strlen($text) - 1}); 
    if ($pad > strlen($text)) return false; 
    if (strspn($text, $text{strlen($text) - 1}, strlen($text) - $pad) != $pad) { 
        return false; 
    } 
    return substr($text, 0, -1 * $pad); 
} 

请注意,请确保您使用的 VPSProtocol 是“3.00”而不是 3,也不是 3.0,因为这些都不起作用!

希望这会有所帮助,sagepay 很快就会发布一些官方 PHP 文档。


标签:加密算法
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号