Рейтинг:4

Можно ли использовать цифровую подпись для создания ключа для шифрования AES?

флаг gf
cjd

Я хочу узнать, является ли использование цифровой подписи безопасным и разумным способом создания ключа для шифрования AES.

Течь будет следующим образом:

Пользователь подписывает сообщение м со своим закрытым ключом. Они на самом деле подписывают хэш м но об этом позаботятся как о части функции создания цифровой подписи. Это возвращает цифровую подпись с.

Предоставлена с остается тайной, т. с безопасный дайджест для использования для создания ключа к для АЕС.

Они ключ к будет создан следующим образом:

константное крипто = требуется ('крипто');

crypto.scrypt(s, 'unique-salt', keyLength, (ошибка, ключ) => {
    console.log(key.toString('hex')); // 12dd454fb...
});

Где первый параметр функции с это цифровая подпись, созданная пользователем.

В документации для криптопакета Node не указаны какие-либо требования к этому параметру.

Я понимаю, что если цифровая подпись получена кем-то другим, то этот человек может расшифровывать и шифровать сообщения, однако то же самое можно сказать, если этот человек получает любую строку, используемую в качестве этого параметра.

Итак, два вопроса:

  1. Является ли это безопасным и подходящим способом создания ключа для AES? Предполагая, что цифровые подписи уникальны и их трудно угадать людям, не имеющим доступа к закрытому ключу. И предполагая, что цифровая подпись, используемая для создания ключа, хранится в секрете.

  2. Зависит ли безопасность от сообщения м что подписано? Это тоже нужно держать в секрете? Я предполагаю, что не имеет значения, что это за сообщение, поскольку даже если маллет знает это сообщение, они не могут создать правильную цифровую подпись, поскольку у них нет закрытого ключа.

Спасибо

poncho avatar
флаг my
Потребуется ли вам делиться этим ключом AES с кем-то, кто не знает закрытый ключ подписи (или система подписи недетерминирована, то есть сгенерированная подпись меняется каждый раз, когда вы ее создаете, даже для одного и того же сообщения)? Если вы это сделаете и у вас есть соответствующий безопасный транспорт, будет ли работать альтернативное решение, заключающееся в простом выборе совершенно случайного ключа AES?
Maarten Bodewes avatar
флаг in
@poncho Для (EC)DSA, я думаю, у вас есть случайный $r$, которым можно поделиться. Точно так же вы можете поделиться начальным или случайным образом, сгенерированным для RSA-PSS, что-то вроде соли для KDF. Так что я не уверен, что детерминированная функция является требованием, только то, что вы можете найти реализацию, которая позволяет вам вводить случайные значения.
Maarten Bodewes avatar
флаг in
Я думаю, что вопрос сводится к следующему: можно ли использовать генерацию подписи в качестве функции деривации ключей (KDF).
poncho avatar
флаг my
@MaartenBodewes: для (EC)DSA публикация двух разных подписей с одним и тем же $r$ — идея **ПЛОХАЯ**; Я бы держался подальше от этого. С другой стороны, существуют безопасные детерминированные версии (EC)DSA.
Maarten Bodewes avatar
флаг in
@poncho Я не предлагаю этого. Я говорю, что вы можете использовать случайное значение для одной подписи/вывода ключа, а затем взять $r$ (извините, вероятно, $k$), чтобы сгенерировать то же значение, используя закрытый ключ *и то же сообщение*. Очевидно, вы должны держать значение $s$ в секрете, если сообщение может измениться (это была идея с самого начала, если я не ошибаюсь). Но как только у вас есть симметричный ключ, вы все равно можете использовать значение MAC, чтобы убедиться, что обе стороны имеют один и тот же ключ.
cjd avatar
флаг gf
cjd
@пончо, так что нет. Единственным человеком, который когда-либо расшифрует данные, будет пользователь, который изначально зашифровал их и владеет закрытым ключом. Так это нормально?
cjd avatar
флаг gf
cjd
@MaartenBodewes ключ по-прежнему будет получен с помощью функции scryprt. Но подпись используется как секретный пароль к общему ключу.
Maarten Bodewes avatar
флаг in
Я видел это в действии для функции генерации подписи RSA с использованием заполнения PKCS#1 v1.5. Само по себе это, конечно, не означает, что она безопасна ;) Плохо: если вы хотите запатентовать свою схему, вы опоздаете как минимум на 20 лет...
Рейтинг:3
флаг in

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

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

Однако, если вы будете использовать детерминированную версию RSA (заполнение PKCS#1 v1.5) или детерминированную ECDSA, тогда все будет в порядке.


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

скрипт однако обычно используется для паролей. Это нормально, но вам, вероятно, не нужна соль или фактор работы, чтобы растянуть ключ (поскольку степень случайности в подписи в любом случае должна быть достаточно высокой). Так что хорошо, если скрипт требуется, но обычно лучше использовать KBKDF, например HKDF, или просто HKDF-Extract.

Если у вас есть доступ к значению закрытого ключа, вы также можете использовать для этого KDF.


Я определенно рекомендую вам использовать алгоритм генерации подписи, который имеет по крайней мере ту же надежность, что и симметричный ключ. То же самое, конечно, касается функции KDF; вы можете найти подробности на keylength.com.

Кроме того, вы можете иметь в виду, что симметричную криптографию трудно атаковать с помощью полноценного квантового компьютера, в то время как асимметричные алгоритмы — нет (хотя эту схему может быть труднее атаковать, чем общую схему генерации подписи, в зависимости от того, как она используется). ).


Еще одно замечание по реализации: функции генерации подписи не ожидают, что вы сохраните подпись в секрете. Например, аппаратный модуль может хранить в HSM нормально полученный симметричный ключ. С другой стороны, он может экспортировать подпись без суеты, поскольку значение подписи предполагаемый быть публичным.

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

cjd avatar
флаг gf
cjd
Это прекрасно! Очень ценю подробный ответ. Спасибо.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.