Как определить режим блочного шифрования
Как определить, было ли сообщение криптовым с помощью CBC или ECB?
Я создал функцию, которая в случайном порядке шифрует в AES 128 CBC или ECB, и я делаю hamming между clear text и зашифрованный текст, но швы не коррелируются с режимом шифрования.
Как я могу обнаружить режим блочного шифрования?
Заранее благодарю
Ответы
Ответ 1
Ответ в значительной степени приведен в описании проблемы:
Помните, что проблема с ЕЦБ заключается в том, что она без гражданства и детерминированный; тот же 16-разрядный блок открытого текста всегда будет производить тот же 16-байтовый шифрованный текст.
Таким образом, с предположением, что некоторые повторяющиеся блоки открытого текста происходят при одном и том же смещении блока зашифрованного текста, мы можем просто пойти дальше и искать повторяющиеся блоки зашифрованного текста различной длины.
Ответ 2
Я делаю тот же набор проблем и только что закончил эту проблему (используя clojure).
Мой первый совет: будет более понятно, что вам нужно сделать, если вы используете язык, который поддерживает функции первого класса /lambdas.
В любом случае, немного сломайте проблему:
Сначала просто напишите функцию, которая проверяет, что черный ящик шифрует данные с помощью ecb. Как вы это сделаете?
Он может выглядеть примерно так (псевдокод ниже)
function boolean isEcbBlackbox(func f)
{ //what input can I use to determine this?
result = f("chosen input")
if(result ...) {//what property of result should I look for?
true
} else {
false
}
}
Помните, что ключевая слабость ECB - это идентичные блоки открытого текста, которые будут зашифрованы в одинаковые блоки зашифрованного текста.
ИЗМЕНИТЬ: проблемы теперь открытые, поэтому я буду ссылаться на мои решения:
https://github.com/dustinconrad/crypto-tutorial/blob/master/src/crypto_tutorial/lib/block.clj#L118
Ответ 3
вычислить размер блока на основе текста шифрования% 16 или 24 или 32, который когда-либо равен == 0
расстояние задержек должно выполняться блоком шифрования 1 с остальными блоками шифрования.
если мы усредняем по байту с использованием арифметики с плавающей запятой, если значение ниже определенного порога, то это ECB.
Ответ 4
Я знаю точное упражнение, которое вы делаете, я сейчас делаю это прямо сейчас. Я бы рекомендовал сделать Frequency Analysis в зашифрованных строках (не забудьте, что строка может быть base64'd или hex). Если вы вернете распределение частот, которое соответствует языку строки, которую вы закодировали, тогда безопасно принять ее в ECB, иначе это, вероятно, CBC.
Я не знаю, будет ли это работать, поскольку я просто выполняю упражнение сейчас, но это начало.
EDIT:
Я немного поспешил за этим ответом и почувствовал, что должен объяснить больше. Если он был зашифрован в режиме ECB, то анализ частоты должен показывать нормальный стиль распространения независимо от любого дополнения к началу/концу строки и используемого ключа. Если шифрование в режиме CBC должно иметь очень случайное и, вероятно, плоское распределение.