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

У меня есть файл с именем plain.txt. Внутри файла у меня есть:

Hello Hello Hello Hello

Я использую эту команду для шифрования:

openssl enc -aes-128-cbc -salt -k "Hello" -in plain.txt -out encrypted.bin

Затем я печатаю зашифрованное значение следующим образом:

buff = open("encrypted.bin")
cipher = buff.read()
buff.close()
print b64encode(cipher)

Но это всегда разное значение. Разве шифр не должен быть всегда одним и тем же? Я использую тот же файл и тот же пароль для его шифрования. Это мои выходные данные терминала:

Richard-Knops-MacBook-Pro:python_test richardknop$ openssl enc -aes-128-cbc -salt -k "Hello" -in plain.txt -out encrypted.bin
Richard-Knops-MacBook-Pro:python_test richardknop$ python test.py U2FsdGVkX1+AmoQiIkYAxIYanLr/kbjMfEJPPLfeE/wtyxScvAKzb7K38ZxoI097
Richard-Knops-MacBook-Pro:python_test richardknop$ openssl enc -aes-128-cbc -salt -k "Hello" -in plain.txt -out encrypted.bin
Richard-Knops-MacBook-Pro:python_test richardknop$ python test.py U2FsdGVkX19vPD+OoiK7iSgYJiPMxuKGNWWrLlfBS0c3yCJkuv7QIBGEo2Q86UsV
Richard-Knops-MacBook-Pro:python_test richardknop$ openssl enc -aes-128-cbc -salt -k "Hello" -in plain.txt -out encrypted.bin
Richard-Knops-MacBook-Pro:python_test richardknop$ python test.py U2FsdGVkX1+3I8EC7u3lrcVPyD/JV12NAecWvTPXGga0Nh2cwqLAtGCDhLK6MI9g
Richard-Knops-MacBook-Pro:python_test richardknop$ 

person Richard Knop    schedule 05.08.2012    source источник
comment
По сути, зашифрованный текст всегда должен выглядеть как случайный вывод. Если это не так, происходит утечка информации. В этом случае вы можете увидеть, начинается ли шифрование с тем же паролем с идентичного ранее зашифрованного значения. Представьте себе следующий разговор: вы вообще BadEncryption? Зашифрованный ответ: да. Должны ли мы атаковать на рассвете? Зашифрованный ответ: да. Итак, противник видит зашифрованные, но идентичные сообщения и начинает укомплектовывать гаубицы.   -  person Maarten Bodewes    schedule 05.08.2012


Ответы (4)


Потому что «соль» каждый раз меняется. Это предотвращает, например, атаки типа радужной таблицы на зашифрованные значения. См. http://en.wikipedia.org/wiki/Salt_%28cryptography%29.

person podiluska    schedule 05.08.2012
comment
Могу ли я зашифровать его без использования соли? Что такое параметр? - person Richard Knop; 05.08.2012
comment
Вы можете использовать -nosalt. Но это не рекомендуется. - person podiluska; 05.08.2012

Причина, по которой вы получаете другую зашифрованную строку, — «enc -aes-128-cbc». CBC расшифровывается как Цепочка Блоков Шифра. Итак, для 2-го блока зашифрованный вывод первого блока действует как IV, поэтому каждый раз вы получаете другую строку. для более подробной информации погуглите "AES в режиме CBC"

person Rahul Goyal    schedule 15.11.2013

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

openssl enc -aes-128-cbc -salt -S "Salt" -k "Hello" -in plain.txt -out encrypted.bin
person Mr. Deathless    schedule 20.11.2013

Причина в том, что фактический key, который используется для шифрования, получен из ваших passphrase и SALT. Тогда определенно зашифрованный текст будет другим, даже если вы все еще используете тот же пароль, потому что SALT отличается.

Openssl использует соль по умолчанию для смягчения атак по словарю. Если вы не хотите его использовать, используйте ту же соль, что и в других ответах, или добавьте параметр nosalt следующим образом:

openssl enc -aes-128-cbc -nosalt -k "Hello" -in plain.txt -out encrypted.bin

Вы можете увидеть зашифрованный текст в шестнадцатеричном виде, используя xxd

xxd encrypted.bin
person Shaboti    schedule 27.03.2019