DES
是对称性加密里面常见一种,全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法。密钥长度是64位(bit),即8个字节,超过位数密钥被忽略。所谓对称性加密,加密和解密密钥相同。对称性加密一般会按照固定长度(8个字节),把待加密字符串分成块。不足一整块可以使用特殊填充字符。常见的加密解密模式有(ECB,CBC,CTR,OFB,CFB,EAX,OPENPGP)。常见的填充模式有: 'pkcs5','pkcs7','iso10126','ansix923','zero' 类型
AES
,高级加密标准(英语:Advanced Encryption Standard,缩写:AES),是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。AES的区块长度固定为128 位,即16个字节,密钥长度则可以是128,192或256位(即16、24和32个字节)。AES分为几种模式,比如ECB,CBC,CFB等等,这些模式除了ECB由于没有使用IV(初始向量)而不太安全,其他模式差别并没有太明显。DES中IV长度固定为8个字节,AES中IV长度固定为16个字节,不同的IV加密后的字符串是不同的,加密和解密需要相同的IV。
padding填充
:以pkcs7填充为例,如果需要加密的数据的字节码长度不是块大小的整数倍就需要填充。比如数据长度是5个字节,DES就需要填充3个chr(3),即3个‘\x03’,而AES则需要填充13个chr(13)即13个‘\r’。如果数据长度是16个字节,恰好是整数倍,则分别额外填充一个块大小的数据,比如DES则需要填充8个'\x08',而AES则需要填充16个'\x10'
二、安装pycryptodome算法库
pip3 install pycryptodome
三、代码实现
DES算法
import base64
from Crypto.Cipher import DES
from Crypto.Util.Padding import pad
def encrypt(key, text, mode):
DES加密
:param key: 密钥
:param text: 待加密文本
:param mode: 模式
:return:
key = key.encode('utf-8')
text = text.encode('utf-8')
pad_text = pad(text, DES.block_size, style='pkcs7')
cipher = DES.new(key, mode)
enc_data = cipher.encrypt(pad_text)
return base64.b64encode(enc_data).decode('utf-8')
def decrypt(key, text, mode):
DES解密
:param key: 密钥
:param text: 待解密文本
:param mode: 模式
:return:
new_key = key.encode('utf-8')
new_text = base64.b64decode(text) # base64解码
cipher = DES.new(new_key, mode)
dec_data = cipher.decrypt(new_text)
print(dec_data)
return dec_data[:-dec_data[-1]].decode('utf-8') # 去除末尾填充的字符
if __name__ == "__main__":
key = '12345678'
pwd = '密码'
enc_pwd = encrypt(key, pwd, DES.MODE_ECB)
print(enc_pwd)
dec_data = decrypt(key, enc_pwd, DES.MODE_ECB)
print(dec_data)
ECB模式没有IV(初始化向量)
AES算法
# coding:utf-8
import base64
from Crypto.Cipher import AES
class AESCrypt:
def __init__(self,key,mode,iv):
self.key = key # 密钥
self.mode = mode # 模式
self.iv = iv #初始化向量
def encrpyt(self,text):
'''加密'''
num = AES.block_size - len(text) % AES.block_size #需要填充的字符个数
text_pad = (text + num*chr(num)).encode('utf-8') #填充后的字节串
crpytor = AES.new(self.key, self.mode, self.iv)
encrypt_data = crpytor.encrypt(text_pad) #对数据进行加密
return base64.b64encode(encrypt_data).decode()
def decrypt(self,text):
'''解密'''
data = base64.b64decode(text.encode())
crpytor = AES.new(self.key, self.mode, self.iv)
decrypt_data = crpytor.decrypt(data) #对数据进行解密
res = decrypt_data[:-decrypt_data[-1]].decode()#去除多余字符
return res
if __name__ == '__main__':
#key = random._urandom(16) 可以利用random模块随机生成
key = b'\xc7(\xa4rq{\x89r\xd05kH\xbf^\x8a\x16' #密钥,长度可以是16,24或32个字节
mode = AES.MODE_CBC
iv = b'-\x95)\x82\x1a\x00\xde/^:\xd3\xbeXK9\xd2' #初始化向量,固定16个字节长度
aes = AESCrypt(key,mode,iv)
text = input('请输入需要AES加密的数据:')
en_data = aes.encrpyt(text)
print('%s 经过加密得到:%s'%(text,en_data))
de_data = aes.decrypt(en_data)
print('%s 经过解密得到:%s'%(en_data,de_data))