Как добавить дополнение к данным, чтобы сделать его приемлемым для алгоритма шифрования AES256 в библиотеке Pycrypto - PullRequest
6 голосов
/ 21 января 2010

Может кто-нибудь сказать мне, как добавить заполнение данных, чтобы сделать его приемлемым для алгоритма шифрования AES256 в библиотеке Pycrypto (Python).

Заранее большое спасибо ..:)

Ответы [ 2 ]

5 голосов
/ 21 января 2010

Глядя на документацию , кажется, что вы, пользователь библиотеки, должны сами дополнить данные. В документации говорится, что размер блока для AES всегда составляет 16 байт, поэтому вам необходимо добавить данные, кратные 16 байтам.

Способ заполнения зависит от типа данных. Для строк лучший подход, вероятно, состоит в том, чтобы кодировать строку в определенную кодировку, а затем взять длину этой кодировки. Таким образом, вы не полагаетесь на то, что все символы представлены 8-битным кодом:

plaintext = data.encode('utf-8')
l = len(plaintext)
ciphertext = cipher.encrypt(plaintext + ((16 - len%16) * PADDING_BYTE))

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

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

Редактировать : о да, точно так же, как в RFC GregS ссылки на упоминания, стандартный способ решения проблемы длины - это использование длины заполнения в качестве байта заполнения. То есть если вам нужно 6 байтов заполнения, то байт заполнения равен 0x06. Обратите внимание, что если вам не нужно заполнять, вы должны добавить целый блок байтов заполнения (16 байтов 0xa0), чтобы вы могли правильно восстановить сообщение.

3 голосов
/ 21 января 2010

Используйте стандартную схему заполнения, такую ​​как схема, описанная в PKCS-5 , раздел 6.1.1, шаг № 4 (замените 8 в этом примере на 16, если вы используете AES).

...