#python #char #aes
#python #символ #aes
Вопрос:
У меня есть входная строка, и я шифрую ее с помощью 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 encrypt вместо MySQL AES_ENCRYPT, конечный символ будет равен 0x00. Я использую стороннюю библиотеку python AES.
Комментарии:
1. попробуйте зашифровать / расшифровать, используя ваш ключ с помощью
m2secret
( pip install m2secret )2. Я бы посоветовал не использовать библиотеку, в которой говорится, что я недавно заинтересовался Python и мне нужен проект «для начинающих», чтобы ознакомиться с основами языка. в целях криптографии.
Ответ №1:
Причина вашего наблюдения в том, что AES — это блочный шифр, который может шифровать данные только блоками по 128 бит (= 16 байт). Для этого обычно используется режим работы (позволяющий шифровать большие фрагменты данных) и режим заполнения. Похоже, что ваша функция расшифровки python выполняет расшифровку, но не отменяет заполнение, давая вам этот результат.
Вы используете заполнение PKCS # 5, которое добавляет количество байтов (по крайней мере, один), все с тем же значением, что и это число, поэтому конечная длина кратна длине блока.
- К вашей 8-байтовой строке нужно добавить 8 байт, каждый со значением 8. ASCII 8 — это символ пробела, который в вашем терминале перемещает курсор на единицу влево (8 раз), что приводит к
xxx
надпечаткеabc
. - К вашей 7-байтовой строке нужно добавить 9 байт, каждый из которых имеет значение 9. Это горизонтальный табулятор, благодаря которому ваш
xxx
отображается совершенно справа.
Либо выясните, как задать правильный режим заполнения для вашей функции дешифрования (у нее должна быть такая опция), либо удалите заполнение самостоятельно: проверьте последний байт decrypt_string , преобразуйте в число (используя его значение ASCII) и возьмите столько байтов с конца decrypt_string
. Вы также должны проверить, что все они имеют одинаковое значение. (Вы должны сделать это сначала, прежде чем интерпретировать выходные данные как строку, то есть применять кодировку, такую как UTF-8 или ASCII.)