DES算法简介
DES:Data Encryption Standard,即数据加密标准。美国国家标准局于1977年公布把它作为非机要部门使用的数据加密标准。DES是IBM公司研制的一种对称密码算法。
DES算法的地位:DES是过去主流的分组密码,但因密钥空间太小,已逐渐被AES所取代。
DES算法特点:
- 是一种对称分组加密算法。
- 分组比较短,最大64位。
- 密钥太短。DES密钥长度是56bit,从规格上来说,DES的密钥长度是64bit,但由于每隔7bit会设置一个错误检查的bit,因此实质上其密钥长度是56bit。
- 密码生命周期短。
- 运算速度较慢。
- 常见的对称加密: AES, DES, 3DES。
DES加密算法原理:
DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环,使用异或,置换,代换,移位操作四种基本运算。
3DES:
DES 的常见变体是三重 DES(3DES),使用 168 位的密钥对资料进行三次加密的一种机制;它通常(但非始终)提供极其强大的安全性。如果三个 56 位的子元素都相同,则3DES 向后兼容 DES。
利用python进行DES加密和解密
需要安装必要的库:
pip install pycrypto
python代码:
from Crypto.Cipher import DES
#加密
def des_cbc_encode(key,iv,data):
# key: 8个字节
# data: 明文数据,utf-8格式
des = DES.new(key, mode=DES.MODE_CBC, IV=iv)
# # 需要加密的数据必须是16的倍数
# # 填充规则: 缺少数据量的个数 * chr(缺少数据量个数)
pad_len = 8 - len(data) % 8
data += (pad_len * chr(pad_len)).encode("utf-8")
bs = des.encrypt(data)
print("加密结果:",bs)
#解密
def des_cbc_decode(key,iv,cipher_data):
# 解密
des = DES.new(key, mode=DES.MODE_CBC, IV=iv)
result = des.decrypt(cipher_data)
#print("解密结果(utf-8):",result)
print("解密结果:",result.decode("utf-8"))
# main
if __name__ == '__main__':
print("des encode begin");
key = b"ACD123AE"
iv = b"01020304"
#明文
data = "冬至吃饺子"
print("明文:",data);
data = data.encode("utf-8")
print("明文(utf-8):",data);
des_cbc_encode(key,iv,data) #加密
print("\n");
print("des decode begin");
#密文
cipher_data = b'\xb0\xd3\xd5L\xb4r\xca"\xb8\xd1\x00\xaa\x07D\xc4\xb3'
des_cbc_decode(key,iv,cipher_data) #解密
运行结果:
% python3 des_test.py
des encode begin
明文: 冬至吃饺子
明文(utf-8): b’\xe5\x86\xac\xe8\x87\xb3\xe5\x90\x83\xe9\xa5\xba\xe5\xad\x90’
加密结果: b’\xb0\xd3\xd5L\xb4r\xca"\xb8\xd1\x00\xaa\x07D\xc4\xb3’
des decode begin
解密结果: 冬至吃饺子