1. 加密算法
加密算法基本可以分为两种:
对称加密
非对称加密
非对称加密有很高的安全性,但是和对称加密比起来,它非常的慢,所以我们还是要用对称加密来传送消息.
但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去.
- PyCrypto一个老牌的加密算法库,接口更加友好不过没有ECC算法
- pycryptodome接口类似PyCrypto的加密算法库,并非ssl这些C库的包装,所有算法都是包自己实现的.
注意这两个不兼容
他们的接口都向下面这个布局:
- Crypto.Hash 摘要算法
- Crypto.Random 随机模块
- Crypto.Cipher 对称加密算法
- Crypto.PublicKey 非对称加密
下文为最常见的对称加密和非对称加密算法的例子.本文使用pycryptodome
作为例子
2. 对称加密(Symmetric Cryptography)
对称加密是最快速最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key).对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中.
对称加密通常使用的是相对较小的密钥,一般小于256bit.因为密钥越大加密越强,但加密与解密的过程越慢.如果你只用1bit来做这个密钥,那黑客们可以先试着用0来解密,不行的话就再用1解;但如果你的密钥有1MB大,黑客们可能永远也无法破解,但加密和解密的过程要花费很长的时间.密钥的大小既要照顾到安全性也要照顾到效率,是一个trade-off.最常见的对称加密算法就是AES算法了
2.1. 对称加密的使用方法
对称加密的加密和解密过程使用相同的密钥,其使用流程大致是:
- 随机生成一个bytes类型的密钥
- 利用密钥产生一个加密器一个解密器
- 加密器调用要加密的bytes产生一个密文
- 揭秘其调用要解密的密文产生回明文bytes
2.2. 对称加密的模式
一般对称加密有如下几种模式
MODE_ECB 电码本模式(Electronic Codebook)
这种模式是将整个明文分成若干段相同的小段,然后对每一小段进行加密
优点:
- 简单;
- 有利于并行计算;
- 误差不会被传送;
缺点: 1. 不能隐藏明文的模式; 2. 可能对明文进行主动攻击;
MODE_CBC = 2 密码分组链接模式(Cipher Block Chaining)
这种模式是先将明文切分成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后再与密钥进行加密.
优点:
不容易主动攻击,安全性好于ECB,适合传输长度长的报文,是SSL、IPSec的标准.
缺点:
不利于并行计算;
- 误差传递;
- 需要初始化向量IV
MODE_CFB = 3 密码反馈模式(Cipher FeedBack)
优点: 1. 隐藏了明文模式; 2. 分组密码转化为流模式; 3. 可以及时加密传送小于分组的数据; 缺点: 1. 不利于并行计算; 2. 误差传送:一个明文单元损坏影响多个单元; 3. 唯一的IV;
MODE_OFB = 5
输出反馈模式(Output FeedBack)
优点:
- 隐藏了明文模式;
- 分组密码转化为流模式;
- 可以及时加密传送小于分组的数据;
缺点: 1. 不利于并行计算; 2. 对明文的主动攻击是可能的; 3. 误差传送:一个明文单元损坏影响多个单元;
MODE_CTR = 6 计数器模式(Counter)
计算器模式不常见,在CTR模式中有一个自增的算子,这个算子用密钥加密之后的输出和明文异或的结果得到密文,相当于一次一密.这种加密方式简单快速,安全可靠,而且可以并行加密,但是在计算器不能维持很长的情况下密钥只能使用一次.
MODE_OPENPGP = 7 OpenPGP 模式
2.2.1. AES
AES算法,即高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用.经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准.2006年高级加密标准已然成为对称密钥加密中最流行的算法之一.
AES使用两段密码,一段是任意长度的密文,一段是固定长度为16位的随机bytes,在加密和解密过程中都需要这两个密码.
from Crypto.Cipher import AES from Crypto import Random key = b'This is a key123' iv = Random.new().read(AES.block_size)#iv,AES需要block_size = 16位的随机bytes iv
b'0\x87M\x1f\x0c\xf7\x86\xb8\xab\x074\xcbG!\x8f\n'
obj = AES.new(key, AES.MODE_CBC, iv) message = b"The answer is no" ciphertext = obj.encrypt(message) ciphertext
b'\xc5]W\xbc$^7\x8a\xc4\x87Yk\x1e\xe8\x13\x9d'
obj2 = AES.new(key, AES.MODE_CBC, iv) obj2.decrypt(ciphertext)
b'The answer is no'
2.2.2. DES
DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法.1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用.随后该算法在国际上广泛流传开来.需要注意的是在某些文献中作为算法的DES称为数据加密算法(Data Encryption Algorithm,DEA)已与作为标准的DES区分开来.
from Crypto.Cipher import DES from Crypto.Util.Padding import pad, unpad key = b'abcdefgh' obj=DES.new(key, DES.MODE_ECB) message=b"Guido van Rossum is a space alien." len(message)
优点: 1. 隐藏了明文模式; 2. 分组密码转化为流模式; 3. 可以及时加密传送小于分组的数据; 缺点: 1. 不利于并行计算; 2. 误差传送:一个明文单元损坏影响多个单元; 3. 唯一的IV;
0
DES的加密数据长度必须是8的整数倍,因此需要为字符串补齐空位
优点: 1. 隐藏了明文模式; 2. 分组密码转化为流模式; 3. 可以及时加密传送小于分组的数据; 缺点: 1. 不利于并行计算; 2. 误差传送:一个明文单元损坏影响多个单元; 3. 唯一的IV;
1
优点: 1. 隐藏了明文模式; 2. 分组密码转化为流模式; 3. 可以及时加密传送小于分组的数据; 缺点: 1. 不利于并行计算; 2. 误差传送:一个明文单元损坏影响多个单元; 3. 唯一的IV;
2
优点: 1. 隐藏了明文模式; 2. 分组密码转化为流模式; 3. 可以及时加密传送小于分组的数据; 缺点: 1. 不利于并行计算; 2. 误差传送:一个明文单元损坏影响多个单元; 3. 唯一的IV;
3
优点: 1. 隐藏了明文模式; 2. 分组密码转化为流模式; 3. 可以及时加密传送小于分组的数据; 缺点: 1. 不利于并行计算; 2. 误差传送:一个明文单元损坏影响多个单元; 3. 唯一的IV;
4
3. 非对称加密
非对称加密是当今世界用的最多的一种加密形式,它使用一对秘钥而不是一个秘钥来实现加密解密,这两个秘钥是公开密钥(public key简称公钥)和私有密钥(private key,简称私钥)
公钥是公开的所有人都可以获得,而私钥则是不对外公开的.
这对秘钥有如下性质:
- 他们一一对应
- 各个秘钥对是独立的不重复的
- 从公钥推算出私钥应该是很困难或者是不可能的
他们的用法有两种
加密通信
由公钥对信息加密,私钥进行解密.简单说就是信息发送方用接收方给的公钥加密数据,接收方再用自己的私钥解密数据.
优点: 1. 隐藏了明文模式; 2. 分组密码转化为流模式; 3. 可以及时加密传送小于分组的数据; 缺点: 1. 不利于并行计算; 2. 误差传送:一个明文单元损坏影响多个单元; 3. 唯一的IV;
5信息签名
由私钥为信息签名,公钥验证签名.简单说就是发送签名方使用自己的私钥为数据签名,接收到数据的一方同时接收数据的签名,通过使用发送方分发的公钥对签名的解密然后比对信息从而确认是发送签名方签的名.
优点: 1. 隐藏了明文模式; 2. 分组密码转化为流模式; 3. 可以及时加密传送小于分组的数据; 缺点: 1. 不利于并行计算; 2. 误差传送:一个明文单元损坏影响多个单元; 3. 唯一的IV;
6
3.1. 常见的非对称加密算法
常见的非对称加密算法有两种,一种是RSA
,一种是ECC
,
非对称加密算法有两个主要用途
- 加密信息防止被人截获后知道其内容
- 为信息签名,用于认证信息未被篡改且是某个特定的人发出.
因为用途的不同,所以处理的对象也不同.
通常加密是对明文本身加密,但签名则不会对明文做签名,而是对明文的摘要信息做签名.
3.1.1. RSA
RSA算法基于一个十分简单的数论事实:
将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥.
具体的算法介绍可以看阮一峰的这篇介绍文
获得公私钥对方式
- 随机选择两个不相等的质数
p
和q
(一般是很大的质数) - 计算
p
和q
的乘积n
- 计算
n
的欧拉函数φ(n)
- 随机选择一个整数
e
,条件是,且e
与φ(n)
互质 - 计算
e
对于φ(n)
的模反元素d
- 将
n
和e
封装成公钥,n
和d
封装成私钥,实际应用中,公钥和私钥的数据都采用ASN.1格式表达,当然也有其他格式比如.
加密方式
我们的公钥有n
和e
,设要加密的消息为符号message
,下面的步骤就是加密过程:
解码,由于无论什么样的文本在计算机中都是以字节串的形式保存的,而字节实际又是二进制数,所以可以认为
message
可以转换为一个二进制数,设其符号为m
.加密就是使用公式求出
c
的值.这个的前提是m<n.
解密方式
我们解密已经有了c
,n
,d
下面的步骤就是解密过程
- 使用公式求出m
- 反向的按照message的编码方式做编码就可以得到有意义的信息明文
message
了.
签名方式
签名我们已经有私钥n
和d
- 计算消息message的消息摘要,记为
- 计算签名获得到签名信息
s
验签方式
验签使用公钥n
和e
- 比较和,如果一样就是验签成功,否则就是验签失败
3.1.2. ECC
ECC算法叫椭圆曲线算法,它及它的衍生算法都是在椭圆曲线上做文章,这种算法现在被广泛应用,忽然进入公众视野应该是因为比特币忽然大火,而其签名,验签使用的是这一种算法.
具体的原理的原理我们可以看知乎上一篇文章ECC椭圆曲线加密算法:介绍
首先我们要知道什么是椭圆曲线:
一条椭圆曲线就是一组被定义的且满足 的点集
然后我们得知道其基于一个什么样的事实:
椭圆曲线乘法很简单,除法却很难
其具体来说就是
给定
k
和G
,那么便很容易计算(K
和G
都是椭圆曲线EP(a,b)
上的点,k
小于点G
的阶n
).反之知道K
和G
,我们很难算出k
这就是一个ECC可以利用的难题.其中G
被称为基点
获得公私钥对方式:
- 随机选择一条椭圆曲线
EP(a,b)
,并随机取其中一点G
作为基点. - 随机生成一个
k
和椭圆曲线EP(a,b)
一起编码生成私钥 - 计算,和椭圆曲线
EP(a,b)
以及基点G
一起编码生成公钥
加密方式
我们的公钥有K
,G
和EP(a,b)
,设要加密的消息为符号message,下面的步骤就是加密过程:
- 解码 ,由于无论什么样的文本在计算机中都是以字节串的形式保存的,而字节实际又是二进制数,所以可以认为
message
可以转换为一个二进制数,设其符号为m
. - 加密前我们需要将
m
编码到EP(a,b)
上的一点M
(这一步叫明文嵌入,资料较少,感兴趣可以看'网络与信息安全','椭圆曲线及其在密码学中的应用'等这几本书中的相应章节),同时产生一个随机整数r
- 加密需要使用两个公式:
- 将和编码为完整密文
解密方式
我们有私钥k
和EP(a,b)
,获得到密文C
要获取到明文
- 解码密文为两段
- 即 获取信息在椭圆曲线上的对应点
- 通过嵌入找到椭圆曲线上对应点的信息
- 编码信息为明文
签名方式
签名我们已经有私钥k
和EP(a,b)
- 产生一个随机整数r,并使用明文嵌入的方式获得其在
EP(a,b)
上的点,记为R(x,y)
.x
,y
是R
点的横纵坐标 - 计算消息
message
和R
点横纵坐标x
和y
的消息摘要,记为h(message,x,y)
- 计算签名获得到签名信息s
验签方式
验签我们有公钥K
,G
和EP(a,b)
,同时要验的是h(message,x,y)
和s
计算 获得点的坐标.
计算如果则验签通过,否则验签不通过
3.1.3. 以RSA为例
下面我们介绍如何使用pycryptodome
来做非对称加密相关的操作.
生成秘钥
优点: 1. 隐藏了明文模式; 2. 分组密码转化为流模式; 3. 可以及时加密传送小于分组的数据; 缺点: 1. 不利于并行计算; 2. 误差传送:一个明文单元损坏影响多个单元; 3. 唯一的IV;
7
优点: 1. 隐藏了明文模式; 2. 分组密码转化为流模式; 3. 可以及时加密传送小于分组的数据; 缺点: 1. 不利于并行计算; 2. 误差传送:一个明文单元损坏影响多个单元; 3. 唯一的IV;
8
优点: 1. 隐藏了明文模式; 2. 分组密码转化为流模式; 3. 可以及时加密传送小于分组的数据; 缺点: 1. 不利于并行计算; 2. 误差传送:一个明文单元损坏影响多个单元; 3. 唯一的IV;
9
缺点: 1. 不利于并行计算; 2. 对明文的主动攻击是可能的; 3. 误差传送:一个明文单元损坏影响多个单元;
0
缺点: 1. 不利于并行计算; 2. 对明文的主动攻击是可能的; 3. 误差传送:一个明文单元损坏影响多个单元;
1
缺点: 1. 不利于并行计算; 2. 对明文的主动攻击是可能的; 3. 误差传送:一个明文单元损坏影响多个单元;
2
缺点: 1. 不利于并行计算; 2. 对明文的主动攻击是可能的; 3. 误差传送:一个明文单元损坏影响多个单元;
3
缺点: 1. 不利于并行计算; 2. 对明文的主动攻击是可能的; 3. 误差传送:一个明文单元损坏影响多个单元;
4
缺点: 1. 不利于并行计算; 2. 对明文的主动攻击是可能的; 3. 误差传送:一个明文单元损坏影响多个单元;
5
我们将这对钥匙保存起来
缺点: 1. 不利于并行计算; 2. 对明文的主动攻击是可能的; 3. 误差传送:一个明文单元损坏影响多个单元;
6
缺点: 1. 不利于并行计算; 2. 对明文的主动攻击是可能的; 3. 误差传送:一个明文单元损坏影响多个单元;
7
公钥加密
缺点: 1. 不利于并行计算; 2. 对明文的主动攻击是可能的; 3. 误差传送:一个明文单元损坏影响多个单元;
8
缺点: 1. 不利于并行计算; 2. 对明文的主动攻击是可能的; 3. 误差传送:一个明文单元损坏影响多个单元;
9
from Crypto.Cipher import AES from Crypto import Random key = b'This is a key123' iv = Random.new().read(AES.block_size)#iv,AES需要block_size = 16位的随机bytes iv
0
from Crypto.Cipher import AES from Crypto import Random key = b'This is a key123' iv = Random.new().read(AES.block_size)#iv,AES需要block_size = 16位的随机bytes iv
1
私钥解密
from Crypto.Cipher import AES from Crypto import Random key = b'This is a key123' iv = Random.new().read(AES.block_size)#iv,AES需要block_size = 16位的随机bytes iv
2
from Crypto.Cipher import AES from Crypto import Random key = b'This is a key123' iv = Random.new().read(AES.block_size)#iv,AES需要block_size = 16位的随机bytes iv
3
私钥签名
from Crypto.Cipher import AES from Crypto import Random key = b'This is a key123' iv = Random.new().read(AES.block_size)#iv,AES需要block_size = 16位的随机bytes iv
4
from Crypto.Cipher import AES from Crypto import Random key = b'This is a key123' iv = Random.new().read(AES.block_size)#iv,AES需要block_size = 16位的随机bytes iv
5
公钥验签
from Crypto.Cipher import AES from Crypto import Random key = b'This is a key123' iv = Random.new().read(AES.block_size)#iv,AES需要block_size = 16位的随机bytes iv
6
其他可选的工具还有:
cryptography是一个python的密码学工具,它是ssl的封装.提供了多种加密算法.
还没有评论,来说两句吧...