Я пытаюсь построить две функции с использованием PyCrypto, которые принимают два параметра: сообщение и ключ, а затем шифруют / дешифруют сообщение.
Я нашел несколько ссылок в Интернете, чтобы помочь мне, но у каждой из них есть недостатки:
Этот в codekoala использует os.urandom , что не приветствуется PyCrypto.
Более того, ключ, который я даю этой функции, не обязательно будет иметь ожидаемую точную длину. Что я могу сделать, чтобы это произошло?
Также есть несколько режимов, какой рекомендуется? Я не знаю, что использовать: /
Наконец, что именно IV? Могу ли я предоставить другой IV для шифрования и дешифрования, или это даст другой результат?
Редактировать : Удалена часть кода, так как она не была безопасной.
python
encryption
padding
pycrypto
initialization-vector
Кирилл Н.
источник
источник
/dev/urandom
на UnixОтветы:
Вот моя реализация и работает для меня с некоторыми исправлениями и улучшает выравнивание ключевой и секретной фразы с 32 байтами и iv - 16 байтами:
источник
Вам могут понадобиться следующие две функции:
pad
-unpad
заполнять (при шифровании) и - освобождать (при расшифровке), когда длина ввода не кратна BLOCK_SIZE.Так вы спрашиваете длину ключа? Вы можете использовать md5sum ключа, а не использовать его напрямую.
Более того, согласно моему небольшому опыту использования PyCrypto, IV используется для того, чтобы смешивать вывод шифрования, когда ввод одинаковый, поэтому IV выбирается в качестве случайной строки и используется как часть вывода шифрования, а затем используйте его для расшифровки сообщения.
А вот и моя реализация, надеюсь, она вам пригодится:
источник
pad
функция не работает (по крайней мере, в Py3), заменитеs[:-ord(s[len(s)-1:])]
ее, чтобы она работала между версиями.Позвольте мне ответить на ваш вопрос о «режимах». AES256 является своего рода блочным шифром . В качестве входных данных он принимает 32-байтовый ключ и 16-байтовую строку, называемую блоком, и выводит блок. Мы используем AES в режиме работы для шифрования. Приведенные выше решения предлагают использовать CBC, что является одним из примеров. Другой называется CTR, и его несколько проще использовать:
Это часто называют AES-CTR. Я бы посоветовал осторожность при использовании AES-CBC с PyCrypto . Причина в том, что для этого требуется указать схему заполнения , что подтверждается другими приведенными решениями. В общем, если вы не очень осторожны с заполнением, существуют атаки, которые полностью нарушают шифрование!
Теперь важно отметить, что ключ должен быть случайной 32-байтовой строкой ; пароль не достаточно. Обычно ключ генерируется так:
Ключ также может быть получен из пароля :
Некоторые решения выше предлагают использовать SHA256 для получения ключа, но это обычно считается плохой криптографической практикой . Проверьте Википедию для получения дополнительной информации о режимах работы.
источник
Для тех, кто хотел бы использовать urlsafe_b64encode и urlsafe_b64decode, вот версия, которая работает для меня (после того, как я потратил некоторое время на проблему с юникодом)
источник
Вы можете получить кодовую фразу из произвольного пароля, используя криптографическую хеш-функцию ( НЕ встроенную в Python
hash
), такую как SHA-1 или SHA-256. Python включает поддержку обоих в своей стандартной библиотеке:Вы можете усечь криптографическое значение хеша, просто используя
[:16]
или,[:24]
и он сохранит свою безопасность до указанной вами длины.источник
Благодарен за другие ответы, которые вдохновили, но не сработали для меня.
Потратив часы на то, чтобы выяснить, как это работает, я пришел к описанной ниже реализации с новейшей библиотекой PyCryptodomex (это еще одна история о том, как мне удалось настроить ее на прокси-сервере, в Windows, в virtualenv .. тьфу).
Работа над Ваша реализация, не забудьте записать шаги заполнения, кодирования, шифрования (и наоборот). Вы должны упаковать и распаковать, учитывая порядок.
источник
Для пользы других, вот моя реализация расшифровки, к которой я пришел, объединив ответы @Cyril и @Marcus. Это предполагает, что это приходит через HTTP-запрос с зашифрованным текстом в кавычках и в кодировке base64.
источник
Еще один взгляд на это (в значительной степени вытекает из решений выше), но
протестировано на python 2.7 и 3.6.5
источник
Я использовал
Crypto
иPyCryptodomex
библиотеку, и она быстро сверкает ...источник
Уже немного поздно, но я думаю, что это будет очень полезно. Никто не упомянул об использовании схемы, такой как заполнение PKCS # 7. Вы можете использовать его вместо предыдущих функций для заполнения (когда делаете шифрование) и unpad (когда делаете расшифровку) .i предоставит полный исходный код ниже.
источник
совместимая кодировка utf-8
источник
источник