一、非对称密码和RAS基本知识

一、非对称密码

1.基本介绍
  • 又被称为公钥密码*或是双密钥密码*
  • 基于数学函数而不是代替和换位操作
  • 由两个密钥形成一个密钥对,其中一个密钥为密钥拥有者保管(私钥),另一个密钥公开(公钥)。
  • 支持数字签名,用两个密钥中的任何一个加密的内容,都可以用另一个解密。
  • 速度比对称密码*慢
  • 主要用于密钥管理和数字签名
2.公钥密码*要求
  • 参与方B容易通过计算产生一对密钥(公开密钥 KU 和私有密钥 KR
  • 在知道公开密钥和待加密报文 M 的情况下,对于发送方A,很容易通过计算产生对应的密文 C

C = E K U ( M ) C = E_{KU}(M) C=EKU​(M)

  • 接收方B使用私有密钥容易通过计算解密所得的密文,以便恢复原来的报文 M

M = D K R ( C ) = D K R ( E K U ( M ) ) M = D_{KR}(C) = D_{KR}(E_{KU}(M)) M=DKR​(C)=DKR​(EKU​(M))

  • 敌对方即使知道公开密钥 KU,要确定私有密钥 KR 在计算上也是不可行的
  • 敌对方即使知道公开密钥 KU 和密文 C ,要想恢复原来的报文 M 在计算上也是不可行的
  • 两个密钥中的任何一个都可以用来加密,对应的另一个密钥用来解密(不是对所有的公钥*都适用,如DSA只用于数字签名)

M = D K R ( E K U ( M )   ( 机 密 性 实 现 ) M = D K U ( E K R ( M ) )   ( 数 字 签 名 实 现 ) M=D_{KR}(E_{KU}(M) \ (机密性实现)\\ M=D_{KU}(E_{KR}(M)) \ (数字签名实现) M=DKR​(EKU​(M) (机密性实现)M=DKU​(EKR​(M)) (数字签名实现)

2.单向陷门函数

单项陷门函数是满足下列条件的函数 f

  • 正向计算容易。即如果知道了公钥 PK和消息 x,容易计算密文 y = f P K ( x ) y = f_{PK}(x) y=fPK​(x)
  • 在不知道私钥 SK 的情况下,反向计算是不可行的。(所谓的计算不可行是指计算上相当复杂,在有限时间和成本范围内很难得到想要的结果,已无实际意义)。即如果只知道消息 y 二不知道密钥 SK ,则计算 x = f − 1 ( y ) x = f^{-1}(y) x=f−1(y) 是不可行的。
  • 在知道私钥 SK 的情况下,反向计算是容易的。即如果同时知道消息 y 和密钥 SK,则计算 x = f S K − 1 ( y ) x = f^{-1}_{SK}(y) x=fSK−1​(y) 是容易的。这里的密钥 SK 相当于陷门,和 PK 配对使用。

公钥加密*中的公钥用于单向陷门函数的正向(加密)计算,私钥用于反向(解密)计算。

  • 仅满足上述前两条的函数称为单向函数,第三条称为陷门性,密钥 SK 称为陷门信息。
  • 单向陷门函数 f是公开的
  • 上述第二条性质表明,窃听者由截获的密文 y = f P K ( x ) y = f_{PK}(x) y=fPK​(x) 推测消息的明文 x 是不可行的。

也就是说,对于单向陷门函数而言,它是指除非知道某种附加信息,否则这样的函数在一个方向上计算容易,在相反的方向上不能计算;有了附加信息,函数的逆就可以容易计算出来。

3.本原元和离散对数

  • 本原元(生成元、基元或根元)

对于一个素数 q,如果数值 a m o d q , a 2 m o d q , ⋯ a q − 1 m o d q a mod q,a^2 mod q,\cdots a^{q-1} mod q amodq,a2modq,⋯aq−1modq 是各不相同的正数,并且以某种排列方式组成了从 1q-1 的所有整数,则称整数 a 是素数 q 的一个本原元。本原元也成为生成元、基元或根元。(欧拉定理中的内容)

  • 离散对数

对于一个整数 b ,和素数 q 的一个本原元 a ,可以找到唯一的一个指数 i ,使得
b = a i m o d q ( 0 ≤ i ≤ q − 1 ) b = a^i mod q(0\leq i\leq q-1) b=aimodq(0≤i≤q−1)
成立。则指数 i 称为 b 的以 a 为底的模 q 的离散对数。

对于给定的 a , iq ,容易计算出 b;在最坏情况下需执行 i 次乘法,并且存在计算出 b 的有效算法。但是给定 baq ,计算出 i 一般非常困难,这就是离散对数问题的难解性。

二、RSA

1.算法描述
  • 安全性建立在大整数因子分解的困难性问题之上,利用了单向陷门函数的原理。
  • RSA密码*的 明文空间 M = 密文空间 C = Zn (表示 mod n 所组成的整数空间,即其取值范围为 0 ~ n-1)。
2.密钥生成

首先,选择两个互异的大素数 pq(保密),计算 n = p q n = p q n=pq (公开), φ ( n ) = ( p − 1 ) ( q − 1 ) \varphi (n) = (p-1)(q-1) φ(n)=(p−1)(q−1) (保密),选择一个随机整数 e ( 0 < e < φ ( n ) ) e(0 < e < \varphi(n)) e(0<e<φ(n)) (公开), 满足 g c d ( e , φ ( n ) ) = 1 gcd(e, \varphi(n)) = 1 gcd(e,φ(n))=1 。计算 d = e − 1 m o d φ ( n ) d = e^{-1} mod \varphi(n) d=e−1modφ(n) (保密)。 确定:公钥 KU = {e,n}, 私钥 KR = {d,p,q}, 或 KR = {d, n}

3.加密

已知:明文 M < n (因为所有明文和密文空间均为 Zn,即在 0 ~ n -1 的范围内;实际处理时对于 M >= n 的情形,则需要对大报文进行分组,确保每一个分组满足该条件) 和公钥 KU = {e,n}。计算密文:
C = M e m o d n C = M^e mod n C=Memodn

4.解密

已知:密文 C 和私钥 KR = {d, n}。计算明文:
M = C d m o d n M = C^d mod n M=Cdmodn

5.算法归纳
  • 选择两个互异的大素数 pq,为了保证安全性,通常要求每个素数均大于 10100 (即超过100位的十进制数)。
  • 计算 n = p q n = p q n=pq (公开), φ ( n ) = ( p − 1 ) ( q − 1 ) \varphi (n) = (p-1)(q-1) φ(n)=(p−1)(q−1) (保密)。
  • 选择一个和 φ ( n ) \varphi (n) φ(n)互素的数,令其为 e
  • 计算 d = e − 1 m o d φ ( n ) d = e^{-1} mod \varphi (n) d=e−1modφ(n) (保密)
  • 选好这些参数后,将明文划分成块,使得每个明文报文长度满足 M < n。加密 M 时,计算 C = M e m o d   n C = M^e mod\ n C=Memod n,解密 C 时,计算 M = C d m o d   n M = C^d mod \ n M=Cdmod n。由模运算的对称性可以证明,在确定的范围内,加密和解密函数是互逆的。为实现加密,需公开 {e, n} ,为实现解密需要 {d, n}
上一篇:OKR的落实过程中如何判断设定的OKR是否是合格的OKR?


下一篇:数据结构之C语言版单链表操作