AES加密的Python实现
2017-12-06 本文已影响50人
码农小杨
AES加密原理见文章尾部推荐博客
具体代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Crypto.Cipher import AES
import base64
import hashlib
PADDING = '\0'
# 去除填充
def _unpadding(str):
l = len(str)
if l == 0 :
return str
asc = ord(str[-1])
if asc >= 16:
return str
return str[0:-asc]
# 填充
def _padding(data):
length = 16 - (len(data.encode('utf-8')) % 16)
data += chr(length)*length
return data
def _cipher(key):
iv = '0123456789ABCDEF'
m2 = hashlib.md5()
m2.update(key.encode('utf-8'))
return AES.new(key=m2.digest(), mode=AES.MODE_CBC, IV=iv)
class EncryptHelper:
def __init__(self):
pass
@staticmethod
def encrypt(plain_text, key):
data=_cipher(key).encrypt(_padding(plain_text))
return str(base64.b64encode(data),'utf-8')
@staticmethod
def decrypt(encrypted_text, key):
data = base64.b64decode(encrypted_text)
bytes= _cipher(key).decrypt(data)
blank=str(bytes,'utf-8').strip()
return _unpadding(blank)
这里有两个函数解释一下:
chr()函数用一个范围在range(256)内的(就是0~255)整数作参数,返回一个对应的字符。
ord()函数以一个字符(长度为1的字符串)作为参数,返回对应的ASCII数值,或者Unicode数值。
如果所给的Unicode字符超出了你的Python定义范围,则会引发一个TypeError的异常。
关于AES加密推荐博客:
首推博客文章(详细介绍了AES的加密原理):
http://www.dannysite.com/blog/213/
一篇较新的博客:
http://www.xnathan.com/2017/04/23/aes-encryption/
参考博客:
http://blog.csdn.net/leak235/article/details/50466213
AES加密原理图:
http://www.cnblogs.com/happyhippy/archive/2006/12/23/601353.html
如何AES使用Python / PyCrypto以OpenSSL兼容的方式加密:
https://codeday.me/bug/20170910/69468.html