Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602  Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 395 раз в 366 постах
|
Автор: Lenadmin  Интересно. УЦ, вроде бы, "выдает" открытые ключи после генерации закрытого ключа. На основе некоего запроса сертификата. Или просто регистрирует у себя открытый ключ, родившийся в паре с закрытым, формирует цепочку сертификатов до доверенного корневого ? ) Т.е. правильно ли я понял, что теоретически, открытый ключ генерируется вместе с закрытым один раз, и является таким же уникальным? И не вычисляется заново каждый раз далее, а просто сравнивается? Как Вы уже поняли в сертификате содержится открытый ключ. Более того, запрос на сертификат по формату это почти тоже самое что и сертификат (без информации вносимой УЦ, подписи УЦ и подписанный закрытым ключом, соответствующим открытому ключу в запросе - так УЦ "проверяет", что у клиента есть закрытый ключ; иногда добавляются дополнительные подписи агента УЦ). Поэтому открытый ключ содержится в запросе на сертификат (практический пример: можно извлечь его с помощью openssl как из запроса на сертификат, так и из сертификата). Поэтому в общем случае открытый ключ действительно "рождается" вместе с закрытым, а УЦ заверяет принадлежность открытого ключа (ключевой пары) конкретному пользователю. Насчет уникальности все сложно - теоретически по обобщенному алгоритму открытый ключ не уникален. Однако в нормативах практической реализации, например, в rfc или госте закреплены такие огранения и параметры, что ключ становится уникальным или около того. Вероятность совпадения исчезающе мала.
Поясню общую неуникальность на примере RSA и гост. В RSA зашифрование основано на том, что блок возводится в некоторую степень, расшифрование точно такое же, можно поменять открытый и закрытый ключ местами. То есть по сути используется свойство, что возведение блока по модулю n в определенную степень k2+1 восстанавливает изначальное значение блока. Поэтому если к открытому или закрытому ключу добавить это самое число k2, результат будет неизменным.
Смотрим далее - на практике указывается, что длина ключа допустим 1024 бит, однако длина k2 будет почти в два раза больше и если прибавить, то результирующий дубль-ключ будет по длине близким к k2, то есть уже не подходить под практическую реализацию из-за длины и гораздо большей трудоемкости вычислений. С другой стороны, в множество ключей 2048 бит полученный сложением ключ, скорее всего не входит, так как сумма скорее окажется составным числом (составных чисел подавляющее большинство, но это не точно), а ключи выбираются как простые числа. Поэтому есть малая вероятность, что можно подобрать число меньшей длины, являющееся ключом, если сумма оказалась простым числом и выбрана как ключ большей длины. Однако для этого придется пересчитать и другие параметры алгоритма, что очень затруднительно.
У алгоритма гост еще интереснее: шифрование гост-89 симметричный алгоритм; чтобы не раздувать длину ключей для гост-2001/2012 вообще выбраны эллиптические кривые; в закрытом ключе указано больше данных, а вот в открытом - просто координаты некой точки. Из этого следует, что в гост: 1) поменять ключи из местами не выйдет; 2) для шифрования потребуется выработать симметричный ключ; 3) для подписи не используется шифрование, для проверки подписи не используется расшифрование, вместо этого придуманы специальные операции выработки некого контрольного числа и второй точки; 4) из школьного курса геометрии очевидно, что через одну точку можно провести бесконечное множество прямых, а уж кривых и подавно, поэтому одному открытому ключу соответствует много закрытых (если не брать указанные в гост параметры!). Однако по закрытому ключу, полагаю, возможно найти точку открытого ключа. Фактически это очень затрудняет поиск кривой по одной точке открытого ключа и позволяет сэкономить на длине ключа при сравнимой криптостойкости. Когда у RSA актуальная длина 2048 бит, у гост-2012 256/512 бит.
На практике конечно на координаты точки накладываются ограничения в виде длины ключа (допустимо иметь не более двух первых нулевых бита из 256/512), отбраковки некоторых вырожденных ключей (один раз было такое - нажимал как обычно клавиши при генерации, а потом КриптоПро сказал - генерация неудачна, будем собирать энтропию на следующую попытку, нажимайте клавиши еще раз; в другой раз глазам не поверил когда при неудачном нажатии прогрессбар пошел в обратную сторону), параметры кривых берутся не произвольно, а из указанных в гост. Для УЦ есть норма (хотя не все УЦ ей следуют) - отбраковывать открытый ключ в запросе на сертификат, если он совпал с открытым ключом в ранее выданном сертификате и аннулировать тот сертификат (во избежание совпадения и компрометации закрытых ключей). В итоге, открытый ключ в сертификате достаточно длинный и отфильтрован УЦ на совпадение чтобы считать его уникальным для конкретного аккредитованного УЦ или почти уникальным для разных УЦ.
Автор: Lenadmin  Просто я видел на другом форуме, по-моему, предлагали идею Цитата:Проверяется соответствие двух ключей одной паре тоже просто - сначала исходный блок данных шифруется одним ключом, потом расшифровывается вторым. Если расшифрованные данные равны исходному блоку, то ключи могут использоваться как одна пара. И я уже подумывал спросить как зашифровать и расшифровать средствами командной строки и csptest. Это хрестоматийный пример определения пары ключей. ТОчнее тут проверяются не ключи, а само преобразование одного значения блока в другое значение, поэтому таким способом возможны и ложноположительные срабатывания (ключи другой длины или других алгоритмов могут случайно преобразовать конкретное значение блока правильно), после успеха на одном блоке надо проверить еще несколько значений блока. Особенно это актуально для гост, так как ключ шифрования симметричный, вырабатывается из ассиметричных ключей. То есть теоретически возможна ключевая пара гост-2001 дающая в точности тот же ключ шифрования (с поправкой на другие узлы замены), что и пара гост-2012. Автор: Lenadmin  Но если произвести сравнение, разобравшись в ASN.1 - то это теоретически, проще. Да, но при таком сравнении мы не вникаем в специфику алгоритма и ключа, можно найти только ключи соответствующие стандарту одного алгоритма, что собственно и требуется при установке сертификатов. В предыдущем сообщении я специально писал об обертке (блобе) открытого ключа, в котором кроме самого значения открытого ключа указаны еще и оиды параметров алгоритма, а не о "голом" значении ключа (64 байта в гост-2001/2012 256), так сравнение не примет за одинаковые ключи, когда ключи разных алгоритмов (например, точка открытого ключа гост та же, но выбрана по другим параметрам).
|