加密
- RSA
- MD5
- SHA-1
- DES
- 3DES
RSA
RSA是一种非对称加密算法(公钥加密,私钥解密)。对极大数因数分解的难度决定RSA算法的可靠性。换句话说对RSA因数分解难度越大,也就证明RSA算法越可靠。假设有人找到了一种快速分解因数的算法,那么RSA加密算法的可靠性就会急速下降
什么是质数?
质数就是素数,除了1和他本身外,没有其他约数。
什么是互质关系?
如果,两个数除了1之外没有其他公因数,那么这两个数的关系就为互质关系,比如21和8就为互质关系。
欧拉函数
假设给定任意正整数n,那么在小于等于n的正整数之中有多少个与n构成互质关系:
欧拉函数公式:φ(n)=φ(p)φ(q)=(p-1)(q-1),pq互质关系。
模反元素
如果,两个整数 e,r互质,那么一定可以找到一个整数d使得,ed-1被r整除。那么d就叫做e的"模反元素"。
公钥与私钥的产生
假设 A 想通过一个不可靠的媒体向B发送一条消息,那么A可以用以下方式来产生消息:
- 随意选择两个足够大的质数p和q且 p!=q,计算N = pq。
- 根据欧拉函数,求的 r = φ(N) = φ(p)φ(q) = (p-1)(q-1)。
- 选择一个小于r的整数e,且与r互为质数,算出e关于r的"模反元素"d
- 将p,q的记录销毁
这样就得到了数对公钥(N,e),私钥(N,d)。
加密消息
假设A已经产生了公钥(N,e),现在B想给A发送一个消息m,B已经知道了A的公钥(N,e),B首先会对消息m按照他们事先约定好的格式把消息m转换为一个小于N且与N互质的整数n。比如,B可以将要发送的每一个字转换为这个字的unicode,然后把这些数字连在一起组成一个数字。假设他的消息非常长的话,就可以把这个消息转换为几段,然后对每一段转换为n。然后在利用公钥加密成结果 c ,在发送给A。
解密消息
如果想要得到私钥,那么 N 是已经知道的,只需要知道d
- 由加密步骤可 ed-1 = r ,既 d = (r+1)/e
- e由公钥可得,那么只要推导出 r 即可
- 计算 r 有两种方式,第一计算所有小于等于n的正整数有多少个与n互为质数的,也就是因式分解。第二种是算出 qp,也就是对N因式分解。
所以说,如果找到可以快速因式分解的算法RSA的可靠性将大幅度下降。
A得到B发送过来的消息,就可以用A的秘钥来解码。
签名消息
RSA也可以为一个消息署名,这样做的目的是什么?验证私钥加密的消息在传输过程中,有没有被篡改。但是,并不能保证消息的私密性,因为公钥的公开的。假设A想给B发送一个署名消息的话,那么他可以为他的消息计算一个散列值,然后用他的私钥加密这个散列值,并把这个"署名"放在消息的后面,这个消息只有用他的公钥才能解密。B得到A发送过来的消息时,B可以用公钥解密这个散列值,然后对消息在计算一个自己的散列值,两个散列值比较,来查看消息有没有被篡改,并且知道持有私钥的是不是A本人。
速度
比如DES和其它对称算法来说,RSA要慢很多。实际上B一般使用一种对称加密算法来加密他的信息,然后用RSA来加密比较短的对称密码,然后将用RSA加密的对称密码和用对称算法加密的消息发送给A.
MD5
什么是消息摘要算法?
消息摘要算法的主要特征是加密过程不需要密钥,并且加密过的数据无法被解密,只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文。消息摘要算法不存在密钥的管理与分发问题。
MD5 算法流程
(1)补位
MD5算法是对输入的数据进行补位,使得如果数据位长度LEN对512求余的结果是448。即数据扩展至K512+448位。即K64+56个字节,K为整数。补位操作始终要进行,即使数据长度LEN对512求余的结果已是448。
具体的补位操作:补一个1,然后补0至满足要求。总共最少要补一位,最多补512位。
(2)补数据长度
用一个64位的数字表示数据的原始长度b,把b用两个32位数表示。当遇到b大于 2^64这种极少遇到的情况时,那么只取B的低64位。这时,数据就被填充成长度为512位的倍数。也就是说,此时的数据长度是16个字(32位)的整数倍数。用M[0...N-1]表示此时的数据,其中的N是16的倍数。
填充的方法如下:
- 在信息的后面填充一个1和无数个0,直到满足上面的条件才停止用0对信息的填充。
- 在这个结果后面附加一个以64位二进制表示的填充前信息长度(单位为Bit),如果二进制表示的填充前长度超过64位,则取低64位。
- 经过这两步的处理,信息的位长 = N512 + 448 + 64 = (N + 1) 512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。
(3)初始化MD缓冲器
用一个四个字的缓冲器(A,B,C,D)来计算报文摘要,A,B,C,D分别是32位的寄存器,初始化使用的是十六进制表示的数字
A = 0X01234567
B = 0X89abcdef
C = 0Xfedcba98
D = 0X76543210
(4)处理位操作函数
假设处理后的原文长度是M
主循环次数 = M / 512
每个主循环中包含 512 / 32 * 4 = 64 次子循环。
上面这种图就是单次子循环的流程。
- 首先定义4个辅助函数,每个函数的输入是三个32位的字,输出是一个32位的字。
X,Y,Z为32位整数
F(X, Y, Z) =(X&Y) | ((~X) & Z)
G(X, Y, Z) =(X&Z) | (Y & (~Z))
H(X, Y, Z) =XYZ
I(X, Y, Z)=Y^(X|(~Z))
生成4个32位数据,最后联合起来成为一个128bit散列。基本方式为,求余,取余,调整长度,与链接变量进行循环运算,得出结果。
在主循环下面64次子循环中,F,G,H,I交替使用,第一个16次使用F,第二个16次使用G,第三个16次使用H,第四个16次使用I。 - 红色的田字,代表相加的意思。
- Mi是第一步处理后的原文。在第一步中,处理后原文的长度是512的整数倍。把原文的每512位在分成16等份,命名为M0 ~ M15,每一等份长度32。在64次子循环中,每16次循环,都会交替用到M1~M16之一。
- Ki 一个常量,在64次子循环当中,每一次用到的常量都是不同的。
- 黄色的 <<< S
左移S位,S的值也是常量。
现定义:
FF(a ,b ,c ,d ,Mj ,s ,ti ) 操作为 a = b + ( (a + F(b,c,d) + Mj + ti) << s)
GG(a ,b ,c ,d ,Mj ,s ,ti )操作为 a = b + ( (a + G(b,c,d) + Mj + ti) << s)
HH(a ,b ,c ,d ,Mj ,s ,ti)操作为 a = b + ( (a + H(b,c,d) + Mj + ti) << s)
II(a ,b ,c ,d ,Mj ,s ,ti)操作为 a = b + ( (a + I(b,c,d) + Mj + ti) << s)
注意:“<<”表示循环左移位,不是左移位。
总结:总结下MD5的整个流程是,拿原文总长度对 512求余,如果不是448,进行填充。使得补位的结果除以 512余448。然后,在补数据长度,把剩下的64位,放上原文的数据长度。下面开始循环加工操作,有多少次主循环,数据原文长度/512 次主循环。每个主循环下面有64次子循环。64次子循环划分4个分组,每一次操作对a,b,c,d中的其中三个作一次非线性函数运算,定义4个辅助函数 F,G,H,I,每16次子循环更换一个辅助函数,依次轮流。即FF(a ,b ,c ,d ,Mj ,s ,ti ) 操作为 a = b + ( (a + F(b,c,d) + Mj + ti) << s)。Mj是处理后的原文长度等分成16份,放在16个数组当中。每16次循环都会使用。把循环最终产生的 A,B,C,D拼接在一起,就是所求的MD5。
SHA-1
SHA-1和MD5一样属于一种,消息摘要算法,不可逆。同样也是MD4的基础上扩展的。SHA-1目前已经不够安全。
生成SHA-1摘要算法流程
(1)填充
输入 SHA-1的消息长度应大于0比特小于2^64比特。当然和MD5前步骤处理流程相同,首先对数据求余填充至448位,第一位补1后面补0,留下64位,不过有点区别是,SHA-1,是在最后一个分组后面保存原始消息的长度。
(2)计算W0~W79
完成填充之后,我们以512为一个单位进行下面的处理。这一步要对每个单位计算80个32比特的值(W0~W79),这80个值单步处理中。首先,将输入分组的512比特分成32bit * 16,并将它命名为W0 ~ W15。然后,剩下的W16~W79的计算方法如下,以 W16为例:
分组处理
接下来我们根据输入分组进行80个步骤的处理,目的是根据输入分组的信息来改变内部状态(160比特)。对所有的输入分组都要执行这一操作。(上面提到的输入分组,就是512bit单位)
160比特的内部状态是通过名为A,B,C,D,E的5个32比特的缓冲区来表示的。这些缓冲区和刚才提到的W0 ~ W79是不同的概念。上图中是将5个缓冲区的值与输入分组的信息进行混合,然后在执行80个步骤的处理。所有处理结束之后最终的内部状态(160比特)。
DES
DES是一种对称加密算法,密钥加密,密钥解密。由于DES加密密钥实际可用为56比特,过短可以实际通过暴力来破解。因此,除了用它来解密以前的密文以外,现在我们不应该在使用DES了。
DES 实现流程
DES 只能加密64比特的数据,如果要加密的明文比较长,就需要对DES加密进行迭代(反复),而迭代的具体方式就称为模式(mode)。DES是一种16轮循环的Feistel网络。
具体的步骤是:
- 将输入的数据等分为两部分
- 将输入的右侧直接发送到输出的右侧
- 将输入的右侧发送到轮函数
- 将函数根据右侧数据和子密钥,计算出一串看上去是随机的比特序列
- 将上一步得到的比特序列与左侧数据进行XOR运算,并将结果作为加密后的左侧
这样以来右侧根本就没有加密,因为我们需要用不同的子密钥对一轮的处理重复若干次,并在每两轮处理之间将左侧和右侧的数据对调。对调只在两轮之间进行,最后一轮结束之后不需要对调。
3DES
三重DES是为了增加DES的强度,将DES重复3次所得到的一种密码算法,通常缩写为3DES。3DES被认为是十分安全的,虽然它的速度较慢。
密钥1,密钥2,密钥3全部使用不同的比特序列的三重DES称为3DES。