Неправильная кодировка для AES из JavaScript: неверный хэш для переполнения стека

Все работает благодаря библиотеке cryptojs v3.1.2. Я нашел по этому адресуhttps://labs.chiedo.com/blog/using-crytpo-js-with-cryptographically-secure-psuedo-random-keys/«руководство о том, как шифровать данные в соответствии с методом AES.

var encryptionKey = new TextEncoder("utf-8").encode('my-key');
var iv = window.crypto.getRandomValues(new Uint8Array(16));
var convertBytesToHex = function(bytes) {
// Grabbed from https://github.com/ricmoo/aes-js
var result = [];
var Hex = '0123456789abcdef';

for (var i = 0; i < bytes.length; i++) {
var v = bytes[i];
result.push(Hex[(v & 0xf0) >> 4] + Hex[v & 0x0f]);
}

return result.join('');
};
encryptionKey = CryptoJS.enc.Hex.parse(convertBytesToHex(encryptionKey));
iv = CryptoJS.enc.Hex.parse(convertBytesToHex(iv));
var encrypted = CryptoJS.AES.encrypt('message to be encrypted', encryptionKey, {
iv: iv,
mode: CryptoJS.mode.CBC,
});
var ciphertext = encrypted.toString();
var hmac = CryptoJS.HmacSHA256(ciphertext, encryptionKey).toString(CryptoJS.enc.Hex);
hmac = iv+hmac+ciphertext;
var base64 = hmac.toString(CryptoJS.enc.Base64);

Я хотел бы создать эквивалентность с этим методом, взятым изhttp://php.net/manual/en/function.openssl-encrypt.php«

$key = 'my-key';
$plaintext = "message to be encrypted";
$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext_raw = openssl_encrypt($plaintext, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
$hmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
$ciphertext = base64_encode( $iv.$hmac.$ciphertext_raw );

расшифровать здесь:

$c = base64_decode($ciphertext);
$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
$iv = substr($c, 0, $ivlen);
$hmac = substr($c, $ivlen, $sha2len=32);
$ciphertext_raw = substr($c, $ivlen+$sha2len);
$original_plaintext = openssl_decrypt($ciphertext_raw, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
$calcmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
if (hash_equals($hmac, $calcmac))//PHP 5.6+ timing attack safe comparison
{
echo $original_plaintext."\n";
}

В javascript «var hmac» и «var base64» имеют, казалось бы, правильные значения: правильные форматы и правильную длину.
Но здесь я вижу, что есть проблемы: hash_equals для значения, предоставляемого javascript, никогда не бывает положительным по сравнению со значением, сгенерированным php: я пробовал все типы кодирования (128,192,256), почему?
Как я могу получить положительный результат?

0

Решение

Задача ещё не решена.

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector