简单了解:
AES是一个对称加密算法
对称加密算法:
对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yao)一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。
开始应用:
1、AES加密方式有五种:
1)、ECB
2)、CBC
3)、CTR
4)、CFB,
5)、OFB
python 在 Windows下使用AES时要安装的是pycryptodome 模块 pip install pycryptodome
python 在 Linux下使用AES时要安装的是pycrypto模块 pip install pycrypto
2、CBC加密需要一个十六位的key(密钥)和一个十六位iv(偏移量)
ECB加密不需要iv
3、秘钥的要求:使用的密钥。它必须是16、24或32字节长(分别用于AES-128,AES-192或AES-256*)
加密内容要满足秘钥字节的倍数,不够要用空格填充
pad = lambda s: (s + (16 - len(s) % 16) * chr(16 - len(s) % 16)) -- 填充函数
unpad = lambda s: s[0:-s[-1]] -- 逆填充函数
代码示例
class MobileEncryption:
"""手机号加解密"""
def __init__(self, data):
self.data = data
self.__key = 'SPECIAL_TEST_AES'
def encrypt(self):
"""加密"""
pad = lambda s: (s + (16 - len(s) % 16) * chr(16 - len(s) % 16)) # 填充函数,不够的补位数
raw = pad(str(self.data)) # 拿到补位后的数据
cipher = AES.new(self.__key.encode(), AES.MODE_ECB) # 加密模式 选择用ECB加密,是一个对象
encrypted_text = cipher.encrypt(bytes(raw, encoding='utf8')) # 开始加密,编码格式是utf8
encrypted_text_base64 = base64.b64encode(encrypted_text) # 进行编码为二进制,结果是二进制 b'xxxxxx'
result = binascii.hexlify(encrypted_text_base64).decode('utf8').upper().strip() #进行编码转换,表示为二进制数据的十六进制
return result
def decrypt(self):
"""解密"""
data = binascii.unhexlify(self.data) # 十六进制进行解码转换
# print(data) # b'xxxxx'
encodebytes = base64.decodebytes(data) # 可以将二进制转化为正常形式
cipher = AES.new(self.__key.encode('utf8'), AES.MODE_ECB) # 解密模式,是一个对象
text_decrypted = cipher.decrypt(encodebytes) # 开始解密
unpad = lambda s: s[0:-s[-1]] # 逆填充函数,去掉空格
text_decrypted = unpad(text_decrypted) # 拿到去掉补位后的数据
text_decrypted = text_decrypted.decode('utf8') #解码字符串以utf8
return text_decrypted