加密算法的简介
据记载,公元前400年,古希腊人发明了置换密码。1881年世界上的第一个电话保密专利出现。在第二次世界大战期间,德
国军方启用“恩尼格玛”密码机,密码学在战争中起着非常重要的作用。随着信息化和数字化社会的发展,人们对信息安全和保密的
重要性认识不断提高,于是在1997年,美国国家标准局公布实施了“美国数据加密标准(DES)”,民间力量开始全面介入密码学
的研究和应用中,采用的加密算法有DES、RSA、SHA等。随着对加密强度需求的不断提高,近期又出现了AES、ECC等。使用
密码学可以达到以下目的:
保密性:防止用户的标识或数据被读取。
数据完整性:防止数据被更改。
身份验证:确保数据发自特定的一方。
常见的加密算法
加密算法分类:
根据密钥类型不同将现代密码技术分为两类:对称加密算法(秘密钥匙加密)和 非对称加密算法(公开密钥加密)。
对称钥匙加密系统是加密和解密均采用同一把秘密钥匙,而且通信双方都必须获得这把钥匙,并保持钥匙的秘密。
非对称密钥加密系统采用的加密钥匙(公钥)和解密钥匙(私钥)是不同的。
对称加密算法主要包含DES、3DES、AES等算法。
非对称加密算法主要包含RSA、DSA、ECC等算法
DES加密:
全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法入口参数有三个:Key、Data、Mode
Key为7个字节共56位,是DES算法的工作密钥;Data为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方
式,有两种:加密或解密
3DES(即Triple DES)是DES向AES过渡的加密算法,
使用两个密钥,执行三次DES算法,加密的过程是加密-解密-加密
解密的过程是解密-加密-解密
AES:高级加密标准(英语:Advanced Encryption Standard,缩写:AES),这个标准用来替代原先的DES
AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特 (16、24和32字节)
大致步骤如下:
1、密钥扩展(KeyExpansion),
2、初始轮(Initial Round),
3、重复轮(Rounds),每一轮又包括:SubBytes、ShiftRows、MixColumns、AddRoundKey,
4、最终轮(Final Round),最终轮没有MixColumns。
RSA:公钥加密算法,一种非对称密码算法。公钥加密,私钥解密
3个参数:rsa_n, rsa_e,message
rsa_n, rsa_e 用于生成公钥
message: 需要加密的消息
python加密库:
PyCrypto 是 Python 中密码学方面最有名的第三方软件包。可惜的是,它的开发工作于 2012 年就已停止。其他人还在继续
发布最新版本的 PyCrypto,如果你不介意使用第三方的进制包,仍可以取得 Python 3.5 的相应版本。比如,可以在 Github 上找
到了对应 Python 3.5 的 PyCrypto 二进制包。幸运的是,有一个该项目的分支 PyCrytodome 取代了 PyCrypto 。
为了在 Linux 上安装它,你可以使用以下 pip 命令:pip install pycryptodome
在 Windows 系统上安装则稍有不同:pip install pycryptodomex
面向对象实现加密解密传输:
AES:
1 from Cryptodome.Cipher import AES
2
3
4 class AesTransmission(object):
5
6 def __init__(self, key):
7 self.key = key
8 self.mode = AES.MODE_ECB
9 self.aes = AES.new(self.key, self.mode) # 生成一个AES加密模型
10
11 def encrypt(self, text):
12 while len(text) % 16 != 0:
13 text += ' '
14 return self.aes.encrypt(text.encode())
15
16 def decrypt(self, text):
17 return self.aes.decrypt(text)
18
19
20 if __name__ == '__main__':
21 aes = AesTransmission(b'123456789abxdefg')
22 txt = 'dan_123'
23 encrypt_text = aes.encrypt(txt)
24 print(encrypt_text)
25 decrypt_text = aes.decrypt(encrypt_text)
26 print(decrypt_text)
27 ########---运行结果:-------#########
28 b'\x96\x07\xa9\xb9^tT\xcc\tW\xf4\xebB\xcfA<'
29 b'dan_123 '
RSA:
1 import rsa
2 import binascii
3
4
5 class RsaTransmission(object):
6
7 def __init__(self):
8 self.pubkey, self.prikey = rsa.newkeys(1024)
9
10 def encrypt(self, text):
11 encrypt_text = rsa.encrypt(text.encode(), self.pubkey)
12 return binascii.b2a_hex(encrypt_text) # 字符串转16进制
13
14 def decrypt(self, text):
15 decrypt_text = rsa.decrypt(binascii.a2b_hex(text), self.prikey)
16 return decrypt_text
17
18
19 if __name__ == '__main__':
20 rsa_ = RsaTransmission() # 实例名不要和库名一样
21 txt = 'app123456'
22 encrypt_txt = rsa_.encrypt(txt)
23 print(encrypt_txt)
24 decrypt_txt = rsa_.decrypt(encrypt_txt)
25 print(decrypt_txt)
26 ##########-----运行结果:-----#########
27 b'0ded9053009201e7842b5d8ce9bbbf525b8ffc94d168577a4dbea0544ac3e51720cc3c4b12f43a8521279e22244fac5587cf5aa0a67af1ffdf1d323c2dcde8edd2a512d775b12ef52fb1f1a257bf611d92486c9eb0a547f61141605bf8e2952051bac9ce5407fbbaf517544296990b8f09bf16e53b2844128f584b974749edb5'
28 b'app123456'
DES加密:
1 # DES加密
2 from Cryptodome.Cipher import DES
3
4
5 def pad(txt):
6 while len(txt) % 8 != 0:
7 txt += ' '
8 return txt
9
10
11 key = b'scdsc265'
12 des = DES.new(key, DES.MODE_ECB) # 创建一个DES实例
13 text = 'dan-123'
14 encryto_test = des.encrypt(pad(text).encode()) # 进行加密
15 print(des.decrypt(encryto_test)) # 进行解密
16 #######-----运行结果:-----########
17 b'dan-123 '
BASE64编码:
1 # base64 网络当中最常见的用于传输8bit字节码的编码方式 A-Z a-z 0-9 + / 如果出现==这种一般是使用base64编码
2 import base64
3
4 s = 'dan_12345'
5 ss = base64.b64encode(s.encode()) # 编码
6 print(ss)
7 print(base64.b64decode(ss)) # 解码
8 #####-----运行结果:-----#####
9 b'ZGFuXzEyMzQ1'
10 b'dan_12345'
MD5:
1 # MD5 检测数据是否发生改变
2 import hashlib
3 s = 'dan12345'
4 m = hashlib.md5()
5 m.update(s.encode())
6 print(m.hexdigest())
7 ############-----运行结果:------############
8 52fde997e6940d0ddec1943a4383a89e