DOMException во время расшифровки RSA SubtleCrypto

Я пытаюсь использовать SubtleCrypto, чтобы зашифровать строку, сохранить зашифрованную строку и снова расшифровать эту строку, используя сгенерированную пару ключей RSA-OAEP.

Приведенный ниже код создает исключение DOMException на этапе дешифрования, однако я не могу получить никаких подробностей об ошибке. Я пробовал использовать "SHA-1" для хеширования, но возникла та же проблема.

Есть подсказки?

      let encoder = new TextEncoder();
let decoder = new TextDecoder('utf-8');

// Generate a key pair

let keyPair = await window.crypto.subtle.generateKey(
    {
        name: "RSA-OAEP",
        modulusLength: 4096,
        publicExponent: new Uint8Array([1, 0, 1]),
        hash: "SHA-256"
    },
    true,
    ["encrypt", "decrypt"]
);

let publicKey = await crypto.subtle.exportKey('jwk', keyPair.publicKey);
let privateKey = await crypto.subtle.exportKey('jwk', keyPair.privateKey);

// Encrypt a string

let encodedSecret = encoder.encode("MYSECRETVALUE");
let pubcryptokey = await window.crypto.subtle.importKey(
    'jwk',
    publicKey,
    {
        name: "RSA-OAEP",
        hash: "SHA-256"
    },
    false,
    ["encrypt"]
);
let encrypted = await window.crypto.subtle.encrypt(
    {
        name: "RSA-OAEP"
    },
    pubcryptokey,
    encodedSecret
);
let encDV = new DataView(encrypted);
let ct = decoder.decode(encDV);

// Decrypt the string

let encodedCiphertext = encoder.encode(ct);
let privcryptokey = await window.crypto.subtle.importKey(
    'jwk',
    privateKey,
    {
        name: "RSA-OAEP",
        hash: "SHA-256"
    },
    false,
    ["decrypt"]
);
console.log("Before decrypt");
let decrypted = await window.crypto.subtle.decrypt(
    {
        name: "RSA-OAEP"
    },
    privcryptokey,
    encodedCiphertext
);
console.log("After decrypt");
let decDV = new DataView(decrypted);
let pt = decoder.decode(decDV);

console.log(pt);

1 ответ

Решение

Проблема заключается в кодировании / декодировании зашифрованного текста UTF-8, которое искажает данные. Если произвольные двоичные данные, такие как зашифрованные тексты, должны храниться в строке, необходимо использовать двоичное кодирование текста, такое как Base64, см., Например, здесь .

Если это исправлено, расшифровка работает:

Другие вопросы по тегам