Пример кода php использует mcrypt, который больше не доступен в php72 - PullRequest
0 голосов
/ 16 мая 2018

Я вижу, что в примере 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);
}}
...