При наличии сертификата как я могу определить, какие алгоритмы и форматы можно использовать с открытым ключом?

#javascript #encryption #rsa #webcrypto-api

#javascript #шифрование #rsa #webcrypto-api

Вопрос:

У меня есть сертификат, в котором указаны Signature Algorithm is sha256WithRSAEncryption и Key Size is 1024.

Я пытаюсь зашифровать некоторые произвольные данные с помощью Web Crypto API и смог успешно зашифровать их только путем импорта ключа сертификата со следующими параметрами

 return await window.crypto.subtle.importKey(
    'spki',
    buffer, // binary format of the key
    {
        name: 'RSA-OAEP',
        hash: 'SHA-256',
    },
    true,
    ['encrypt'],
);
 

А затем шифрование данных с помощью следующих параметров

 await crypto.encrypt({ name: 'RSA-OAEP' }, cryptoKey, chunk); // max of 62 bytes of data given the key size and algorithm
 

Мой вопрос в том, является ли это единственной возможной комбинацией для использования с этим конкретным ключом?

Человек, который выдал мне открытый ключ, говорит, что они ожидают алгоритм RSA-PKCS1-KeyEx , хэш rsa-sha1 и размер байта блока данных 117 для шифрования данных.

Учитывая мое очень ограниченное понимание криптологии, я склонен полагать, что RSA-PKCS1-KeyEx его можно использовать только для signing шифрования, а не для шифрования, и вы обычно подписываете с помощью закрытого ключа, а не открытого.

Даже изменение параметров importKey для использования RSASSA-PKCS1-v1_5 и sha-1 выдает ошибку, в которой говорится Cannot create a key using the specified key usages.

Возможно ли вообще использовать эти параметры с сертификатом / ключом sha256WithRSAEncryption и размером ключа 1024, или текущий способ, которым я его использую, является единственно возможным способом использования ключа и шифрования данных?

Ответ №1:

У меня есть сертификат, в котором указан алгоритм подписи sha256WithRSAEncryption , а размер ключа равен 1024.

Да, хорошо, но этот алгоритм подписи предназначен для подписи под сертификатом. Это не тот алгоритм подписи, который вам нужно использовать для открытого или закрытого ключа, содержащегося в сертификате.

Человек, который выдал мне открытый ключ, говорит, что они ожидают алгоритм RSA-PKCS1-KeyEx и хэш rsa-sha1 и размер байта блока данных 117 для шифрования данных.

RSA-PKCS1-KeyEx не существует ни в одном стандарте, насколько я знаю, это ужасное название для заполнения шифрования PKCS # 1.

Кроме того, PKCS # 1 v1.5 дополнение даже не использует хэш, поэтому указание SHA-1 просто указывает, что они понятия не имеют, о чем они говорят.

Учитывая мое очень ограниченное понимание криптологии, я склонен полагать, что RSA-PKCS1-KeyEx можно использовать только для подписи, а не для шифрования, и вы обычно подписываете с помощью закрытого ключа, а не открытого.

В стандарте PKCS # 1 указаны два разных метода заполнения: RSAES-PKCS1-v1_5, который представляет собой шифрование с помощью заполнения PKCS # 1 версии v1.5, и RSASSA-PKCS1-v1_5, который представляет собой генерацию подписи с другим заполнением PKCS # 1 версии v1.5.

Даже изменение параметров importKey для использования RSASSA-PKCS1-v1_5 и sha-1 выдает ошибку, в которой говорится, что невозможно создать ключ, используя указанные способы использования ключей.

Да, хорошо, если использование ключа в сертификате просто указывает шифрование, то использование «схемы подписи с приложением» или SSA не будет принято.

Возможно ли вообще использовать эти параметры с сертификатом / ключом sha256WithRSAEncryption и размером ключа 1024, или текущий способ, которым я его использую, является единственно возможным способом использования ключа и шифрования данных?

Я вижу только OAEP, указанный в WebCrypto. Вероятно, это связано с тем, что заполнение PKCS # 1 v1.5, которое вы должны использовать, оказалось небезопасным. SHA-1 также не очень безопасен, и размер ключа не равен 1024. Итак, человек, с которым вы разговариваете, на самом деле, похоже, мало что знает о криптографии (как мы обычно ее называем в наши дни).

Это все говорит о том, что библиотека может принимать rsaEncryption как алгоритм, и в этом случае она может использовать дополнение PKCS # 1 v1.5. Эта опция скрыта в API WebCrypto, который определяет OAEP. И это само по себе показывает, что они тоже не знают, какого черта они делают.