A-A+

python3 利用 pycryptodome 实现(ECB模式)对称加密 – AES(256)加密,pkcs7补全方式

2021年04月10日 23:03 汪洋大海 暂无评论 共1468字 (阅读255 views次)

公司接口有加密,然后想用Python写一下加解密的类方面后面使用,百度找了许多都没有找到合适的,后面对比了一下Java的应该是填充的值有问题,然后百度了AES的padding应该怎么填充,PKCS5的填充就是块的大小默认是16,然后需要加密的明文长度除以这个,不足的补足到16的倍数,刚好是16的倍数也要补16位,然后补足的不是空格,而是差几位补充几位的Unicode值。
比如明文长度是15,填充的是\x01
这边可以用chr(x).encode('utf-8')方法来获取需要填充的值
然后直接贴代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 如果包装不了 就按照下面2个步骤
# pip uninstall crypto pycryptodome
# pip install pycryptodome
from Crypto.Util.Padding import pad
from Crypto.Cipher import AES
import base64
 
class PrpCrypt(object):
 
    def __init__(self):
        self.unpad = lambda date: date[0:-ord(date[-1])]
 
    def aes_cipher(self, key, aes_str):
        # 使用key,选择加密方式
        aes = AES.new(key.encode('utf-8'), AES.MODE_ECB)
        pad_pkcs7 = pad(aes_str.encode('utf-8'), AES.block_size, style='pkcs7')  # 选择pkcs7补全
        encrypt_aes = aes.encrypt(pad_pkcs7)
        # 加密结果
        encrypted_text = str(base64.encodebytes(encrypt_aes), encoding='utf-8')  # 解码
        encrypted_text_str = encrypted_text.replace("\n", "")
        # 此处我的输出结果老有换行符,所以用了临时方法将它剔除
 
        return encrypted_text_str
 
    # 解密后,去掉补足的空格用strip() 去掉
    def decrypt(self, key, decrData):  # 解密函数
        res = base64.decodebytes(decrData.encode("utf8"))
        aes = AES.new(key.encode('utf-8'), AES.MODE_ECB)
        msg = aes.decrypt(res).decode("utf8")
        return self.unpad(msg)
 
 
if __name__ == '__main__':
    # key的长度需要补长(16倍数),补全方式根据情况而定,此处我就手动以‘0’的方式补全的32位key
    # key字符长度决定加密结果,长度16:加密结果AES(128),长度32:结果就是AES(256)
    key = "c72e5b90d42e406e907ceaecc7b00234"
    # # 加密字符串长同样需要16倍数:需注意,不过代码中pad()方法里,帮助实现了补全(补全方式就是pkcs7)
    aes_str = 'hello world'
    encryption_result = PrpCrypt().aes_cipher(key, aes_str)
    print('加密',encryption_result)
    c=PrpCrypt().decrypt(key,encryption_result)
    print('解密',c)

文章来源:http://www.debug5.com/detail/65/#

布施恩德可便相知重

微信扫一扫打赏

支付宝扫一扫打赏

×

给我留言