现代密码学(四)——RSA密码体制

       RSA加密算法是一种非对称加密算法,基于大整数分解问题。在公开密钥加密和电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。

        RSA公开密钥密码体制。所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。

一、RSA密码体制参数

独立地选取两个大素数p_1p_2,计算np_1 × p_2,其欧拉函数值为:

          \varphi (n) = (p_1-1)(p_2-1)

随机选择一整数e1\leq e < \varphi (n)

(\varphi (n),e) = 1,即\varphi (n)e互素。

计算e的逆元:

          d = e^{-1} mod \varphi (n)

由此可得公钥为:ne;私钥为:dp_1p_2)不再需要,可以销毁。)

陷门函数:Z = (p_1p_2d)。

二、RSA加密与解密

x为明文,yx经过加密之后的密文,n为两个大素数之积。用公钥加密,用私钥签名;

加密:y = x^e mod  n

解密:x = y^d mod n

证明:y^d =  (x^e)^d =  x^{de}

\because  de = 1 mod \varphi (n)

\therefore  de = q\varphi (n) +1

由欧拉定理,(x,n)  =  1意味着x^{\varphi (n)} = 1 mod n

\therefore  y^d = x^{de} = x^{q\varphi (n)+1} = xx^{q\varphi (n)}  = x mod n

三、RSA签名

M为明文空间,C为密文空间,M = C = Z_nS为签名;

签名:对消息M \in Z_n 的签名

       S = Sig(M,d) = M^d mod n

验证:对给定的MS,可按下式验证:

      Ver(M,S) = 真  \Leftrightarrow  M = S^e mod n

四、RSA盲签名

       一般数字签名中,总是要先知道消息的内容之后才签署。但是有时需要某人对一个消息签名,但又不让他知道消息内容,称此为盲签名,一般利用盲变换可以实现,由Chaum在1983年最先提出的,在选举投票和数字货币中广泛运用。比如某人想要其他人在文件上签名,但是又不想让其他人知道内容,所以他将文件放入信封中,并放入复写纸,这个过程相当于盲变换,然后将信封给对方签名,对方通过验证后进行签名,签名就通过复写纸签在了文件上。

盲签名算法:

Alice、Bob是盲签名的双方,Bob的公钥为e,密钥为d,模为n

1)Alice要对消息m进行盲签名,选1 < k < m,作盲变换:

         t = mk^e mod n,并将t发送给Bob;

2)Bob对t签名:

         t^d = (mk^e)^d mod n,并将t^d发送给Alice

3)Alice计算:

        S = t^d/k mod n,得到S = m^d mod n

证明:

      t^d = (mk^e)^d = m^dk mod n 

     \Rightarrow t^d/k = m^dk/k = m^d mod n

五、RSA安全性 

1)分解模数n

        在理论上,RSA的安全性取决于模n分解的困难性,求\varphi (n)等价于分解n的困难。

2)迭代攻击法

        Simmons和Norris曾提出迭代或循环攻击法。例如,给定一RSA的参数为(n,e,y) = (35,17,3),可由y_0  = y = 3,计算y_1 = 3^{17}mod n = 33 mod 35。再由y_1 计算y_2 = y_1^{17} mod n = 3 mod 35,从而得到明文x = y_1 = 33 mod 35。一般对明文加密多次,直到再现x为止。Rivest证明,当p_1-1p_2-1中含有大素数因子,且n足够大时,这种攻击法成功的概率趋于0。

3)选择明文攻击

        攻击者收集用户A以公钥e加密的密文 y = x^e mod n,并想分析出消息x。选随机数r < n,计算y_1 = r^e mod ny_2 = y_1 \times y mod n,现在攻击者请A对消息y_2进行解密得到s = y_2^d mod n。攻击者计算s/r mod n = x,得到了明文x

4)共用模攻击

        设 e_1 和 e_2是两个互素的不同密钥,共用模n,对同一消息x加密得y_1 = x^{e_1} mod ny_2 = x^{e_2} mod n。分析者知道n,e_1,e_2,y_1,y_2。因为(e_1,e_2) = 1,所以有e_1\times s_1 + e_2 \times s_2 = 1s_1s_2为一正一负,从而由Euclidean算法可计算y_1^{s_1}y_2^{s_2} = x mod n

5)参数的选择

  • n的选择:n = p \times qpq必须为强素数。
  • pq的选择:pq要足够大,以使n分解在计算上不可行。
  • pq之差要大:

如果pq之差很小,则可由n = pq估计

           (p+q)/2=n^{1/2}

此外由

            (p+q)/2)^2-n = (p-q)/2)^2

于是由(p+q)/2(p-q)/2可以试验给出p,q的值。

  • e的选择

        e小,加密速度快, Knuth和 Shamir曾建议采用e=3。但e太小易遭低指数攻击。而且若e小,x小,当x^e < n,则y = x^emod nx^e,由y直接开e次方可求x

  • d的选择

       d小,签字和解密运算快,这在IC卡中尤为重要(复杂的加密和验证签字可由主机来做)。类似于加密下的情況,d不能太小,否则由已知明文攻击。 Wiener给出对小d的系统攻击法,证明了当d长度小于n1/4时,由连分式算法,可在多项式时间内求出d值。因此,d要大于n^{1/4}

  • p-1q-1的最大公因子要小

在唯密文攻击下,设破译者截获密文y = x^e mod n。破译者做下述计算(迭代攻击法):

           x_i = x_{i-1}^e  mod n = (x)^{e^{i}}mod n

e^i = 1 mod \varphi (n),则有x_ixmod n,且e^{i+1} = e mod \varphi (n),即x_{i+1} = y。若i小,则由此攻击法易得明文x

       由Euler定理知,i = \varphi ((p-1)(q-1))。若p-1q-1的最大公因子小,则i值大。如i(p-1)(q-1)/2,此方法难于奏效。

六、其他问题

(1)不可用公共模:

        由一个密钥产生中心(KGC)用一个公共接分发多对密钥,并公布相应公钥e,这当然使密钥管理简化,存储空间小,且无重新分组问题,但如前所述,它在安全上会带来问题。

(2)明文嫡要尽可能地大:

        明文熵要尽可能地大,以使在已知密文下,要猜测明文无异于完全随机等概情况。

(3)用于签字时,要采用Hash函数

你可能感兴趣的:(现代密码学)