第一种
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
|
import base64 # 密钥(key), 密斯偏移量(iv) CBC模式加密 def AES_Encrypt(key, data): vi = '0102030405060708' pad = lambda s: s + ( 16 - len (s) % 16 ) * chr ( 16 - len (s) % 16 ) data = pad(data) # 字符串补位 cipher = AES.new(key.encode( 'utf8' ), AES.MODE_CBC, vi.encode( 'utf8' )) encryptedbytes = cipher.encrypt(data.encode( 'utf8' )) # 加密后得到的是bytes类型的数据 encodestrs = base64.b64encode(encryptedbytes) # 使用Base64进行编码,返回byte字符串 enctext = encodestrs.decode( 'utf8' ) # 对byte字符串按utf-8进行解码 return enctext def AES_Decrypt(key, data): vi = '0102030405060708' data = data.encode( 'utf8' ) encodebytes = base64.decodebytes(data) # 将加密数据转换位bytes类型数据 cipher = AES.new(key.encode( 'utf8' ), AES.MODE_CBC, vi.encode( 'utf8' )) text_decrypted = cipher.decrypt(encodebytes) unpad = lambda s: s[ 0 : - s[ - 1 ]] text_decrypted = unpad(text_decrypted) # 去补位 text_decrypted = text_decrypted.decode( 'utf8' ) return text_decrypted key = '0CoJUm6Qyw8W8jud' #自己密钥 data = 'sdadsdsdsfd' #需要加密的内容 AES_Encrypt(key, data) enctext = AES_Encrypt(key, data) print (enctext) text_decrypted = AES_Decrypt(key, enctext) print (text_decrypted) |
第二种
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
43
44
45
46
47
48
49
50
51
52
53
|
#!/usr/bin/env python #encoding=‘utf-8' from Crypto.Cipher import AES from binascii import b2a_hex, a2b_hex from Crypto import Random class PrpCrypt( object ): def __init__( self , key): self .key = key.encode( 'utf-8' ) self .mode = AES.MODE_CBC self .iv = Random.new().read(AES.block_size) # 加密函数,如果text不足16位就用空格补足为16位, # 如果大于16当时不是16的倍数,那就补足为16的倍数。 def encrypt( self , text): text = text.encode( 'utf-8' ) cryptor = AES.new( self .key, self .mode, self .iv) # 这里密钥key 长度必须为16(AES-128), # 24(AES-192),或者32 (AES-256)Bytes 长度 # 目前AES-128 足够目前使用 length = 16 count = len (text) if count < length: add = (length - count) # \0 backspace # text = text + ('\0' * add) text = text + ( '\0' * add).encode( 'utf-8' ) elif count > length: add = (length - (count % length)) # text = text + ('\0' * add) text = text + ( '\0' * add).encode( 'utf-8' ) self .ciphertext = cryptor.encrypt(text) # 因为AES加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题 # 所以这里统一把加密后的字符串转化为16进制字符串 return b2a_hex( self .ciphertext) # 解密后,去掉补足的空格用strip() 去掉 def decrypt( self , text): cryptor = AES.new( self .key, self .mode, self .iv) plain_text = cryptor.decrypt(a2b_hex(text)) # return plain_text.rstrip('\0') return bytes.decode(plain_text).rstrip( '\0' ) if __name__ = = '__main__' : pc = PrpCrypt( '0CoJUm6Qyw8W8jud' ) # 初始化密钥 data = input ( "请输入待加密数据:" ) # e = pc.encrypt(data) # 加密 d = pc.decrypt(e).encode() # 解密 print ( "加密:" , e) print ( "解密:" , d) |
以上就是Python实现AES加密,解密的两种方法的详细内容,更多关于Python实现AES加密,解密的资料请关注服务器之家其它相关文章!
原文链接:https://www.cnblogs.com/aotumandaren/archive/2004/01/13/13761816.html