LINUX.ORG.RU

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

 


0

1

Вопрос. Существует ли некий малоизвестный алгоритм асимметричного шифрования (в приложении к цифровой подписи), допускающий генерацию закрытого ключа по заранее известному значению открытого? Подчеркну, речь не идёт о получении открытого ключа из закрытого - это невозможно по определению. Речь идёт о том, чтобы изначально можно было выбрать закрытый ключ такой, чтобы полученный из него открытый ключ был равен заданному. Ну или чтобы открытый ключ можно было бы вычислить из заранее заданного байтового массива.

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

Зачем это надо? Пишется некоторая оффлайн-утилита, которой для работы нужен некий файл с данными, и его хотелось бы защитить от несанкционированной подмены. Хранение цифровой подписи в бинарнике (в любом виде) бесперспективно, так как узнать её адрес в файле и переписать десяток байтов в бинарнике несложно. Поэтому хотелось бы привязать эту подпись, к примеру, к вычисляемому каждый раз хэшу бинарника (его фрагмента). Либо как-то вычислять этот открытый ключ (цифровую подпись) из этого хэша.

Конечно, ничто не мешает и исполняемый код «пропатчить», убрав все проверки, но для этого злоумышленнику потребуется больший скилл. Этот вариант мы не будем рассматривать.


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

anonymous ()
Ответ на: комментарий от anonymous

Если подпись в файле данных заверяет не только данные, но и бинарник, для которого предназначена, подмена заметно затрудняется

Elyas ★★★★★ ()
Последнее исправление: Elyas (всего исправлений: 1)

так как узнать её адрес в файле и переписать десяток байтов в бинарнике несложно

убрав все проверки, но для этого злоумышленнику потребуется больший скилл. Этот вариант мы не будем рассматривать

Тогда почему бы не хранить подпись в бинарнике в зашифрованном виде? Простейший вариант - просто сжать каким-нибудь lz + xor. Тогда для подмены нужно не просто подменить байтики, а проанализировать алгоритм «шифрования», что эквивалентно «убрать все проверки», особенно если сделать алгоритм многопоточным.

no-such-file ★★★★★ ()
Ответ на: комментарий от no-such-file

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

Сама же утилитка пишется на .NET под mono (на самом деле это даже не утилита вовсе, а модуль большого проекта, но это не важно), а, насколько мне известно, .NET-овский IL-код легко поддается реверс-инжинирингу. И кроме того, возможно я неправ, но отреверс-инжинирить код куда проще, чем ещё и модифицировать его. Соответственно, злоумышленник сможет узнать и ключи шифрования, и перезашифровать ключи и подпись. А вот если она будет привязана к хэшу, то проще уже будет IL-код патчить.

SVG ()
Ответ на: комментарий от SVG

злоумышленник может отреверс-инжинирить код, но не может его изменить

И как тогда он поменяет байтики в коде, чтобы подсунуть другой ключ?

no-such-file ★★★★★ ()
Последнее исправление: no-such-file (всего исправлений: 1)

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

iZEN ★★★★★ ()

чтобы изначально можно было выбрать закрытый ключ такой, чтобы полученный из него открытый ключ был равен заданному

Выбираем любой из ключей, подписываем - у нас корректная подпись, которая проверяется на открытом ключе

TheAnonymous ★★★★★ ()

Подчеркну, речь не идёт о получении открытого ключа из закрытого - это невозможно по определению.

Возможно не до конца понял тему - в gpg можно имея только закрытый ключ получить открытый.

isildur ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.