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;
}