Давайте начнем с исключения ... по какой-то причине вы не видите сообщение об ошибке.
Uncaught (in promise) DOMException: The required JWK member "kty" was missing
Асинхронный или синхронный
Эта первая ошибка, потому что вы пытаетесь использовать асинхронный API синхронно .
Вам необходимо добавить ключевое слово await
в строку генерации keyPair
:
keyPair = await crypto.generate('P-256');
Без ключевого слова await
Обещание присваивается keyPair
вместо Объект, содержащий kty
.
Неправильный тип ключа
Как только вы исправите это, вы увидите другую ошибку:
The JWK "kty" member was not "RSA"
Это потому, что ключ ECDSA используется с шифрованием RSA.
Еще одна проблема
Как только вы исправите это, вы увидите еще одну ошибку
The JWK "key_ops" member was inconsistent with that specified by the Web Crypto call. The JWK usage must be a superset of those requested
Я не могу помочь с этой. Я подозреваю, что это проблема с native-crypto
. Возможно, вам придется подать отчет об ошибке на их github repo . Вот примерно эквивалентный пример, использующий только Web Crypto API.
const crypto = window.crypto.subtle;
async function main() {
const keyPair = await crypto.generateKey(
{
name: "RSA-OAEP",
modulusLength: 4096,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-256"
},
true,
["encrypt", "decrypt"]
);
let message = "hello";
message = new TextEncoder().encode(message);
const encrypted = await crypto.encrypt({ name: "RSA-OAEP" }, keyPair.publicKey, message);
console.log(encrypted);
}
main()