Javascript AES Encryption возвращает слишком много символов

Я пытаюсь реализовать скрипт шифрования PHP в JavaScript. Мой PHP-скрипт возвращает строку из 128 символов, а мой скрипт на основе Javascript возвращает 160 символов. Первые 128 символов версии на основе JavaScript соответствуют версии на основе PHP.

function pkcs5_pad ($text, $blocksize){
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}
$skey = "somekey";
$ivKey = "someIVKey";
$input = "empid=xxxxxx;timestamp=Sat, 19 Nov 2016 00:33:03 UTC";

try {
$size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128,'cbc');
echo strlen($input) . "\n";
$input = pkcs5_pad($input, $size);
echo strlen($input) . "\n";
$cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');

$key = pack('H*', $skey);
$iv = pack('H*', $ivKey);
# The key size used is 16, 24 or 32 bytes - for AES-128, 192 and 256 respectively

if (mcrypt_generic_init($cipher, $key, $iv) != -1){
$encrypted = mcrypt_generic($cipher, $input);
mcrypt_generic_deinit($cipher);
$encryptedString = bin2hex($encrypted);
}
echo $encryptedString . "\n";
echo strlen($encryptedString) . "\n";
} catch (Exception $ex) {
echo $ex->getMessage();
}

Длина strlen($encryptedString) здесь дает мне 128 символов.

Моя версия на основе JavaScript использует CryptoJS для создания выглядит следующим образом

var aesKey = "somekey";
var ivKey = "someIVKey";

function pkcs5_pad (text, blocksize){
console.log(text.length);
var pad = blocksize - (text.length % blocksize);
console.log("pad:" + pad);
return text + str_repeat(chr(pad), pad);
}

input = "empid=xxxxxx;timestamp=Sat, 19 Nov 2016 00:33:03 UTC";

var size = 16;
console.log(input.length);
var input = pkcs5_pad(input, size);
console.log('"' + input + '"');
console.log(input.length);

var key = CryptoJS.enc.Hex.parse(aesKey);
var iv = CryptoJS.enc.Hex.parse(aesIV);

var encryptedString = CryptoJS.AES.encrypt(input,key,{iv: iv});
console.log(encryptedString.ciphertext.toString().length);
encryptedString = encryptedString.ciphertext.toString();

Все совпадает, включая длину строки до и после pkcs5_pad. Я использую некоторый дополнительный код JavaScript из locutus.io для вызова str_repeat и chr. Вот encryptedString.ciphertext.toString().length возвращает 160 символов, и первые 128 совпадают с моими сценариями PHP.

Насколько я понимаю, версия 3 CryptoJS использует режим CBC, но я также явно установил режим CBC, но безрезультатно. Я также вернул зашифрованную строку в шестнадцатеричном виде

encryptedString = encryptedString.ciphertext.toString(CryptoJS.enc.Hex);

Куда я иду не так?

РЕДАКТИРОВАТЬ
Вывод версии PHP

86b1c9874069129d0852eade01eb753a176a1c6155c4af3ac447ae0a5350b92c3447f95be9c4f8cdbf14503696bcaa16e6307c1605a2cac503239db9d1ac6fb3

Вывод версии JavaScript

86b1c9874069129d0852eade01eb753a176a1c6155c4af3ac447ae0a5350b92c3447f95be9c4f8cdbf14503696bcaa16e6307c1605a2cac503239db9d1ac6fb33051208849788f8a90db1cbe2494cac7

1

Решение

Дополнительные 32 символа представляют собой шестнадцатеричное кодирование в 16 байтов, и это заполнение. Java добавляет отступы, PHP — нет.

Обратите внимание, что mcrypt не использует стандартные отступы PKCS # 7 (ранее PKCS # 5).

У хороших библиотек шифрования будет опция дополнения, добавление дополнения к шифрованию и удаление его при расшифровке. Вы не должны делать свой собственный отступ.

1

Другие решения

Других решений пока нет …