Шифрование данных с помощью акцентов с использованием крипто-библиотеки Python - PullRequest
0 голосов
/ 24 июня 2019

Я реализую DES3 в Python, используя библиотеку Crypto.Я проводил некоторый тест, когда наткнулся на следующую проблему:

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

Например, мой код работает нормально, когда я пытаюсь зашифровать следующее слово:

Текст для шифрования (кратно 8 в длину): "Hello Jose "

Однако произойдет сбой, если я попытаюсь зашифровать тот же текст, но содержащий акцент: зашифрованный текст (кратный длине 8) = "Hello José "

Я получаю сообщение об ошибке «ValueError: Input strings»должно быть кратно 8 ”.

Если я проверю длину слова, оно будет кратно 8.

plaintext="Hello Jose      "
print(" Plain text:" + plaintext)
print(" Plain Text length:" + str(len(plaintext)))

Результат: Обычный Длина текста: 16

Найдите следующий сокращенный пример моего кода:

from Crypto.Cipher import DES3
import binascii
import base64

plaintext="Hello Jose      "
print(" Plain text:" + plaintext)
print(" Plain Text length:" + str(len(plaintext)))

#### ENCRYPTION 
key ='173JKL3D93A9CNI1G6NP9A14'
key=bytes(key, 'utf-8')
plaintext_bytes=bytes(plaintext, 'utf-8')
print(" Plain Text length:" + str(len(plaintext_bytes)))


cipher_encrypt=DES3.new(key)
encrypted_text=cipher_encrypt.encrypt(plaintext_bytes)
print( " Encrypted word:" + str(encrypted_text))

#### DECRYPTION
cipher_encrypt=DES3.new(key)
decrypted_text=cipher_encrypt.decrypt(encrypted_text)
print(" Decripted text:" + str(decrypted_text,'utf-8') + "\n")

Может кто-нибудь помочь мне понять, почему он работает неправильно?

1 Ответ

1 голос
/ 25 июня 2019

Гойо прав. Алгоритм читает простой текст в виде байтовой строки. Зная это, длина в байтах одного символа с ударением равна 2. См. Следующий пример:

>> a='a'
>> print("length:" + str(len(a.encode('utf-8'))))
length:1
>> a='á'
>> print("length:" + str(len(a.encode('utf-8'))))
length:2

Итак, сначала вы должны закодировать текст в байтах, а затем вычислить длину.

То, что вы могли бы сделать, это вычислить следующее кратное 8, и это должна быть длина простого текста. После этого вы можете заполнить строку пробелами до этой длины.

...