Проверьте правильность ключа, используя расшифровку pyCrypto AES - PullRequest
1 голос
/ 30 октября 2009

Как проверить, что правильный ключ используется для расшифровки зашифрованных данных AES с помощью pyCrypto AES?

cipher = AES.new(key, AES.MODE_CFB)
cipher.decrypt(s)

Если используется неправильный ключ, он все еще пытается расшифровать данные, еще больше запутывая их. Можно ли выполнить какой-либо тест, чтобы доказать, что данные расшифровываются до исходного состояния?

Ответы [ 3 ]

8 голосов
/ 31 октября 2009

Вы можете использовать Код аутентификации сообщений на основе шифра (CMAC) или, возможно, HMAC (Код аутентификации сообщений на основе хеша) (если у вас есть хеш-функция).

Существуют определенные способы сочетания шифрования и аутентификации. См. Аутентифицированное шифрование (AE) .

2 голосов
/ 30 октября 2009

Я не верю, что вы можете [сказать, правильный ли ключ], только с контекстом AES .
то есть вы не можете, кроме как путем проверки формата и / или некоторого значения дайджеста сообщения для открытого текста после его декодирования, что подразумевает, что вы знаете такую ​​структуру или дайджест сообщения.

Хотя это всего лишь следствие того, как установлен алгоритм / протокол, одно из преимуществ этого состоит в том, что это затрудняет атаки методом "грубой силы" на такие шифры, потому что нужно потратить время и декодировать хотя бы часть сообщения, а также передать его через детектор открытого текста . Детектор открытого текста - это некоторая логика, которая имеет априорное / предполагаемое понимание природы открытого текста и которая может определить, соответствуют ли данные этому ожиданию; например, простой детектор может проверить, что первые 20 байтов являются US ASCII). Это особенно полезно с несколькими схемами кодирования, такими как тройной DES, где никто не имеет ни малейшего представления (хорошо, что гении криптоанализа могут иметь слабое представление ...) о том, как выглядят промежуточные "открытые тексты".

Редактировать : отвечать на вопросы ОП в примечаниях
Да, если вы не уверены в ключе, вам нужно сделать копию зашифрованного текста , прежде чем пытаться расшифровать его. Он вернется как настоящий тарабарщина (и не так уж легко обратим, если вообще будет), если он будет декодирован с неверным ключом.
Чтобы ввести способ определения достоверности декодированного сообщения как для двоичных, так и для ASCII / текстовых сообщений, вы можете использовать вариант следующего " envellope "Концепция.
Примечание. Это может [слегка] ослабить силу вашей криптографической установки.
Это предполагает, что у вас есть контроль или совместная работа над процессом кодирования. Это работает как для ASCII, так и для двоичного содержимого
Идея состоит в том, чтобы просто добавить к сообщению префикс («заголовок») и, возможно, суффикс («трейлер»). Чтобы быть криптографически более безопасным, такой префикс должен быть достаточно длинным (скажем, 500 байтов?) И иметь большую часть его содержимого случайного характера. Затем вам нужно будет вставить фактическое сообщение в этот «конверт» и подтвердить достоверность / целостность конверта после расшифровки. Примерный пример:

17 random bytes
2 bytes length of this header  (allows to have a variable length header)
1 byte offset to "fingerprint"
x random bytes
fingerprint = a short binary (preferably) or ascii constant text  "MyDataIsOk"
[optionally: length of the payload and/or a CRC / MD5 / digest-of-sort for it]
y random bytes
followed by the actual message

Упрощенный (но немного «опасный» для криптографии) просто добавить, скажем, «MyDataIsGood123ABC» перед данными. Во время расшифровки вы должны убедиться, что расшифрованный поток начинается с этих 16 байтов, и удалите их, чтобы получить реальное сообщение.

0 голосов
/ 17 марта 2010

Посмотрите на это сообщение в блоге, оно содержит пример кода для выполнения того, что вам нужно (например, CRC)
Симметричное шифрование Python с CRC

...