Получите ключ AES-KW в JS - PullRequest
1 голос
/ 18 марта 2020

Я пытаюсь получить ключ AES-KW в js как:

let { publicKey: pub, privateKey: key } = 
  await crypto.subtle.generateKey(
    { name: 'ECDH', namedCurve: 'P-521' },
    true,
    ['deriveKey'],
  )

await crypto.subtle.deriveKey(
  { name: 'ECDH', public: pub },
  key,
  { name: 'AES-KW', length: 256 },
  false,
  ["encrypt", "decrypt"],
)

с ошибкой: Uncaught (в обещании) DOMException: Невозможно создать ключ с использованием указанного использования ключа.

Я не знаю почему, потому что AES -GCM может преуспеть.

1 Ответ

0 голосов
/ 18 марта 2020

Технически, crypto.subtle.deriveKey с name: 'AES-KW' в качестве derivedKeyAlgorithm предоставляет ключ, который можно использовать для упаковки другой ключ в соответствии с RF C 3394 , см. Также AES-KW. Для этого ['wrapKey', 'unwrapKey'] должен использоваться как keyUsages вместо ['encrypt', 'decrypt'], см. Также этот пример (getKey) .

С name: 'AES-GCM' как derivedKeyAlgorithm и ['encrypt', 'decrypt'] как keyUsages предоставляется ключ, который можно использовать для шифрования и дешифрования с AES-GCM.

Пример для AES-KW:

crypto.subtle.generateKey(
    { name: 'ECDH', namedCurve: 'P-521' }, 
    true, 
    ['deriveKey']
    ).then(function(keypair){
        crypto.subtle.deriveKey(
            { name: 'ECDH', public: keypair.publicKey },  // In practice, this is the public key of the recipient
            keypair.privateKey,                           // In practice, this is the own private key
            { name: 'AES-KW', length: 256 },
            true,
            ["wrapKey", "unwrapKey"],
        ).then(function(wrappingKey){
            console.log(wrappingKey);
        })
    })
...