我与外部提供商共享加密的数据。 该提供程序为我提供了算法,其中需要使用空格将输入字符串填充为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;
我的问题是:我无法在此处更改填充方式,因为我需要对提供商的加密进行兼容。...
有什么暗示吗?