第一种
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