AES是一个分组密码,属于对称密码范畴,AES算法的模块在对称密码领域特别是分组密码领域常有使用。
算法流程
AES加密算法涉及4种操作:
- 字节替代(SubBytes):字节代替的主要功能是通过S盒完成一个字节到另外一个字节的映射。
- 行移位(ShiftRows):行移位是一个4x4的矩阵内部字节之间的置换,用于提供算法的扩散性。
- 列混淆(MixColumns):利用GF(28)域上算术特性的一个代替,同样用于提供算法的扩散性。
- 轮密钥加(AddRoundKey):加密过程中,每轮的输入与轮子密钥异或一次(解密时再异或上该轮的轮子密钥即可恢复)
加解密中每轮的密钥分别由种子密钥经过密钥扩展算法得到。算法中16字节的明文、密文和轮子密钥都以一个4x4的矩阵表示。
整体算法流程如下:
详细算法流程请参考:
http://www.cnblogs.com/luop/p/4334160.html
python2.7实现
#coding=utf-8
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
class MyCrypto():
def __init__(self, key):
self.key_len = len(key)
if not self.key_len == 16 and not self.key_len == 24 and not self.key_len == 32:
raise Exception("秘钥长度不对,请重新检查秘钥长度")
self.key = key
self.mode = AES.MODE_CBC
def encrypt(self, text):
'''''
被加密的明文长度必须是key长度的整数倍,如果不够,则用\0进行填充
转成16进制字符串,是因为避免不可见的ascii在显示的时候捣乱
'''
cryptor = AES.new(self.key, self.mode, self.key)
count = len(text)
add = self.key_len - (count % self.key_len)
text = text + ('\0' * add)
self.ciphertext = cryptor.encrypt(text)
return b2a_hex(self.ciphertext)
def decrypt(self, text):
'''''
解密后需注意,加密时有可能填充\0,因此要去掉右侧的\0
'''
cryptor = AES.new(self.key, self.mode, self.key)
plain_text = cryptor.decrypt(a2b_hex(text))
return plain_text.rstrip('\0')
#if __name__ == '__main__':
paint_txt=raw_input("请输入明文:");
key=raw_input("请输入秘钥:");
key_len=len(key)
if not key_len == 16 and not key_len == 24 and not key_len == 32:
raise Exception("秘钥长度不对,请重新检查秘钥长度")
mc = MyCrypto(key)
e = mc.encrypt(paint_txt)
d = mc.decrypt(e)
print "加密后是:%s ; 解密后是:%s "%(e ,d)