Я вижу, что в примере php-кода используется mcrypt.
Можем ли мы ожидать, что sagepay перепишет пример кода php для использования open_ssl
, или, возможно, кто-то уже сделал это?
Хорошо, поскольку я не получил ответа на этот вопрос, я попытался выяснить, как заменить вызов mcrypt
одним на openssl
.
Оригинал code
на стороне шифрования это:
$strIV = $strEncryptionPassword;
//** add PKCS5 padding to the text to be encypted
$strIn = addPKCS5Padding($strIn);
//** perform encryption with PHP's MCRYPT module
$strCrypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $strEncryptionPassword, $strIn, MCRYPT_MODE_CBC, $strIV);
И (одна из) моих попыток заменить его такова:
$strIV = $strEncryptionPassword;
$strCrypt = openssl_encrypt($strIn,'AES-128-CBC',$strIV,$options=OPENSSL_RAW_DATA);
//** perform hex encoding and return
return "@" . bin2hex($strCrypt);
Я пробовал опции OPENSSL_NO_PADDING
, а также "AES_192_CBC"
и "AES_256_CBC"
.
Я сравниваю строку до и после, зашифрованную для mcrypt (и успешно обработанную Sagepay), но не получаю ту же зашифрованную строку из openssl
.
Буду признателен за помощь.
хорошо, я думаю, что у меня это работает, хотя я не уверен, что именно я должен был сделать, в отличие от того, что я пробовал раньше, вот код для двух функций в пакете интерфейса Sagepay:
Define('SESS_CIPHER','AES-128-CBC');
function NEWencryptAndEncode($strIn) {
global $strEncryptionType
,$strEncryptionPassword;
if ($strEncryptionType=="XOR")
{
//** XOR encryption with Base64 encoding **
return base64Encode(simpleXor($strIn,$strEncryptionPassword));
}
else
{
//** AES encryption, CBC blocking with PKCS5 padding then HEX encoding - DEFAULT **
//** use initialization vector (IV) set from $strEncryptionPassword
$strIV = $strEncryptionPassword;
//** add PKCS5 padding to the text to be encypted
$strIn = addPKCS5Padding($strIn);
//** perform encryption with PHP's Openssl module
$strCrypt = openssl_encrypt($strIn, SESS_CIPHER,$strIV,$options=OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING,$strIV);
//** perform hex encoding and return
return "@" . bin2hex($strCrypt);
}}
и
function NEWdecodeAndDecrypt($strIn) {
global $strEncryptionPassword;
if (substr($strIn,0,1)=="@")
{
//** HEX decoding then AES decryption, CBC blocking with PKCS5 padding - DEFAULT **
//** use initialization vector (IV) set from $strEncryptionPassword
$strIV = $strEncryptionPassword;
//** remove the first char which is @ to flag this is AES encrypted
$strIn = substr($strIn,1);
//** HEX decoding
$strIn = pack('H*', $strIn);
//** perform decryption with PHP's MCRYPT module
return openssl_decrypt($strIn, SESS_CIPHER,$strIV,$options=OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING,$strIV);
}
else
{
//** Base 64 decoding plus XOR decryption **
return simpleXor(base64Decode($strIn),$strEncryptionPassword);
}}