社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

如何在python中加密特定语言?

Harshit Trivedi • 5 年前 • 1641 次点击  

我已经加密了一些数据。这里我的加密转换器是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

我的输入数据是韩语,但当我尝试使用英语时,它工作得很好。那么如何为特定语言加密呢?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/40538
 
1641 次点击  
文章 [ 3 ]  |  最新文章 5 年前
Sumanto Dinar
Reply   •   1 楼
Sumanto Dinar    6 年前

试着把你的字符串编码成字节字符串?然后填充它。 你可以在这里看到 https://github.com/dlitz/pycrypto/blob/master/lib/Crypto/Cipher/blockalgo.py

它使用的是bytestring而不是unicode(您使用的是python3) 你的步骤是正确的,我看填充机制没有问题

Moshe Slavin
Reply   •   2 楼
Moshe Slavin    6 年前

你的错误:

值错误:输入字符串的长度必须是16的倍数

AES 是块密码,它在16字节(128位)块上工作。

数据需要 padded 直到16字节。

看到这个 answer .

希望这对你有帮助!

Serge Ballesta
Reply   •   3 楼
Serge Ballesta    6 年前

假设您使用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)字符串。