解密解密算法的分类
一、对称加密
单密码系统的加密方法中,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。密钥是控制加密及解密过程的指令。对称加密过程中,数据发送方将明文(原始数据)和加密秘钥一起经过特殊的算法处理后,使其变成复杂的加密密文发送出去。接收方收到密文后,若想解读原文,则需要使用加密密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一,发收信双方都使用这个密钥对数据进行加密和解密。
对称加密算法的优点是:
(1)、密钥公开
(2)、计算量小
(3)、加密速度快
(4)、加密效率高
缺点:密钥管理不方便
二、非对称加密
1、非对称加密算法需要两个密钥来进行加密和解密,这两个密钥都是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。
2、如果使用共有密钥进行加密,只有私有密钥才能进行解密;如果私钥对数据进行加密,那么只有对应的公钥才能进行解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫非对称加密算法。
例如:A,B 用非对称加密通信:
(1)、A 生成一对密钥(公钥和私钥)并将公钥向其他方向公开,私钥肚子严格保密。
(2)、得到该公钥的 B 使用该密钥对机密信息进行加密后在发送给 A 方。
(3)、A方再用自己保存的专用密钥(私钥)对加密后的信息进行解密。A 方只能用其专用密钥(私钥)解密由对应的公钥加密后的信息。在传输过程中,即使攻击者截获了传输的密文,并得到了 A 的公钥,也无法破解密文,应为只有 A 的私钥才能才能解密密文。
(4)、同样,如果 A 要回复加密信息给 B,那么需要B先公布B的公钥给A用于加密,B 自己保存 B 的私钥用于解密。
3、优点:密码管理的安全性好;
4、缺点:加密和解密花费时间长、速度慢,只适合少量数据进行加密。
三、散列算法
散列(Hash)函数对不同长度的输入消息,产生固定长度(比如 MD5 是16字节(128位))的输出。这个固定长度的暑促胡通常称为原输入消息的“散列”或“消息摘要”(Message digest)。一个安全的哈希函数 H 必须具有以下属性:
(1)、H 能够应用到大小不一的数据上。
(2)、H 能够生成大小固定的输出。
(3)、对于任意给定的 x,H(x) 的计算相对简单。
(4)、对于任意给定的代码 h,要发现满足 H(x) = h 的 x 在计算上时不可行的。
(5)、对于任意给定的块 x ,要发现满足 H(y) = H(x) 而 y = x 在计算上是不可行的。
(6)、要发现满足 H(X) = H(y),的(X,y)对在计算上是不可行的。
应用场景:
错误矫正,文件校验(奇偶校验,CRC,无妨篡改功能),数字签名等。
四、对称加密算法分类
1、XOR 加密
异或性质:A^0 == A,A^A == 0
A 为明文,B 为密文
加密:B = A ^key
解密:A = B ^key
C 语言实例代码:
#include<stdio.h>
#include<string.h>
// XOR 加密算法:
void secert(char *data,int len,char *key,int keylen)
{
int i;
for( i=0;i<len;i++ )
{
data[i] = data[i] ^ key[i%keylen];
}
}
int main(void)
{
char str[] = "Hello Crptology!";
int len = strlen(str);
char key[] = "12345678abcdef";
int keylen = strlen(key);
printf("加密前的数据为:%s\n",str);
secert(str,len,key,keylen);
printf("加密后的数据为:%s\n",str);
secert(str,len,key,keylen);
printf("解密后的数据为:%s\n",str);
return 0;
}
sercert() 函数既为加密函数,也是解密函数。同时也证明了 XOR 算法为对称加密算法。
2、DES、3DES加密
DES 全称为 Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法。DES 算法的入口参数有三个:Key、Data、Mode。其中 Key 为 7个字节,共 56 位,是 DES算法的工作密钥;Data为 8 个字节64 位,是要加密或被解密的数据;Mode 为 DES 的工作方式,有两种:加密或者解密。
3DES(即 Triple DES) 是 DES 向 AES 过渡的加密算法,它使用 3 条56位的密钥对数据进行三次加密。是 DES 的一个更为安全的变形。它以 DES 为基本模块,通过组合分组方法设计出分组加密算法。比起最初的 DES,3DES更为安全。
3、AES Advanced Encryption Standard
AES 高级加密标准(Advanced Encryption Standard,缩写 AES),是美国联邦政府采用的一种区块机密标准。这个标准代替原先的 DES ,已经被多方分析且广为全世界所使用,成为对称加密密钥中最流行的的算法之一。
AES 加密数据块分组必须为 128比特(16字节),密钥长度可以是 128 比特,192比特,256比特中任意一个(如果数据块及密码长度不足时,会自动补齐)。
4、Blowfish
5、twotfish
五、非对称加密算法
1、RSA 算法密钥的计算获取过程
(1)、密钥的计算过程为:首先选择两个质数p和q,令n=p*q。
令k=ϕ(n)=(p−1)(q−1),原理见4的分析
选择任意整数d,保证其与k互质
取整数e,使得[de]k=[1]k。也就是说de=kt+1,t为某一整数。
(2)、RSA加密算法原理解析
下面分析其内在的数学原理,说到RSA加密算法就不得不说到欧拉定理。
欧拉定理(Euler’s theorem)是欧拉在证明费马小定理的过程中,发现的一个适用性更广的定理。
首先定义一个函数,叫做欧拉Phi函数,即ϕ(n),其中,n是一个正整数。
ϕ(n)=总数(从1到n−1,与n互质整数)
比如5,那么1,2,3,4,都与5互质。与5互质的数有4个。ϕ(5)=4
再比如6,与1,5互质,与2,3,4并不互质。因此,ϕ(6)=2
对于一个质数p来说,它和1, 2, 3, …, p – 1都互质,所以ϕ(p)=p−1。比如ϕ(7)=6,ϕ(11)=10
欧拉定理叙述如下:
欧拉定理:如果n是一个正整数,a是任意一个非0整数,且n和a互质。那么,a^ϕ(n)−1可以被n整除。
推论1:如果m和n是互质的正整数。那么,ϕ(mn)=ϕ(m)ϕ(n)
推论2:[ab]n=[[a]n[b]n]n
证明:假设a和b除以n的余数为c1,c2。a和b可以写成a=nt1+c1,b=nt2+c2。那么,ab=n2t1t2+nt1c2+nt2c1+c1c2。因此ab除以n的余数为c1c2。即[ab]n=[a]n[b]n。
有以上定理后,由此可以推导出RSA算法的内在原理。
根据欧拉定理,对于任意z,如果z与n互质,那么:
[z^ϕ(n)]n=[z^k]n=[1]n
因此,
[z^(de)]n=[z^(kt+1)]n=[z^(kt)*z]n=[z^kt]n*[z]n= [z]n 因为[z^k]n = [1]n
上面主要使用了de=kt+1以及推论2。也就是说:
[z^(de)]n=[z]n
根据2的推论,有
([z^e]n)^d=[z]n
即d个余数相乘,因为其乘积可能大于n,所以由[ab]n=[[a]n[b]n]n,例如令a和b都为5,n为3,可知该结论
故上式可描述为[([z^e]n)^d]n=[z]n=z,就是原数字乘方求余数,然后再乘方求余数后得到原来数字的过程,得证。
公开的加密方式,私有的解密方式。RSA安全的关键在于很难对一个大的整数进行因子分解。
(3)、RSA加密算法的使用过程
同样以一个字符串来进行举例,例如要对字符串the art of programming进行加密,RSA算法会提供两个公钥e和n,其值为两个正整数,解密方持有一个私钥d,然后开始加密解密过程过程。
1. 首先根据一定的规整将字符串转换为正整数z,例如对应为0到36,转化后形成了一个整数序列。
2. 对于每个字符对应的正整数映射值z,计算其加密值M=(N^e)%n. 其中N^e表示N的e次方。
3. 解密方收到密文后开始解密,计算解密后的值为(M^d)%n,可在此得到正整数z。
4. 根据开始设定的公共转化规则,即可将z转化为对应的字符,获得明文。
(4)、RSA加密的缺点
1)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。
2)安全性,RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价,而且密码学界多数人士倾向于因子分解不是NP问题。
3)速度太慢,由于RSA 的分组长度太大,为保证安全性,n 至少也要 600 bitx以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。
2、Elgamal 算法
3、背包算法
4、Rabin 算法
5、D-H算法
6、ECC(椭圆曲线加密算法)
六、散列哈希算法
1、MD5 Message-Digest Algorithm 5
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4