赞
踩
自从人类有了战争,就有了密码。历史上的战争,特别是两次世界大战对于保密学的理论技术的发展起了巨大的推动作用。
明文通过加密算法和密钥得到了密文,此密钥称为加密密钥,密文到达对方手里,通过解密密钥和解密算法对密文进行变化,还原出明文。
加密和解密算法的操作通常都是在一组密钥的控制下进行的,分别称为加密密钥(Encryption Key) 和解密密钥(Decryption Key).
对称密码算法:加密算法等同于解密算法,加密密钥与解密密钥也相同。也就是说上图中间划一条线,两边对称且对应相等。
注:在不同的算法中,加密算法和解密算法可能不一样,加密密钥和解密密钥也有可能不一样。
置换密码(transposition cipher)则是按照某一规则重新排列消息中的比特或字符顺序。
根据英文字母在 26 个字母中的先后顺序,我们可以得出密钥中的每一个字母的相对先后顺序。因为密钥中没有 A 和 B,因此 C 为第 1。同理,E 为第 2,H 为第 3,……,R 为第 6。于是得出密钥字母的相对先后顺序为 145326。
先读顺序为 1 的明文列,即 aba
.
再读顺序为 2 的明文列,即 cnu
最后读顺序为 6 的明文列,即 ksr
因此密文就是:abacnuaiotettgfksr
收到的密文:abacnuaiotettgfksr
先写下第 1 列密文 aba
再写下第 2 列密文 cnu
最后写下第 6 列密文 ksr
最后按行读出明文。
这里加密(从行读入列输出)和解密(按列读入行输出)有所不同。
提示:
置换密码算法不太好,原因是字母在字母表的顺序是相同的容易造成,不同的密钥能用相同的字母顺序解开。
对称密码算法(symmetric cipher):又称传统密码算法(conventional cipher),就是加密密钥和解密密钥相同,或实质上等同,即从一个易于推出另一个。又称秘密密钥算法或单密钥算法
。
加密和解密使用相同的密钥
密钥必须使用秘密的信道分配
在对称密码算法中,密钥的安全传递决定了对称密码算法的安全性!
DES作为第一个广泛应用的加密标准,是一种最有代表性的对称分组密码算法。详细研究这一算法的基本原理对于掌握对称分组密码理论很有意义。
一轮迭代:S-盒是一个表,只供商用查询。
S-盒 置换:
子密钥生成:
DES在商用应用广泛,但却能在很快的时间被破解,由于涉及商用,硬件条件不能变换太频繁,因此急需补救措施。
用两个密钥:用DES加密一次,用K2解密,再用K1加密。
延长密钥到64*2=128
位
C=EK1</sub>(DK2(EK1(P)))
P=DK1(EK2(DK1(C)))
用三个密钥:用K1加密一次,用K2解密,再用K3加密。
延长密钥到64*3=192
位
C=EK3(DK2(EK1(P)))
P=DK1(EK2(DK3(C)))
注:
轮密钥加操作就是将轮密钥与明文(状态)按比特异或。轮密钥通过密钥扩展得到,初始密钥与初始明文均是用户自己设置。简单来说,密钥加操作就是逐字节相加,有限域GF(28)上的加法是模2加法,即异或。
轮密钥加 c语言描述(参考别的人):
#include <iostream> using namespace std; void PrintfMatrix(unsigned char m[4][4]) { for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { printf("%2x",m[i][j]); if(j%4==3) puts(""); } } } void AddRoundKey(unsigned char state[4][4],unsigned char key[4][4]) //密钥加函数 { int i,j; for (i=0;i<4;i++) { for(j=0;j<4;j++) { state[i][j]^=key[i][j]; //明文与密钥的异或,即密钥加 } } } int main() { unsigned char state[4][4]={ 0,4,8,12, 1,5,9,13, 2,6,10,14, 3,7,11,15, }; unsigned char key[4][4]={ 0,1,2,3, 4,5,6,7, 8,9,10,11, 12,13,14,15, }; printf("明文为:\n");PrintfMatrix(state); printf("密钥为:\n");PrintfMatrix(key); AddRoundKey(state,key); //在主函数中调用密钥加函数 printf("密钥加结果:\n");PrintfMatrix(state); return 0; }
AES原理图:
3DES是DES向AES过度的加密算法,现在正在使用的加密标准是AES,wifi无线路由器通讯就是采用AES算法加密的。
上面讲了对称密码算法,对称密码算法加密和解密使用相同的密钥,但算法存在:加密方如何将密钥安全传递给解密方的问题!如果再次将密钥加密会继续产生相同的问题(继续下去,问题会圈套圈连环下去!)还有:两人共享一个密钥,信息泄露算谁的?因此科学家为解决上述问题设计了非对称密码算法。
1976年以后:
公钥密码使得发送端和接收端无密钥传输的保密通信成为可能!
每个通信实体有一对密钥(公钥,私钥)。公钥公开,私钥保密
核心算法:
上述运算中,23和7作为两个密钥,公开一个,另一个作为私钥即可。例如:公钥为7,私钥为23,则即使攻击者知道7、187和密文11,但如果他不知道私钥23,那么他无论如何也算不出明文88。
再拿上述运算举例,23和7作为两个密钥,公开一个,另一个作为私钥即可。例如:公钥为7,私钥为23,则即使攻击者知道7、187和密文11,但如果他不知道私钥23,那么他无论如何也算不出明文88。
选择两个大素数P、Q(保密)
P=11,Q=17
计算 N = P x Q
(可以公开)
N = 11 x 17 = 187
选择一个公钥E,并且不是P-1和Q-1的因子
(P -1)x(Q -1) =10 x 16 = 160,选择E与(p-1)(q-1)互质,并且E小于(p-1)(q-1),所以选择E为7,E的选择不唯一。
选择一个私钥D, (D x E)mod(P - 1) x (Q x 1) = 1
(
D
×
E
)
m
o
d
(
P
−
1
)
×
(
Q
−
1
)
=
1
(
D
×
7
)
m
o
d
160
=
1
D
×
7
=
K
×
160
+
1
K
=
1
,
D
=
23
(D \times E)mod(P - 1) \times (Q - 1) = 1 \\ (D \times 7)mod 160 = 1 \\ D \times 7 = K \times 160 + 1 \\ K = 1, D =23
(D×E)mod(P−1)×(Q−1)=1(D×7)mod160=1D×7=K×160+1K=1,D=23
E确定了,D也就确定了。
加密:明文PT -> 密文CT
C
T
=
P
T
E
m
o
d
N
CT = PT^{E} mod N
CT=PTEmodN
已知明文为88,那么用E加密明文,得到密文为11
C
T
=
P
T
E
m
o
d
N
C
T
=
8
8
7
m
o
d
187
C
T
=
11
CT = PT^{E}mod N\\ CT = 88^{7}mod187 \\ CT =11
CT=PTEmodNCT=887mod187CT=11
解密:密文CT -> 明文PT
P
T
=
C
T
D
m
o
d
N
PT = CT^{D} mod N
PT=CTDmodN
用D解密密文
P
T
=
C
T
D
m
o
d
N
P
T
=
1
1
23
m
o
d
187
P
T
=
88
PT = CT^{D}mod N\\ PT = 11^{23}mod187 \\ PT =88
PT=CTDmodNPT=1123mod187PT=88
换个例子: 如果P=7,Q=17呢?
N = P x Q = 7 x 17 = 119
(P -1)x(Q -1) =6 x 16 = 96,选择E与(p-1)(q-1)互质,并且E小于(p-1)(q-1),所以选择E = 5
计算私钥D,D小于(p-1)(q-1)
(
D
×
E
)
m
o
d
(
P
−
1
)
×
(
Q
−
1
)
=
1
(
D
×
5
)
m
o
d
96
=
1
D
×
5
=
K
×
96
+
1
K
=
4
,
D
=
77
(D \times E)mod(P - 1) \times (Q - 1) = 1 \\ (D \times 5)mod 96 = 1 \\ D \times 5 = K \times 96 + 1 \\ K = 4, D =77
(D×E)mod(P−1)×(Q−1)=1(D×5)mod96=1D×5=K×96+1K=4,D=77
已知明文为2,那么用D加密明文,得到密文为32 C T = P T E m o d N C T = 2 77 m o d 119 C T = 32 CT = PT^{E}mod N\\ CT = 2^{77}mod119 \\ CT =32 CT=PTEmodNCT=277mod119CT=32
知道密文32, P T = C T D m o d N P T = 3 2 5 m o d 119 P T = 2 PT = CT^{D}mod N\\ PT = 32^{5}mod119 \\ PT =2 PT=CTDmodNPT=325mod119PT=2
RSA能不能被破解就是看能否从公钥计算出私钥来,由加密公式可以看出来,公钥实际上包括E和N:
C
T
=
P
T
E
m
o
d
N
CT = PT^{E} mod N
CT=PTEmodN
要想计算出D来,那么就要先计算出P和Q
(
D
×
E
)
m
o
d
(
P
−
1
)
×
(
Q
−
1
)
=
1
N
=
P
×
Q
(D \times E)mod(P - 1) \times (Q - 1) = 1 \\ N = P \times Q
(D×E)mod(P−1)×(Q−1)=1N=P×Q
但P和Q是私密的,因此RSA的安全性基于 从P和Q得到N很容易,但从N分解P和Q,大数分解却很难。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。