Открытый показатель не совпадает с рассчитанным на основе JWK (d, p, q) из ExportKey('jwk')Javascript

Форум по Javascript
Ответить Пред. темаСлед. тема
Гость
 Открытый показатель не совпадает с рассчитанным на основе JWK (d, p, q) из ExportKey('jwk')

Сообщение Гость »


Я пытаюсь использовать SubtleCrypto (интерфейс Web Crypto API) для создания закрытого ключа RSA. Но на этапе проверки публичный показатель, рассчитанный вручную, отличается от JWK.e в 50% случаев. Такое же поведение в Chrome, Edge и Firefox.

🔎Кто может объяснить, где скрывается ошибка?🕵🏼

Наиболее важные части кода (полный код в конце):

// 1. Ключ crypto.subtle.generateKey( { название: "РСА-ОАЭП", длина модуля: 1024, publicExComponent: new Uint8Array([0x01, 0x00, 0x01]), // 65537 с прямым порядком байтов хеш: "SHA-256", } истинный, ["зашифровать", "расшифровать"] ) // 2. Экспорт crypto.subtle.exportKey("jwk", keyPair.privateKey) // 3. Преобразование JWK (d, p, q, e, n) в BigInt // 4. Проверка параметров RSA const pubExp = modInverse(jwk.d, (jwk.p - 1n) * (jwk.q - 1n)); const isExpValid = jwk.e === pubExp; const isModulusValid = jwk.n === jwk.p * jwk.q; console.log('public exp', isExpValid, jwk.e, pubExp); console.log('n == p * q', isModulusValid); На данный момент, если приходит «неправильное» e, я запускаю генерацию заново.

Полный код:

После запуска вызовите методgeneratorRSAPrivateKeyObject(), и вы увидите несколько журналов в консоли
functiongenerateRSAPrivateKeyObject() { константа r16 = 16; константа onError = { модуль: BigInt(0).toString(r16), частныйЭкспонент: BigInt(0).toString(r16), р: BigInt(0).toString(r16), q: BigInt(0).toString(r16), }; пытаться { функция modInverse(a, m) { пусть m0 = m; пусть x0 = 0n; пусть x1 = 1n; в то время как (а > 1n) { const q = а/м; пусть т = м; м = % м; а = т; т = х0; х0 = х1 – q*x0; х1 = т; } если (x1 < 0n) { х1 += м0; } вернуть х1; } функция b64ToBn(b64) { const bin = atob(b64); константа шестнадцатеричный = []; bin.split('').forEach(function (ch) { пусть h = ch.charCodeAt(0).toString(r16); if (h.length % 2) { h = '0' + h; } hex.push(ч); }); return BigInt('0x' + hex.join('')); } функция urlBase64ToBase64(str) { константа р = ул% 4; если (2 === г) { стр += '=='; } иначе, если (3 === r) { стр += '='; } return str.replace(/-/g, '+').replace(/_/g, '/'); } функция base64urlDecode(base64url) { вернуть b64ToBn(urlBase64ToBase64(base64url)); } функция генерироватьJWK() { вернуть crypto.subtle.generateKey( { название: "РСА-ОАЭП", длина модуля: 1024, publicExComponent: new Uint8Array([0x01, 0x00, 0x01]), // 65537 с прямым порядком байтов хеш: "SHA-256", }, истинный, ["зашифровать", "расшифровать"] ) .then((keyPair) => { return crypto.subtle.exportKey("jwk", keyPair.privateKey); }) .then((privateKeyJWK) => { возвращаться { n: base64urlDecode(privateKeyJWK.n), р: base64urlDecode(privateKeyJWK.p), q: base64urlDecode(privateKeyJWK.q), d: base64urlDecode(privateKeyJWK.d), е: base64urlDecode(privateKeyJWK.e) }; }) } пусть повторит = 20; функция jwkValidator(jwk) { const pubExp = modInverse(jwk.d, (jwk.p - 1n) * (jwk.q - 1n)); const isExpValid = jwk.e === pubExp; const isModulusValid = jwk.n === jwk.p * jwk.q; console.log('public exp', isExpValid, jwk.e, pubExp); console.log('n == p * q', isModulusValid); если (isExpValid && isModulusValid) { возвращаться { модуль: jwk.n.toString(r16), р: jwk.p.toString(r16), q: jwk.q.toString(r16), PrivateExComponent: jwk.d.toString(r16) }; } еще { повторы--; если (повторные попытки > 0) { console.log('Повторная попытка генерации...'); returngenerateJWK().then(jwkValidator); } еще { вернуть ошибку; } } } returngenerateJWK().then(jwkValidator).catch((e) => { console.error("Ошибка создания закрытого ключа RSA:", e); вернуть ошибку; }); } поймать (е) { console.error("Ошибка создания закрытого ключа RSA:", e); вернуть Promise.resolve(onError) } } window.generateRSAPrivateKeyObject =generateRSAPrivateKeyObject;
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Javascript»