1.提供通信机密性
1.1. RSA
RSA有两个互相关联的部分:
- 公钥和私钥的选择
- 加密和解密算法
为了生成RSA的公钥和私钥,Bob执行如下步骤:
- 选择两个大素数 p p p 和 q q q 。
- 计算 n = p q n=pq n=pq 和 z = ( p − 1 ) ( q − 1 ) z=(p-1)(q-1) z=(p−1)(q−1) 。
- 选择小于n的一个数 e e e ,且使 e e e 和 z z z 没有(非1的)公因数( G C D ( e , z ) = = 1 GCD(e,z)==1 GCD(e,z)==1)。
- 求一个数 d d d ,使得 e d − 1 ed-1 ed−1 可以被 z z z 整除,即 e d m o d z = 1 ed\ mod\ z=1 ed mod z=1 ,即 e e e 在 m o d z mod\ z mod z 意义下的逆元。
- Bob使外界可用的公钥 K B + K_B^+ KB+ 是一对数 ( n , e ) (n,e) (n,e) ,其私钥 K B − K_B^- KB− 是一对数 ( n , d ) (n,d) (n,d) 。
Alice执行的加密和Bob的解密过程如下:
- 假设Alice要给Bob发送一个由整数 m m m 表示的比特组合,且 m < n m<n m<n 。为了进行编码,Alice执行指数运算 m e m^e me ,然后计算 m e m^e me 被 n n n 除的整数余数。换言之,Alice的明文报文 m m m 的加密指 c c c 就是: c = m e m o d n c=m^e\ mod\ n c=me mod n 对应于这个密文 c c c 的比特模式发送给Bob
- 为了对收到的密文报文 c c c 解密,Bob计算: m = c d m o d n m=c^d\ mod\ n m=cd mod n 这要求使用他的私钥 ( n , d ) (n,d) (n,d)
1.2. 会话密钥
RSA所要求的指数运算是相当耗费时间的过程。形成对比的是,DES用软件实现要比RSA快100倍,用硬件实现则要快1000~10000倍。所以,在实际应用中,RSA通常与对称密钥密码结合起来使用。例如,如果Alice要向Bob发送大量的加密数据,她可以用下述方式来做。首先,Alice选择一个用于加密数据本身的密钥,这个密钥有时称为会话密钥(session key),该会话密钥表示为 K s K_s Ks 。Alice必须把这个会话密钥告知Bob,因为这是他们在对称密钥密码(如DES或AES)中所使用的共享对称密钥。Alice可以使用Bob的RSA公钥来加密该会话密钥,即计算 c = ( K s ) e m o d n c=(K_s)^e\ mod\ n c=(Ks)e mod n 。Bob收到了该RSA加密的会话密钥 c c c 后,解密得到会话密钥 K s K_s Ks 。Bob此时已经知道Alice将要用于加密数据传输的会话密钥了。
1.3. RSA的工作原理
数论结论:如果
p
p
p 和
q
q
q 是素数,且有
n
=
p
q
n=pq
n=pq 和
z
=
(
p
−
1
)
(
q
−
1
)
z=(p-1)(q-1)
z=(p−1)(q−1) ,则
x
y
m
o
d
n
x^y\ mod\ n
xy mod n 与
x
(
y
m
o
d
z
)
m
o
d
n
x^{(y\ mod\ z)}\ mod\ n
x(y mod z) mod n是等同的 [Kaufman 1995]。 应用这个结论,对于
x
=
m
x=m
x=m 和
y
=
e
d
y=ed
y=ed ,可得
m
e
d
m
o
d
n
=
m
(
e
d
m
o
d
z
)
m
o
d
n
m^{ed}\ mod\ n=m^{(ed\ mod\ z)}\ mod\ n
med mod n=m(ed mod z) mod n
而我们是这样选择
e
e
e 和
d
d
d 的,即
e
d
m
o
d
z
=
1
ed\ mod\ z=1
ed mod z=1。这告诉我们
m
e
d
m
o
d
n
=
m
1
m
o
d
n
=
m
m^{ed}\ mod\ n=m^1\ mod\ n=m
med mod n=m1 mod n=m
且先执行解密操作再执行加密操作,也能得到初始值
m
m
m :
(
m
d
m
o
d
n
)
e
m
o
d
n
=
m
d
e
m
o
d
n
=
m
e
d
m
o
d
n
=
(
m
e
m
o
d
n
)
d
m
o
d
n
(m^d\ mod\ n)^e\ mod\ n=m^{de}\ mod\ n=m^{ed}\ mod\ n=(m^e\ mod\ n)^d\ mod\ n
(md mod n)e mod n=mde mod n=med mod n=(me mod n)d mod n
2.提供报文完整性
2.1. 密码散列函数
散列函数以 m m m 为输入,并计算得到一个称为散列的固定长度的字符串 H ( m ) H(m) H(m) 。要求具有下列附加的性质:
- 找到任意两个不同的报文 x x x 和 y y y 使得 H ( x ) = H ( y ) H(x)=H(y) H(x)=H(y) ,在计算上是不可能的。
2.1.1. 简单的检验和(如因特网检验和)只能算作劣质的密码散列函数
2.1.2 MD5散列算法
- 填充——先填1,然后填足够多的0,直到报文长度满足一定的条件
- 添加——在填充前添加一个用64比特表示的报文长度
- 初始化累加器
- 循环——在最后的循环步骤中,对报文的16字块进行4轮处理
2.1.3. SHA-1
(ps:彩虹表是一个用于加密散列函数逆运算的预先计算好的表, 为破解密码的散列值(或称哈希值、微缩图、摘要、指纹、哈希密文)而准备。)
如何执行报文完整性:
- Alice生成报文 m m m 并计算散列 H ( m ) H(m) H(m)
- 然后Alice将 H ( m ) H(m) H(m) 附加到报文 m m m 上,生成一个扩展报文 ( m , H ( m ) ) (m,H(m)) (m,H(m)) ,并将该扩展报文发给Bob
- Bob接收到一个扩展报文 ( m , h ) (m,h) (m,h) 并计算 H ( m ) H(m) H(m) 。如果 H ( m ) = h H(m)=h H(m)=h ,Bob得到结论:一切正常
2.2. 报文鉴别码
上面说到的发放存在明显缺陷。Trudy能够生成虚假报文
m
′
m'
m′ ,在其中声称她就是Alice,计算
H
(
m
′
)
H(m')
H(m′) 并发送给Bob
(
m
′
,
H
(
m
′
)
)
(m',H(m'))
(m′,H(m′)) 。当Bob接收到该报文,一切将在步骤3中核对通过,并且Bob无法猜出这种不轨的行为。
为了执行报文完整性,除了使用密码散列函数外,Alice和Bob将需要共享秘密
s
s
s 。这个共享的秘密只不过是一个比特串,它被称为鉴别密钥(authentication key)。使用这个共享秘密,报文完整性能够执行如下:
- Alice生成报文 m m m ,用 s s s 级联 m m m 以生成 m + s m+s m+s ,并计算散列 H ( m + s ) H(m+s) H(m+s) 。 H ( m + s ) H(m+s) H(m+s) 被称为报文鉴别码(Message Authentication Code, MAC)
- 然后Alice将MAC附加到报文 m m m 上,生成扩展报文 ( m , H ( m + s ) ) (m,H(m+s)) (m,H(m+s)) ,并将该扩展报文发送给Bob
- Bob接收到一个扩展报文 ( m , h ) (m,h) (m,h) ,由于知道的 s s s ,计算出报文鉴别码 H ( m + s ) H(m+s) H(m+s) 。如果 H ( m + s ) = h H(m+s)=h H(m+s)=h ,Bob得到结论:一切正常
3. 数字签名
在数字领域,人们通常需要指出一个文件的所有者或创作者,或者表明某人认可一个文件内容。数字签名(digital signature)就是一种在数字领域实现这些目标的密码技术。数字签名以可鉴别的、不可伪造的方式进行。也就是说必须能够证明由某个人在一个文件上的签名确实是由该人签署的(该签名必须是可证实的),且只有那个人能够签署那个文件(该签名无法伪造)。
为了签署文档,Bob直接使用他的私钥
K
B
−
K_B^-
KB− 计算
K
B
−
(
m
)
K_B^-(m)
KB−(m) 。数字签名
K
B
−
(
m
)
K_B^-(m)
KB−(m) 满足可鉴别、不可伪造的需求。假设Alice有
m
m
m 和
K
B
−
(
m
)
K_B^-(m)
KB−(m) ,她要在法庭上证明(进行诉讼)Bob确实签署过这个文档。Alice持有Bob的公钥
K
B
+
K_B^+
KB+ ,并把它用于Bob的数字签名
K
B
−
(
m
)
K_B^-(m)
KB−(m) ,从而得到了文档
m
m
m 。然后,Alice就可以论证仅有Bob能够签署这个文档,基于理由:
- 无论是谁签署这个报文,都必定在计算签名 K B − ( m ) K_B^-(m) KB−(m) 过程中使用了 K B − K_B^- KB− 这个私钥,使 K B + ( K B − ( m ) ) = m K_B^+(K_B^-(m))=m KB+(KB−(m))=m
- 知到 K B − K_B^- KB− 这个私钥的唯一人只有Bob。(注意到此处假设Bob没有把 K B − K_B^- KB− 泄露给任何人,也没有人从Bob处窃取到 K B − K_B^- KB−)
通过完全加密/解密对数据签名是杀鸡用牛刀,更有效的方法是将散列函数引入数字签名。即Bob计算 K B − ( H ( m ) ) K_B^-(H(m)) KB−(H(m)) 而不是 K B − ( m ) K_B^-(m) KB−(m) 。因为 H ( m ) H(m) H(m) 通常比报文 m m m 小得多,所以生成数字签名所需要的计算量大为降低。
4. 公钥认证
数字签名的一个重要应用是公钥认证(public key certification),即证实一个公钥属于某个特定的实体。例如,当Alice与Bob使用公钥密码通信时,她需要证实她假定是Bob的那个公钥确实就是Bob的公钥。
将公钥与特定实体绑定通常是由认证中心(Certification Authority, CA)完成的,CA的职责就是使识别和发行证书合法化。CA具有下列作用:
- CA证实一个实体(一个人、一台路由器等)的真实身份。
- 一旦CA验证了某个实体的身份,这个CA会生成一个将其身份和实体的公钥绑定起来的证书(certificate)。这个证书包含这个公钥和公钥所有者全局唯一的身份标识信息(例如,一个人的名字或一个IP地址)。由CA对这个证书进行数字签名,上述例子即发送 K C A − ( ( K B + , B ) ) K_{CA}^-((K_B^+,B)) KCA−((KB+,B)) 给Alice。
5. SSL(Secure Socket Layer)握手
- 客户发送它支持的密码算法的列表,连同一个客户的不重数。
- 从该列表中,服务器选择一种对称算法例如(AES)、一种公钥算法(例如具有特定密钥长度的RSA)和一种MAC算法。它把它的选择以及证书和一个服务器不重数返回给客户。
- 客户验证该证书,提取服务器的公钥,生成一个前主密钥(Pre-Master Secret,PMS) ,用服务器的公钥加密该PMS,并将加密的PMS发送给服务器。
- 使用相同的密钥导出函数(就像SSL标准定义的那样),客户和服务器独立地从PMS和不重数中计算出主密钥(Master Secret,MS)。然后该MS被切片以生成两个密码和两个MAC密钥。此外,当选择的对称密码应用于CBC(例如3DES或AES),则两个初始化向量(Initialization Vector,IV)也从该MS获得,这两个IV分别用于该连接的两端。自此以后,客户和服务器之间发送的所有报文均被加密和鉴别(使用MAC)。
- 客户发送所有握手报文的一个MAC。
- 服务器发送所有握手报文的一个MAC。
最后两个步骤使握手免受篡改危害(因为之前的报文没有MAC,最后两步发送MAC相当于检查之前的报文有没有被修改如从支持的密码算法列表里删除几个算法)。