先上一个AES加密的备用,之后再把对称非对称好好的总结一下.
from Crypto.Cipher import AESimport base64,timefrom Crypto import Random# key = Random.new().read(32)#返回32位bytes# print(key)”’学习python crypto加密模式”’#先定义函数补足字符串长度为16的倍数def add16(s):”’字符串不是16的倍数就自动补0”’while len(s.encode())%16 !=0:s+=’\0′#将结果以bytes类型返回return s.encode(‘utf8’)block_size = AES.block_sizedef pad(plain_text):“””解密时候需要用到此函数func to pad cleartext to be multiples of 8-byte blocks.If you want to encrypt a text message that is not multiples of 8-byte blocks,the text message must be padded with additional bytes to make the text message to be multiples of 8-byte blocks.“””number_of_bytes_to_pad = block_size – len(plain_text) % block_sizeascii_string = chr(number_of_bytes_to_pad)padding_str = number_of_bytes_to_pad * ascii_stringpadded_plain_text = plain_text + padding_strreturn padded_plain_textkey = ‘123456789trinity’ #密钥,可以16,24,32位# key = ‘facd81g656fcd8p7a7lkh6dfa81gf4ik’ #密钥,可以16,24,32位iv=’123456789trinity’ #偏移量16位是aes-128 24是192 32是256# iv=”\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000″t=time.time()aes=AES.new(key.encode(“utf8”), AES.MODE_CBC,iv.encode(“utf8”))#初始化加密器aes2=AES.new(key.encode(“utf8”), AES.MODE_CBC,iv.encode(“utf8”))#初始化解密器# text=text#将要操作的文本自动对齐text=”我” #测试文本,注意不支持中文!!!!!字符串钥匙16的倍数,不是就要填充print(text)print(text.encode(‘utf8’))print(“加密后:”)res=aes.encrypt(add16(text))#字符不够16后面加\0res=str(base64.encodebytes(res),encoding=’utf-8′)#将加密的二进制数据转换为base64然后转为字符串print(res)# jiemi=”kl6mFwzxu6wKOMKFKxHsc14v7sggGfhEtV70NjLpg4lAl+927Bso/5tJyi0a7X/1″jiemi=resprint(“解密后:”)jstr=aes2.decrypt(base64.decodebytes(jiemi.encode()))print(str(jstr,encoding=’utf8′))
上面注意中文加密解密需要len(s.encode())否则中文就不能解密,这是一个坑
加密要先初始化一个aes对象
aes=AES.knew(key.encode(),AES.MODE_CBC,iv.encode())
加密的原理就是将明文以16的倍数补齐,不足16补\0,然后用调用aes.encrypt(明文补齐16)来生成一个字节串,此时不能直接转换字符串会报错,需要使用base64.encodebytes(加密字节串)来生成可读的编码,然后在str(可读编码)就是一个正常加密过的一个密文了.
解密的原理相反,先将密文字符串编码为bytes,然后用base64.decodebytes(密文.encode())进行解码为不可读的字节串,然后在调用aes.decrypt(不可读字节串)进行解密为一个byte,然后用str函数转换为字符串就是明文了.
转载请注明:稻香的博客 » 对称加密和非对称加密