mcrypt_encrypt openssl_encrypt兼容性问题

时间:2018-10-17 12:04:27

标签: php mcrypt

我与外部提供商共享加密的数据。 该提供程序为我提供了算法,其中需要使用空格将输入字符串填充为16个字节的块,即

// input string already padded with blanks
$input = '4026411311333  ';
$key = 'idkK4556kkUkrkt5';
$iv = 'fuKJU6758gjrufdh';

mcrypt的工作如下:

$encrypted = bin2hex(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $input, MCRYPT_MODE_CBC, $iv));

现在,我需要查找执行相同工作的openssl_encrypt版本。许多尝试过,但没有成功...经过我的研究,这应该得出相同的结果,但事实并非如此:

$encrypted = bin2hex(openssl_encrypt($input, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv));

我不明白为什么: 输入,键和iv的块大小为16byte,但是结果不同...

我发现,魔术似乎发生在填充中。如果我这样填充输入字符串(而不是用空格),则会得到类似的结果:

$input = '4026411311333';
// openssl
$encrypted = bin2hex(openssl_encrypt($input, 'AES-128-CBC', $key, 
OPENSSL_RAW_DATA, $iv));
echo $encrypted;

// padding
$block = mcrypt_get_block_size("rijndael_128", "cbc");
$pad   = $block - (strlen($input) % $block);
$test = chr($pad);
$input .= str_repeat(chr($pad), $pad);

// mcrypt
$encrypted = bin2hex(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $input, 
MCRYPT_MODE_CBC, $iv));
echo $encrypted;

我的问题是:我无法在此处更改填充方式,因为我需要对提供商的加密进行兼容。...

有什么暗示吗?

1 个答案:

答案 0 :(得分:0)

尝试使用提到的网站(https://www.openssl.org/docs/man1.0.2/).This网站有填充说明。但是密码不是问题。