【发布时间】:2020-04-12 10:52:37
【问题描述】:
我有一个收集数据的表单,然后将其提交给 SagePay,传递数据。在我们需要更新到 PHP 7.2 之前,这一直很好,并且由于不再支持 mcrypt,我们正在切换到 OpenSSL。
收集数据的表单工作正常,但传输数据没有加密,交易失败。
函数文件中的代码:
$protx_encryption_password = "my_password";
$protx_vendor = "my_vendor";
$data = "";
while(list($key,$value) = each($protx)) {
$data .= $key."=".$value."&";
}
$data = trim($data," &");
$crypt = openssl_encrypt($data, $protx_encryption_password);
function openssl_encrypt($string, $key) {
$iv = substr($value, 0, 16);
$ciphertext = substr($value, 16);
$key = hash('sha256', $key, true);
$crypt = openssl_encrypt(
$ciphertext, 'AES-256-CBC', $key,
OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING,
$iv
);
return rtrim($crypt, "\0");
}
$crypt 数据像以前在 mcrypt 版本中一样在隐藏字段中发送,我只需要一些帮助来使加密工作。
以前用mcrypt方式:
$crypt = encryptAes($data, $protx_encryption_password);
function encryptAes($string, $key) {
// AES encryption, CBC blocking with PKCS5 padding then HEX encoding.
// Add PKCS5 padding to the text to be encypted.
$string = addPKCS5Padding($string);
// Perform encryption with PHP's MCRYPT module.
$crypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $string, MCRYPT_MODE_CBC, $key);
// Perform hex encoding and return.
return "@" . strtoupper(bin2hex($crypt));
}
function addPKCS5Padding($input) {
$blockSize = 16;
$padd = "";
// Pad input to an even block size boundary.
$length = $blockSize - (strlen($input) % $blockSize);
for ($i = 1; $i <= $length; $i++)
{
$padd .= chr($length);
}
return $input . $padd;
}
这是我完成的第一个 OpenSSL 加密,因此我将不胜感激。 SagePay 需要在带有 PCKS#5 (AES-128-CBC-PKCS#5) 的 CBC 模式下使用 128 位块大小的 AES-128 加密进行加密。任何帮助都会非常有帮助。
【问题讨论】:
-
如果你想要填充,不要指定 OPENSSL_ZERO_PADDING。 openssl_encrypt 默认使用 PKCS#7,相当于 PKCS#5 用于 AES。并且不要弄乱密文。如果你有尾随零字节,它们应该在那里。
标签: encryption openssl mcrypt