SubtleCrypto Импорт пары ключей Необработанная ошибка Ошибка: слишком большое целое число

Я работаю над простым доказательством концепции экспорта и импорта закрытых и открытых ключей через node.js и связи через браузер с помощью SubtleCrypto. Я установил пакет @ specific / webcrypto, чтобы обеспечить единообразие между фронтендом и бэкэндом. Первая часть - это просто генерация и экспорт ключей, а вторая часть - моя попытка импортировать ключи. Вот код:

      // GENERATE AND EXPORT KEYS
const { publicKey, privateKey } = await crypto.subtle.generateKey(
  {
    name: 'RSA-OAEP',
    modulusLength: 2048,
    publicExponent: new Uint8Array([1, 0, 1]),
    hash: 'SHA-256',
  },
  true,
  ['encrypt', 'decrypt'],
);
const publicExport = await crypto.subtle.exportKey('spki', publicKey);
const privateExport = await crypto.subtle.exportKey('pkcs8', privateKey);

const pubExportedAsString = ab2str(publicExport);
const pubExportedAsBase64 = btoa(pubExportedAsString);
const publicKeyPem = `${pubExportedAsBase64}`;

const privExportedAsString = ab2str(privateExport);
const privExportedAsBase64 = btoa(privExportedAsString);
const privateKeyPem = `${privExportedAsBase64}`;

// IMPORT KEYS
const pubKeyImportedAsString = atob(publicKeyPem);
const pubKeyImportedAsArrayBuffer = str2ab(pubKeyImportedAsString);
const publicKeyImport = await crypto.subtle.importKey(
  'spki', pubKeyImportedAsArrayBuffer, { name: 'RSA-OAEP', hash: 'SHA-256' }, true, ['encrypt']
);

const privateKeyImportedAsString = atob(privateKeyPem);
const privateKeyImportedAsArrayBuffer = str2ab(privateKeyImportedAsString);
const privateKeyImport = await crypto.subtle.importKey(
  'pkcs8', privateKeyImportedAsArrayBuffer, { name: 'RSA-OAEP', hash: 'SHA-256' }, true, ['decrypt']
);

// HELPERS

const ab2str = (buffer: ArrayBuffer): string => new TextDecoder().decode(buffer);

const str2ab = (text: string): ArrayBuffer => new TextEncoder().encode(text);

Импорт ключей вызывает ошибку:

      Unhandled error Error: Too big integer

Кажется, я не понимаю, в чем проблема и почему кодирование и декодирование ключей не работают. Если у кого-то есть какие-то подсказки или идеи, это очень поможет :)

1 ответ

Разобрался (для тех, кто находится в подобном затруднительном положении). Оказывается, проблема заключалась в вспомогательных функциях ab2str и str2ab. Я был введен в заблуждение, полагая, что TextDecoder/TextEncoder будет правильно обрабатывать преобразования для этого варианта использования.

Переписав их на следующее, проблема была решена!

      const ab2str = (buffer: ArrayBuffer) =>
  String.fromCharCode.apply(null, Array.from(new Uint8Array(buffer)));

const str2ab = (str: string): ArrayBuffer => {
  const buffer = new ArrayBuffer(str.length * 2);
  const bufferInterface = new Uint8Array(buffer);
  Array.from(str)
    .forEach((_, index: number) => bufferInterface[index] = str.charCodeAt(index));
  return buffer;
}
Другие вопросы по тегам