В настоящее время я пытаюсь передать открытую / закрытую пару ключей, сгенерированных через ECDH, представленную в виде шестнадцатеричных строк, в функцию importKey
API Web Crypto.
Я получаю эти ключи из внешнего источника, но я сгенерировал аналогичные ключи через node.js для тестирования.Кривая prime256v1
.Для справки: открытый ключ, который я использую для проверки, получил 04b71388fced2daee34793f74a7dfa982e37ce539a728233bcadaec298fc4ee422165b8db13e657f9c7b27b35364f523ad11fab29d717606140cc6312ec2c685cc
, а закрытый ключ - 4bd22700ec3450b5f27e47ba70c233a680c981ab02c1432a859ae23111bef377
.
const crypto = require('crypto');
const ecdh = crypto.createECDH('prime256v1');
ecdh.generateKeys();
console.log('ecdh p256 pubkey', ecdh.getPublicKey('hex'));
console.log('ecdh p256 prvkey', ecdh.getPrivateKey('hex'));
. Импортирование открытого ключа успешно выполнено с помощью параметра raw
.из importKey
.
const hexToUintArray = hex => {
const a = [];
for (let i = 0, len = hex.length; i < len; i += 2) {
a.push(parseInt(hex.substr(i, 2), 16));
}
return new Uint8Array(a);
}
const importedKey = await crypto.subtle.importKey(
'raw',
hexToUintArray('04b71388fced2daee34793f74a7dfa982e37ce539a728233bcadaec298fc4ee422165b8db13e657f9c7b27b35364f523ad11fab29d717606140cc6312ec2c685cc'),
{
name: 'ECDH',
namedCurve: 'P-256'
},
true,
[]
);
Однако закрытый ключ не может быть импортирован с помощью того же метода, так как он завершается неудачно с ошибкой DataError: Data provided to an operation does not meet requirements
, поскольку опция «raw» принимает только открытые ключи EC.
const importedPrvKey = await crypto.subtle.importKey(
'raw',
hexToUintArray('4bd22700ec3450b5f27e47ba70c233a680c981ab02c1432a859ae23111bef377'),
{
name: 'ECDH',
namedCurve: 'P-256'
},
true,
[]
);
Я знаю, что могу легко импортировать ключи, если он находится в формате JSON Web Key, но мне не известен способ преобразования его из необработанного формата в формат JWK или любой другойимпортируемый формат, который принимает Web Crypto API.