【网络安全】【密码学】常见数据加(解)密算法及Python实现(一)

发布时间:2024年01月04日

一、Base64编码

1、算法简介

Base64是一种常见的编(解)码方法,用于传输少量二进制数据。该编码方式较为简短,并不具有可读性,对敏感数据可以起到较好的保护作用。

2、Python实现(调库)

(1)Base64编码

import base64
s = "this is a string"
b64s = base64.b64encode(s.encode("utf-8"))
print(b64s)

(2)Base64解码

import base64
s2 = "dGhpcyBpcyBhIHN0cmluZw=="
b64s2 = str(base64.b64decode(s2), "utf-8")
print(b64s2)

(3)说明

语句b64s = base64.b64encode(s.encode("utf-8"))b64s2 = str(base64.b64decode(s2), "utf-8")分别进行Base64 编码和解码 操作。注意先使用 utf-8格式进行编码。上述的编、解码过程可以用下图简要表示:

在这里插入图片描述

二、数据加密标准(DES)

1、算法简介

数据加密标准(Data Encryption Standard, DES)是美国早期(2001年以前)使用最为广泛的数据加、解密算法,属于分组加密算法。DES采用64位的分组长度和56位的密钥(有意思的是,算法需要提供64位的密钥,但仅采用前56位),输出对应64位的密文。DES算法的具体实现过程较为复杂,在此不做过多叙述。

2、Python实现(调库)

(1)密钥长度设置

密钥长度必须为8byte,不能多也不能少。下图为密钥长度设置错误时的报错:

理论上的7比特(56位)密钥:

在这里插入图片描述

9比特(72位)密钥:

在这里插入图片描述

(2)DES加密

Python代码:

from Crypto.Cipher import DES  
import binascii
key = b'abcdefgh'
des = DES.new(key, DES.MODE_ECB)
text = 'this is a string'
print(len(text))
text = text + (8 - (len(text) % 8)) * '='
print(len(text))
encrypt_text = des.encrypt(text.encode())
encryptResult = binascii.b2a_hex(encrypt_text)
print(text)
print(encryptResult)

运行结果:

在这里插入图片描述

(3)DES解密

Python代码:

import binascii
key = b'abcdefgh'
des = DES.new(key, DES.MODE_ECB)
encryptResult = b'730540c787dff6be88ec1b4f05a333c2cfdc71016f18c092'
encrypto_text = binascii.a2b_hex(encryptResult)
decryptResult = des.decrypt(encrypto_text)
print(decryptResult)
print(len(encryptResult))

运行结果:

在这里插入图片描述

(4)说明

语句text = text + (8 - (len(text) % 8)) * '='的作用是使用 “=” 将明文填充为64bit(即8byte)的整数倍。上述的加、解密过程可以用下图简要表示:

在这里插入图片描述

三、高级加密标准(AES)

1、算法简介

高级加密标准(Advanced Encryption Standard, AES)是一种对称分组密码(明、密文分组长度为128位16字节)算法,于2001年被提出,取代了数据加密标准(上文中的DES)成为最广泛的数据加(解)密算法之一。AES算法的具体过程较为复杂,在此不做赘述。

2、Python实现(调库)

(1)密钥长度设置

AES的密钥长度可以为 128192256 (bits),即 162432 (bytes). 本文中,使用简短的16 bytes 密钥。

(2)AES加密

Python代码:

from Crypto.Cipher import AES
import binascii
key = b'abcdefghabcdefgh'
print(len(key))
text = "this is a string"
print(len(text))
text = text + (16 - (len(text) % 16)) * '='
print(len(text))
aes = AES.new(key, AES.MODE_ECB)
encrypto_text = aes.encrypt(text.encode())
encryptResult = binascii.b2a_hex(encrypto_text)
print(text)
print(encryptResult)
print(len(encryptResult))

运行结果:

在这里插入图片描述

(3)AES解密

Python代码:

from Crypto.Cipher import AES
import binascii
key = b'abcdefghabcdefgh'
encryptResult = b'56eebd2bcb700df0e89aadc2a1a2f3392c8d860b9688361b9e9ceff6272f581c'
aes = AES.new(key, AES.MODE_ECB)
encrypto_text = binascii.a2b_hex(encryptResult)
decryptResult = aes.decrypt(encrypto_text)
print(decryptResult)

运行结果:

在这里插入图片描述
(4)说明

语句text = text + (16 - (len(text) % 16)) * '='的作用是使用 “=” 将明文填充为128bit(即16byte)的整数倍。上述的加、解密过程可以用下图简要表示:

在这里插入图片描述

四、讯息摘要算法(MD-5)

1、算法简介

严格意义上讲,MD系列算法属于消息摘要(哈希,Hashing)算法,只有“加密”过程而没有“解密”逆过程。MD-5算法将任意的字符串(消息)转化为固定长度(64位,8字节)的哈希段,用于检验消息(在传输过程中)的完整性(Integrity, I性)。

2、Python实现(调库)

Python代码:

from hashlib import md5


def encrypt_md5(s):
    new_md5 = md5()
    new_md5.update(s.encode(encoding='utf-8'))
    print(len(new_md5.hexdigest()))
    return new_md5.hexdigest()


if __name__ == '__main__':
    print(encrypt_md5('this is a string'))

运行结果:

在这里插入图片描述

图示:

在这里插入图片描述

五、参考文献

1、《密码编码学与网络安全——原理与实践(第七版)》(Cryptography and Network Security, Principles and Practice, Seventh Edition),【美】威廉 斯托林斯 William Stallings 著,王后珍等 译,北京,电子工业出版社,2017年12月。

2、《Python安全攻防——渗透测试实战指南》(Attack and Defense with Python, A Practical Guide to Penetration Testing),MS08067安全实验室 编著,北京,机械工业出版社,2021年10月。

文章来源:https://blog.csdn.net/weixin_43031313/article/details/135379603
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。