Web Crypto API - ECDH - можно импортировать закрытый ключ только с компонентом секретного ключа, без компонентов открытого ключа?

Имея закрытый ключ Диффи-Хеллмана с эллиптической кривой P-256 (который является просто случайным 256-битным целым числом): возможно ли импортировать этот закрытый ключ в объект CryptoKey, используя метод window.crypto.subtle.importKey() Web Crypto API - без компонентов открытого ключа?

Я знаю, что можно импортировать закрытый ключ, если также доступны компоненты открытого ключа (которые получены из компонента закрытого ключа). Например, приведенный ниже код успешно выполняется:

window.crypto.subtle.importKey(
    "jwk", //can be "jwk" (public or private), "raw" (public only), "spki" (public only), or "pkcs8" (private only)
    {
    "crv":"P-256",
    "d":"eM8u2176zFk9bwDP_jbJqnm-TlSo6GX702D9I_1AqBU",
    "ext":true,
    "key_ops":["deriveKey","deriveBits"],
    "kty":"EC",
    "x":"5Uw_SuaGZTFAuQuDArnLEmmyp4TpHx3AlBxL4EUEzbQ",
    "y":"RO5t581VBuAKTQZVPSB__ebV6y9GCzrl8lBV2-p9BlM"
    },
    {   //these are the algorithm options
    name: "ECDH",
    namedCurve: "P-256", //can be "P-256", "P-384", or "P-521"
    },
    true, //whether the key is extractable (i.e. can be used in exportKey)
    ["deriveKey"] //"deriveKey" and/or "deriveBits" for private keys only (just put an empty list if importing a public key)
)
.then(function(key) {
    console.log(key);
})
.catch(function(err){
    console.error(err);
});

Однако, если доступен только компонент с закрытым ключом без компонентов с открытым ключом, как в приведенном ниже коде, Web Crypto API выдает исключение DOMEx с сообщением "Данные, предоставленные операции, не соответствуют требованиям".

window.crypto.subtle.importKey(
    "jwk", //can be "jwk" (public or private), "raw" (public only), "spki" (public only), or "pkcs8" (private only)
    {
    "crv":"P-256",
    "d":"eM8u2176zFk9bwDP_jbJqnm-TlSo6GX702D9I_1AqBU",
    "ext":true,
    "key_ops":["deriveKey","deriveBits"],
    "kty":"EC"
    },
    {   //these are the algorithm options
    name: "ECDH",
    namedCurve: "P-256", //can be "P-256", "P-384", or "P-521"
    },
    true, //whether the key is extractable (i.e. can be used in exportKey)
    ["deriveKey"] //"deriveKey" and/or "deriveBits" for private keys only (just put an empty list if importing a public key)
)
.then(function(key) {
    console.log(key);
})
.catch(function(err){
    console.error(err);
});

Я также попытался использовать формат pkcs8 для ключа вместо JWK, но там тоже не повезло.

Документация по API Web Crypto показывает, что можно импортировать закрытый ключ ECDH в формате JWK - так что, по-видимому, это должно быть возможно и без компонентов открытого ключа (API Web Crypto должен иметь возможность рассчитать компоненты открытого ключа, если необходимо, из внутреннего компонента закрытого ключа, как это происходит с методом.generateKey()). Однако метод importKey () работает только в том случае, если включены компоненты открытого ключа.

Я что-то здесь упускаю? Если нет, знает ли кто-нибудь о решении или обходном пути, если не считать вычисления компонентов открытого ключа отдельно перед импортом и включения их с компонентом закрытого ключа в метод importKey () (который кажется слишком громоздким и ненужным)?

1 ответ

Если у вас есть формат pkcs8, вы можете использовать это:

crypto.subtle.importKey("pkcs8", [privateKeyBuffer],{name:"ECDH",namedCurve:"P-256"} , true, ["deriveKey"]);

Вы всегда можете получить открытую точку из закрытого ключа, скалярным умножением закрытого ключа на базовую точку (или точку генератора) выбранной вами кривой. То, как вы выполните это, зависит от вашей среды выполнения.

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