Python AES дешифрует конец строки с другим символом - PullRequest
1 голос
/ 12 ноября 2011

У меня есть строка ввода, и я шифрую ее с помощью MySQL AES_ENCRYPT, а затем дешифрую с помощью python (не mysql AES_DECRYPT) Я распечатал некоторые тесты дешифрованной строки:

print decrypt_string
print "%sxxx" % decrypt_string
print len(decrypt_string)
print self.toHex(decrypt_string)

Когда длина входной строки равна 8, то есть abcdefgh, результат теста будет:

abcdefgh
xxxdefgh
16
0x610x620x630x640x650x660x670x680x80x80x80x80x80x80x80x8

Если длина входной строки равна 7, то есть abcdefg:

abcdefg                                 
abcdefg                                 xxx
16
0x610x620x630x640x650x660x670x90x90x90x90x90x90x90x90x9

Я обнаружил, что конечный символ постепенно уменьшается, а длина входной строки увеличивается. Почему есть разница? Если я использую шифрование PHP AES вместо MySQL AES_ENCRYPT, конечный символ будет 0x00. Я использую использовать стороннюю python AES lib .

1 Ответ

1 голос
/ 12 ноября 2011

Причина вашего наблюдения заключается в том, что AES является блочным шифром, который может шифровать данные только в блоках по 128 бит (= 16 байтов).Для этого он обычно используется с режимом работы (для шифрования больших фрагментов данных) и режимом заполнения.Похоже, что ваша функция дешифрования на python выполняет дешифрование, но не отменяет заполнение, давая вам такой результат.

Вы используете заполнение PKCS # 5, которое добавит количество байтов (по крайней мере, один), все то же значение, что и это число, поэтому конечная длина кратна длине блока.

  • Для вашей 8-байтовой строки необходимо добавить 8 байтов, каждое из которых равно значению 8ASCII 8 - это символ возврата на одну позицию, который в вашем терминале перемещает курсор на один влево (8 раз), в результате чего xxx печатает abc.
  • . Для вашей 7-байтовой строки одиннеобходимо добавить 9 байтов, каждое из значений 9. Это горизонтальный табулятор, заставляющий ваш xxx показываться совсем справа.

Либо узнайте, как задать правильный режим заполнения для вашего дешифрованияфункции (она должна иметь такую ​​опцию), или удалите заполнение самостоятельно: проверьте последний байт decrypt_string, преобразуйте в число (используя его значение ASCII) и возьмите столько байтов изконец decrypt_string.Вы также должны проверить, что все они имеют одинаковое значение.(Вы должны сделать это сначала, прежде чем интерпретировать вывод как строку, то есть применить кодировку, например UTF-8 или ASCII.)

...