Расшифровать 256-битное сообщение AES-CTR из браузера с помощью API window.crypto.subtle
Мне нужно в браузере расшифровать сообщение, закодированное с помощью AES-CTR 256 бит (закодировано с использованием OpenSSL).
Используя OpenSSL, я получаю что-то вроде:
key=189BBBB00C5F1FB7FBA9AD9285F193D1771D7611CB891E5C1F4E24C20E50FB1D
iv =4103C88663AE12CE18EA46E894280C4D
msg=nhVKeu8zNO2PRTwJrDE=
Моя проблема в том, чтобы преобразовать эти строки в объекты, window.crypto.subtle
API могут управлять. Например.
const counter = ???;
const ciphertext = ???;
const rawKey = ???;
const key = window.crypto.subtle.importKey(
"raw",
key,
"AES-CTR",
true,
["encrypt", "decrypt"]
);
const decrypted = await window.crypto.subtle.decrypt(
{
name: "AES-CTR",
counter,
length: 64
},
key,
ciphertext
);
let dec = new TextDecoder();
const msg = dec.decode(decrypted);
console.log(msg);
Может ли кто-нибудь помочь мне уйти от key
, iv
, msg
к counter
, ciphertext
, rawkey
?
большое спасибо
1 ответ
Ключ, счетчик (или IV) и зашифрованный текст могут быть переданы как TypedArray
, то есть вам нужно два преобразования, одно из шестнадцатеричного, а второе из закодированной в Base64 строки в TypedArray
, например
из строки в шестнадцатеричной кодировке, здесь:
const fromHex = hexString => new Uint8Array(hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16)));
из строки в кодировке Base64, здесь:
const fromBase64 = base64String => Uint8Array.from(atob(base64String), c => c.charCodeAt(0));
В самом коде await
оператор отсутствует и в importKey
функция rawKey
должен использоваться вместо key
(возможно, ошибки копирования / вставки). Все вместе:
const fromHex = hexString => new Uint8Array(hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16)));
const fromBase64 = base64String => Uint8Array.from(atob(base64String), c => c.charCodeAt(0));
async function test(){
const rawKey = fromHex("189BBBB00C5F1FB7FBA9AD9285F193D1771D7611CB891E5C1F4E24C20E50FB1D");
const counter = fromHex("4103C88663AE12CE18EA46E894280C4D");
const ciphertext = fromBase64("nhVKeu8zNO2PRTwJrDE=");
const key = await window.crypto.subtle.importKey( // add >await<
"raw",
rawKey, // replace >key< with >rawKey<
"AES-CTR",
true,
["encrypt", "decrypt"]
);
const decrypted = await window.crypto.subtle.decrypt(
{
name: "AES-CTR",
counter,
length: 64
},
key,
ciphertext
);
let dec = new TextDecoder();
const msg = dec.decode(decrypted);
console.log(msg);
}
test();
Это расшифровывает зашифрованный текст, чтобы:
hello, world!