Как зашифровать определенный язык в Python? - PullRequest
0 голосов
/ 20 декабря 2018

Я зашифровал некоторые данные.Вот мой конвертер шифрования AES-256-CBC.

import base64
import hashlib
from Crypto import Random
from Crypto.Cipher import AES

class AESCipher(object):

   def __init__(self, key):  
       self.key = hashlib.sha256(key.encode()).digest()


   def encrypt(self, raw):
       raw = self._pad(raw)
       iv = Random.new().read(AES.block_size)
       cipher = AES.new(self.key, AES.MODE_CBC, iv)
       return base64.b64encode(iv + cipher.encrypt(raw))

    def _pad(self, s):
       return s + (AES.block_size- len(s) % AES.block_size) * chr(AES.block_size - len(s) % AES.block_size)


 key = some key
 raw='한글 (한국말)이라고도하는 한국어는 남한과 한국의 공식 언어입니다'
 AESCipher_obj=AESCipher(key)
 val = AESCipher_obj.encrypt(raw)
 print(val)

Когда я выполняю свой код, он выдает мне эту ошибку.

 > Traceback (most recent call last):   File "aes2.py", line 27, in
    > <module>
    >     s= AESCipher_obj.encrypt(raw)   File "aes2.py", line 17, in encrypt
    >     return base64.b64encode(iv + cipher.encrypt(raw))   File "/usr/local/lib/python3.5/dist-packages/Crypto/Cipher/blockalgo.py",
    > line 244, in encrypt
    >     return self._cipher.encrypt(plaintext) ValueError: Input strings must be a multiple of 16 in lengt

Мои входные данные на корейском языке, но когдаЯ пытаюсь с английским языком это работает отлично.Так как же зашифровать для конкретного языка?

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

Ваша ошибка:

ValueError: Входные строки должны быть кратны 16 в длину

AES - блочный шифр, работаетв 16-байтовых (128-битных) блоках.

Данные должны быть дополнены , пока они не станут 16 байтами.

См. этот ответ .

Надеюсь, это поможет вам!

0 голосов
/ 20 декабря 2018

Предполагая, что вы используете версию Python3, ваша строка является строкой Unicode.Вы должны закодировать его в строку байтов в кодировке utf8 перед заполнением, потому что длина изменится.Это работает для строк ascii, потому что длина закодированной строки байтов равна длине строки Unicode.

Так что в вашем коде вы должны просто сделать:

 key = some key
 raw ='한글 (한국말)이라고도하는 한국어는 남한과 한국의 공식 언어입니다'
 byte_raw = raw.encode('utf8')
 AESCipher_obj=AESCipher(key)
 val = AESCipher_obj.encrypt(byte_raw)

 print(val)

После расшифровки,Вы получите байтовую строку, которая должна быть декодирована с помощью .decode('utf8'), чтобы преобразовать ее в строку Python3 (Unicode).

0 голосов
/ 20 декабря 2018

попытаться закодировать () вашу строку в байтовую строку, может быть?а затем дополнить его.здесь вы можете увидеть https://github.com/dlitz/pycrypto/blob/master/lib/Crypto/Cipher/blockalgo.py

, что он работает с байтовой строкой вместо юникода (вы используете python3), ваш шаг верен, и я не вижу ничего плохого в механизме заполнения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...