加密算法总结篇

加密算法

加密算法的简介

  据记载,公元前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
复制代码

猜你喜欢

转载自blog.csdn.net/xiaochendefendoushi/article/details/80994097