加密算法
加密算法的简介
据记载,公元前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