密码学入门
网络信息安全这门课属于 自然科学,自然科学必须有完备的数学理论基础, 密码学就是信息安全的数学理论基础。
主要内容与重点
- 一、传统密码学
- 二、现代密码学
- 三、理论不可破解和计算不可破解的加密算法
- 四、对称加密算法
- 五、公开加密算法
- 六、两种加密算法结合使用
- 七、散列算法
密码学的发展的三个阶段:
-
手工阶段(传统密码学)
从古代到1949年为密码学诞生的前夜。这一阶段虽然有众多密码实践,比如两次世界大战中通信密码的大规模应用和密码的破译活动,但密码技术不是一种科学,而可称之为一种艺术。
这一时期的密码专家常常靠直觉、猜测和信念来设计、分析密码,而不是凭借推理和证明。 -
机械阶段(传统密码学)
1949年,香农(Claude Shannon)在《贝尔系统技术杂志》上发表论文《保密系统的通信理论》,为对称密码系统奠定了理论基础,从而密码成为一门科学。而从1949年到1975年这段时间内,密码学的理论进展不大。
-
电子计算机出现以后(现代密码学)
直到1976年,Diffie和Hellman发表了《密码学的新方向》一文,建立了公钥密码系统,引发了密码学上的一次革命性的变革。
密码学的四个空间:
- 待加密的明文空间
- 加密后得到的密文空间
- 加密和解密所使用的的算法空间
- 加密和解密所使用的密钥空间
密码学的三个操作:
-
加密
明文、加密算法 —— 【加密密钥的作用下】 ——> 密文
-
解密
密文、解密算法 —— 【解密密钥的作用下】 ——> 明文
-
破译
密文、解密算法 —— 【没有解密密钥的情况下】 ——> 明文
老师手迹~
1、老师提问:上图里对称加密下面的 C、D 的英文全称是什么?
答: 扩散(Diffusion) 和 混淆(Confusion)。
2、老师提问:现代密码学为什么N个人两两通讯所需的算法数只有1?
答:算法公开,所有的秘密都在密钥上。
3、老师提问:公开加密 中公开的是什么?
答案 :加密算法,解密算法,一部分密钥都是公开的。私钥是保密的。
密码的安全性取决于以下几点:
-
密码算法本身的安全性(质变)
-
密钥的长度(量变)
-
随机数发生器的随机性(熵)
熵是不确定性的量度,密钥空间为 2 128 2^{128} 2128(不完全随机)并不意味着熵就能达到128,声称的熵和实际达到的熵不一样。熵为128只能说明破解密钥的最大工作量,丝毫不能说明最小量。
随机数完全随机 ——> 密钥出现概率相等 ——> 达到最大熵
一、传统密码学
算法和密钥都必须保密,如模3的恺撒加密算法。
缺点是:N个人两两相互通信则需要互不相同的算法太多。
二、现代密码学
- 算法公开
公开越久的算法,如一直在使用,有理由相信其加密强度越高,因为经过长时间攻击已完善;反之不公开算法加密强度可能不高。 - 所有的秘密都在密钥上。
三、理论不可破解和计算不可破解的加密算法
理论不可破解的加密算法:一次一密钥(无实用价值,密钥和明文一样长)
计算不可破解的加密算法:如,在现有商用计算机条件下,112 位的 3DES 算法 和 1024 位的 RSA 算法。
密码系统的基本要求和设计原则
密码学常见表示:
- K —— 密钥
- E —— 加密
- D —— 解密
- M ——明文
- C —— 密文
密码学基本要求:
-
知道 K 时, C = E ( M , K ) C = E(M,K) C=E(M,K) 要容易计算
在某个加密算法E下,对明文M使用密钥K加密,获得的密文为C -
知道 K 时, M = D ( C , K ) M = D(C,K) M=D(C,K) 要容易计算
在某个解密算法D下,对密文C使用密钥K解密,获得的明文为M -
不知道 K 时,由 C 不容易推导出 M(难以破译)
设计原则:
- 对合法的通信双方来说,加密和解密容易,D、E 公开
- 对密码分析员来说由密文推导出明文困难,难以破译密码
- 衡量密码系统的好坏,应以能否被攻破和易于被攻破为基本标准。
一次一密密码系统
- 属于流密码体系,是对称加密
- 由美国 AT&T 的 G.W.Vernam 发明
- 唯一理论上不可攻破的密码系统
- 计算简单,效率高,但密钥管理困难
一次一密码系统的算法
假定明文是
M
=
(
m
0
,
m
1
,
…
,
m
n
−
1
)
M = (m_0,m_1,…,m_{n-1})
M=(m0,m1,…,mn−1)
用下述算法
C
i
=
E
K
i
(
m
i
)
=
(
m
i
+
K
i
)
(
m
o
d
26
)
0
≤
i
<
n
(
1
)
C_i = E_{Ki}(m_i) = (m_i + K_i)(mod 26) 0\leq i < n(1)
Ci=EKi(mi)=(mi+Ki)(mod26)0≤i<n(1)
可以得出密文
C
=
(
C
0
,
C
1
,
…
,
C
n
−
1
)
C =(C_0,C_1,…,C_{n-1})
C=(C0,C1,…,Cn−1)
把明文的每一位( M i M_i Mi)加上密钥的每一位( K i K_i Ki),模上26,得到密文的每一位( C i C_i Ci),这就是流密码体系,明文与密文一一对应。
有以下几点要求:
- 密钥 K = ( K 0 , K 1 , … , K n − 1 ) K =(K_0,K_1,…,K_{n-1}) K=(K0,K1,…,Kn−1)是一个随机序列
- 密钥只能使用一次
- 密钥长度要等于明文长度,即 ∣ K ∣ = ∣ M ∣ \left | K \right | = \left | M\right | ∣K∣=∣M∣
一次一密密码系统举例
明文为 send help,由 0-a,1-b,2-c,3-d,4-e … 对应规则可知:
M = ( 18 , 4 , 13 , 3 , 7 , 4 , 11 , 5 ) , n = 8 M = (18,4,13,3,7,4,11,5),n=8 M=(18,4,13,3,7,4,11,5),n=8
上面提到,把明文的每一位( M i M_i Mi)加上密钥的每一位( K i K_i Ki),模上26,得到密文的每一位( C i C_i Ci)。
通讯双方在知道密钥(K)的情况下,可以很容易的将密文©还原为明文(M)。
老师提问:一次一密密码例子中,由密文5 - 密钥20,不够减怎么办?
答:由于算法中明文的每一位与密钥相加后会模26,因此解法为:
5
+
26
−
20
=
11
5+26-20 = 11
5+26−20=11
无法破解出明文的原因分析
不知道 K 无法破解出明文 M:
-
密钥序列 2 6 n 26^n 26n 可能是个天文数字,用穷尽搜索方法工作量大。
-
上述例子中
K=(4,3,2,21,22,24,20,20)
时,由同一个密文 C,可生成另一个有意义明文:M =(t,o,m,i,s,i,1,1)。
“send help” 和 “tom is ill” 作为明文的可能性相同,获悉密文丝毫不能增加破译的可能性。
一次一密密码系统不实用的原因
- 很难生成真正随机的密钥序列。
- 即使已经生成,很难分发/存储和明文等长的随机密钥序列。
- 若有安全信道可传递每次不同、任意长的密钥序列,为何不直接用来传递明文呢?
实际不可攻破的密码系统是指:它们在理论上是可以攻破的,但所需计算资源超出实际的可能性。
四、对称加密算法
对称加密算法的唯一功能:保证机密性的加密和解密(与后面的公开加密算法区分)
特点:加密密钥和解密密钥完全相同,相反过程迭代就可解密。
常见的对称加密:
- DES(64位,其中56位参与运算,8位是校验位)
- 3DES(112位、168位)
- IDEA(最早的128位对称加密算法之一,到目前仍然安全)
- AES(新的国际标准)
- …
对称加密的优点:
- 速度快
对称加密的缺点:
- 密钥分发难(带外发送)
- 不能进行发送端鉴别(源端抗否认),如发布密钥可能泄露给第三人
- N 个人两两相互通信只需要 1 个算法,但需要 N(N-1)/2 个密钥
五、公开加密算法
公开加密算法具有难解性(通常是难以解决的数学难题)。
公开加密算法公开了:加密算法,解密算法,一部分密钥。
公开加密算法的三个功能:
- 保证机密性的加密和解密
- 实现不可否认性的数字签名和验证签名
- 可以进行密钥的分配和交换
常见的公开加密算法:
-
RSA
基于大合数分解成大质数的困难。(可用于加密和数字签名)
公开密钥的三个功能都可以做到,缺点是速度慢
-
D-H
基于有限域上计算离散对数的难解性。(只用于密钥交换)
-
椭圆曲线
基于椭圆曲线点群上计算离散对数的难解性。(可以取代RSA)
公开密钥的三个功能都可以做到,并且速度比RSA快
公开加密算法的发展方向
-
DSS(数字签名标准)
只能进行数字签名
以 RSA 算法为例
两个大质数 (1024bi) 相乘容易,但将一个大合数分解成两个大质数难(计算上不可行)。
- 一个函数生成两个密钥
- 不能由其中一个推导到另外一个
- 一个密钥用于加密,另一个用于解密
- 哪一个用于加密,哪一个用于解密无所谓
- 但用一个加密的密文,肯定能用另一个解密
相互通信的每个用户生成一对密钥(N个人共有2N个密钥),一个可以公开发布(公钥),另一个自己使用,只能自己知道(私钥)。
为什么公开加密算法中密钥需要1024 位强度才够,而对称加密只需要100多位?
1)对称密钥是完全保密的,所以短密钥就可以具有高强度;
2)公开密钥算法毕竟公钥已公开,公钥和私钥肯定有一定联系(尽管难以推导),所以长密钥才安全。
密钥的管理问题
对称加密系统中,由于加密的密钥就是解密的密钥,因此对称加密担心泄露密钥。
公开加密系统中,用户的公钥不担心泄密,但是担心公钥被人篡改,也称为公钥担心被假冒。解决方案是,利用 CA(电子认证服务),由CA这个可信第三方来颁发数字证书,保证公钥数据的真实性。
公开加密算法的两种用法:
情况:A 发送消息给 B
-
A 用 B 的公钥加密 ——> B 用自己私钥解密
非 B 不能得到 A 发送的消息(保证了机密性)
-
A 用自己私钥加密 ——> B 用 A 的公钥解密
别人也不能假冒 A 发送消息(没有 A 的私钥,其他无法用A 的公钥解密开,因此无法假冒 A)
A 也不能否认发送过该消息(数字签名不可否认)
以上用法有两个前提:
- A 必须得到 正确的 B 的公钥
- B 必须得到 正确的 A 的公钥
B 要确认自己得到的声称是 A 公钥的密钥确实是 A 的公钥,而不是其他人的公钥(否则别人就可以冒充 A 发送消息, 也可以得到原来是发送给 A 的机密数据)—— 需要从 CA 处得到 A 的公钥,CA 以自己的私钥加密 A 的公钥担保,而 CA 的公钥众所周知。
综合上述两种用法:
加密:A 先用自己的私钥加密,再用 B 的公钥加密
解密:B 先用自己的私钥解密,再用 A 的公钥解密
公式化描述:
C = E B 的 公 钥 ( E A 的 私 钥 ( M ) ) C = E_{B的公钥}(E_{A的私钥}(M)) C=EB的公钥(EA的私钥(M)) —> M = D A 的 公 钥 ( D B 的 私 钥 ( C ) ) M = D_{A的公钥}(D_{B的私钥}(C)) M=DA的公钥(DB的私钥(C))
以上操作:
- 确保只有 B 能够接收到消息(机密性)
- B 确认消息是 A 发送的(数字签名)
- 相反顺序加解密不能实现数字签名
老师问题:讨论A发消息给B的所有情况:
(1)A用自己的公钥加密,能否加密,有没有意义?
(2)A用自己的私钥加密,能否加密,有没有意义?
(3)A用B的公钥加密,能否得到B的正确公钥,安全意义?
(4)A用B的私钥加密,有没有意义?
接收端不可否认 —— 数字签名收条(S/MIME v3)
时间不可否认(抗重放)—— 时间戳
公开加密算法的特点
优点:
-
产生密钥个数少,公开分发密钥
-
数字签名
-
适用于互联网环境
缺点:
- 速度慢(密钥太长),不合适直接加密明文
六、两种加密算法结合使用
公开加密与对称加密结合使用,形成了 PGP 加密算法雏形 (简单了解)
A 发送前:
- A 用自己私钥加密明文散列值
- 再用随机对称密钥加密明文和散列值
- 最后用B公开密钥加密该对称密钥
B 接收后:
- B 用自己私钥解密得到对称密钥
- 再用对称密钥对密文解密得明文和散列值
- 最后用A公钥解密明文散列值
七、散列算法
雪崩效应:明文修改一点点,散列函数不变,散列值发生巨大变化
(1)算法公开:MD5、SHA1、…
(2)数字指纹(压缩函数):使得散列算法具有完整性(数据在发送过程中不被破坏,发怎样收怎样)
(3)散列算法与加密算法的区别:
- 散列过程不可逆,只加密不解密
- 散列算法无密钥
- 散列得出的密文与明文长短无关,只与散列算法有关
(4)如何用散列算法实现完整性:
- 比较传输得到的散列值和计算得到的散列值,如不匹配要求重传
- 传明文M(长) 和传H(M)信道(短)出错的概率相差很大
- 直接传明文及其散列值没有任何安全性
(5)冲突(碰撞)
- 冲突必然存在,只是很难找到。
- "冲突"与"可逆"的不同,散列不可逆。
- Hash 值不够安全:不是它们可逆,而是能够比较确定、较快地找到冲突。