密码学复习笔记4【公钥密码技术、RSA 、ElGamal】

公钥密码

基本思想

公钥密码也称为非对称密码。使用公钥密码的每一个用户都分别拥有两个密钥:加密密钥与解密密钥,它们两者并不相同,并且由加密密钥得到解密密钥在计算上是不可行的。每一个用户的加密密钥都是公开的。

  • 仅根据密码算法和加密密钥来确定解密密钥在计算上是不可行的
  • 两个密钥中的任何一个都可用来加密,另一个用来解密

示意图如下:
密码学复习笔记4【公钥密码技术、RSA 、ElGamal】_第1张图片
加密示意图:
密码学复习笔记4【公钥密码技术、RSA 、ElGamal】_第2张图片
认证过程示意图:密码学复习笔记4【公钥密码技术、RSA 、ElGamal】_第3张图片

公钥密码(非对称加密)与对称加密的对比

示意图:
密码学复习笔记4【公钥密码技术、RSA 、ElGamal】_第4张图片

对称密码 公钥密码
一般要求 一般要求
1.加密和解密使用相同的密钥和相同的算法 1.同一算法用于加密和解密,但加密和解密使用不同密钥
2.收发双方必须共享密钥 2.发送方拥有加密或解密密钥,而接收方拥有另一密钥
安全性安全 安全性要求
1.密钥必须是保密 1.两个密钥之一必须是保密的
2.若没有其他信息,则解密消息是不可能或至少是不可行的 2.若没有其他信息,则解密信息是不可能或至少是不可行的
3.知道算法和若干密文不足以确定密钥 3.知道算法和其中一个密钥以及若干密文不足以确定另一密钥

##常见的两个关于公钥密码的误区
关于公钥密码的常见的几种误区

  • 第一种误解是从密钥分析角度看,公钥密码比传统密码更安全。从抗密码分析角度看,原则上不能说传统密码优于公钥密码,也不能说公钥密码优于传统密码
  • 第二种误解是,公钥密码是一种通用的方法,所以传统密码已经过时。其实不然,由于现有的公钥密码方法所需要的计算量大,所以取代传统密码似乎不太可能。“公钥密码学仅限于用在密钥管理和签名这类应用中,这几乎是已被广泛接受的事实”

公钥密码设计-单向陷门函数

单向陷门函数可以被定义为如下函数f:

  • (1)给出f的定义域中的任意元素x, f(x)的计算是容易的;
  • (2)给出y=f (x)中的y要计算x时,若知道设计函数f时结合进去的某种信息(该信息称为陷门),则容易计算;若不知道该信息,则难以计算。

目前人们主要是基于如下的数学上的困难问题来设计单向函数和公钥密码体制:

  • (1)大整数分解问题(如公钥密码体制RSA);
  • (2)有限域上的离散对数问题(如公钥密码体制ElGamal):
  • (3)椭圆曲线上的离散对数问题(如公钥密码体制ECC)。
    ##为什么要用公钥密码
    (1) 机密性的实现
    发送方用接收方的公钥加密消息,接收方用自己的私钥来解密。
    (2) 数字签名
    发送方用自己的私钥来签名消息,接收方通过发送方对应的公钥来鉴别消息,并且发送方不能对自己的签名进行否认。
    (3) 密钥分发和协商
    发送方和接收方基于公钥密码系统容易实现在公开信道上的大规模的密钥分发和协商。

RSA公钥算法

RSA的诞生

RSA公钥算法是由 MIT (麻省理工学院, Massachusetts Institute of Technology) 的Rivest, Shamir和Adleman在1978年提出来的。RSA方案是被最广泛接受并实现的通用公开密钥密码算法,目前已成为公钥密码的国际标准。该算法的数学基础是初等数论中的欧拉定理,其安全性建立在大整数因子分解的困难性之上。

附一张ppt提供的这三人的合影,ummmm,去网上对比了下,没问题~
密码学复习笔记4【公钥密码技术、RSA 、ElGamal】_第5张图片

RSA的算法描述

PS:吐槽一下,非对称真的比对称好理解很多来着~

密钥的生成

  1. 选择两个大素数 pq,(p,q为互异素数,需要保密),
  2. 计算 n = p × q n = p×q n=p×q φ ( n ) = ( p - 1 ) × ( q - 1 ) φ (n) = (p-1)×(q-1) φ(n)=(p1)×(q1)
  3. 选择整数 e 使 g c d ( φ ( n ) , e ) = 1 , 1 < e < φ ( n ) gcd(φ(n),e) =1, 1<e<φ(n) gcd(φ(n)e)=1,1<e<φ(n)
  4. 计算d,使 d ∗ e ≡ 1 m o d φ ( n ) d*e \equiv1mod φ(n) de1modφ(n)
    得到:公钥 为{e,n}; 私钥为{d,n}

加密(用e,n):

明文:M, 密文 C = p o w ( M , e , n ) C = pow(M, e, n) C=pow(M,e,n)解释下,M的e次方对n取余,一般M为明文的10进制形式

解密(用d,n):

密文C, 明文 M = p o w ( C , d , n ) M = pow(C, d, n) M=pow(C,d,n)

例题:生成一个公钥私钥对,并进行加解密
  1. 选择两个素数p=7,q=17;
  2. 计算
    n = p ∗ q = 7 ∗ 17 = 119 ; n=p*q=7*17=119; n=pq=717=119;
  3. 计算
    φ ( n ) = ( p − 1 ) ( q − 1 ) = ( 7 − 1 ) ( 17 − 1 ) = 96 φ(n)=(p-1)(q-1)=(7-1)(17-1)=96 φ(n)=(p1)(q1)=(71)(171)=96
  4. 选择一个随机整数
    e = 5 , 且 1 < e < φ ( n ) = 96 , 满 足 g c d ( e , φ ( n ) ) = 1 e=5,且1<e<φ(n)=96,满足gcd(e, φ(n))=1 e=51<e<φ(n)=96gcd(e,φ(n))=1
    则公钥Pk=(5,119);
  5. 计算d
    ( d ∗ e ) m o d φ ( n ) = 1 , 即 ( d ∗ 5 ) m o d 96 = 1 , d = 77 (d*e)modφ(n)=1,即(d*5) mod 96=1,d=77 (de)modφ(n)=1,(d5)mod96=1d=77
    则私钥Sk=(77,119);

设明文P=19;
加密: 1 9 5 ( m o d 119 ) = 66 19^5 \pmod {119} = 66 195(mod119)=66传送密文C=66;
解密: 6 6 77 ( m o d 119 ) = 19 66^{77} \pmod {119} =19 6677(mod119)=19获得明文P=19。

RSA数学基础

欧拉定理(数论中)

"欧拉定理"指的是:
如果两个正整数a和n互质,则n的欧拉函数 φ(n) 可以让下面的等式成立:
a φ ( n ) ≡ 1 m o d ( n ) a^{φ(n)}\equiv1 mod( n) aφ(n)1mod(n)
举个例子:
3和7互质,而7的欧拉函数φ(7)等于6,所以3的6次方(729)减去1,可以被7整除(728/7=104)。
###欧拉函数
欧拉函数的通式:
φ ( n ) = n ∗ ( 1 − 1 / p 1 ) ∗ ( 1 − 1 / p 2 ) ∗ ( 1 − 1 / p 3 ) ∗ ( 1 − 1 / p 4 ) … . . ( 1 − 1 / p n ) φ(n)=n*(1-1/p1)*(1-1/p2)*(1-1/p3)*(1-1/p4)…..(1-1/pn) φ(n)=n(11/p1)(11/p2)(11/p3)(11/p4)..(11/pn)
其中p1, p2……pn为n的所有质因数,n是不为0的整数。φ(1)=1(唯一和1互质的数就是1本身)。
###费马定理
若p是素数,a是正整数且不能被p整除,则
a p − 1 ≡ 1 ( m o d p ) a^{p-1} ≡ 1 (mod p) ap11modp
另一种有用的表示形式是:若p是素数且a是任意正整数,则:
a p ≡ a ( m o d p ) a^p ≡ a (mod p) apa(modp)
这两其实一样,就是考虑如果a可以被p整除的时候,余数为0,不为1而已

模算术里的求幂运算

RSA的加解密运算归结为求一个整数的模 n 整数次幂,如果先求出整数的幂,再对n取模,那么中间结果会非常大。幸运的是,正如前面的例子所示,我们可利用模算术的下列性质来计算模幂运算:
[ ( a m o d n ) × ( b m o d n ) ] m o d n = ( a × b ) m o d n [(a mod n) ×(b mod n)] mod n =(a×b) mod n [(amodn)×(bmodn)]modn=(a×b)modn
举例:
对于整数x和n,计算x^11 mod n。
由于 x 1 1 = x 1 + 2 + 8 = ( x ) ( x 2 ) ( x 8 ) x^11=x^{1+2+8}=(x)(x^2)(x^8) x11=x1+2+8=xx2x8)我们先计算
x m o d n , x 2 m o d n , x 4 m o d n , x 8 m o d n x mod n,x^2mod n,x^4mod n,x^8mod n xmodnx2modnx4modnx8modn再计算
[ ( x m o d n ) × ( x 2 m o d n ) × ( x 8 m o d n ) ] m o d n [(x mod n) ×(x^2 mod n ) ×(x^8 mod n)]mod n [xmodn)×(x2modn)×(x8modn)]modn

详细介绍:

只是做一个复习整理,具体的核心代码怎么实现,怎么更快运算,网上的各位大佬已经总结的很棒了,大家可以前往进一步学习推荐一个大佬总结的博客,之前做实验写代码的时候就是参考这个大佬的
RSA算法原理(一)
RSA算法原理(二)

RSA的安全性

RSA的安全性是基于分解大整数的困难性假定,之所以为假定是因为其困难性至今还未能证明。
若能将n分解为两个素数因子p,q,则可计算 φ ( n ) = ( p - 1 ) ( q - 1 ) φ(n)=(p-1)(q - 1) φ(n)=(p1)(q1) d = e - 1 m o d φ ( n ) d = e-1 mod φ(n) d=e1modφ(n)
因此,不难得出结论:破译RSA不会比大整数分解更加困难!

  • 对模n的长度必须足够长,至少为1024比特
  • p和q的长度应该相差不多;
  • p-1和q-1都应该包含大的素因子;
  • gcd(p-1,q-1)应该很小;
  • d < n 1 / 4 d<n^{1/4} d<n1/4
注意三个安全问题:
  • 用户之间不要共享模数n
  • 不同的用户选用的素数不能相同
  • 一般不能直接应用RSA进行加解密
对第一点的证明:

假定用户U1和U2共享模数为n,他们的加密密钥分别是e1和e2,且gcd(e1,e2)=1,则攻击者不需要解密密钥d,就可以恢复出明文,具体过程如下:
用户A分别向用户U1和U2发送明文m的加密信息,分别为: c 1 = m e 1 m o d n c_1=m^{e_1} mod n c1=me1modn c 2 = m e 2 m o d n c_2=m^{e_2} mod n c2=me2modn
g c d ( c 1 , n ) = 1 gcd(c_1,n)=1 gcd(c1,n)=1 g c d ( c 2 , n ) = 1 gcd(c_2,n)=1 gcd(c2,n)=1 g c d ( e 1 , e 2 ) = 1 ( 概 率 很 大 ) gcd(e_1,e_2)=1(概率很大) gcd(e1,e2)=1()则攻击者由扩展的欧几里德算法能找到两个整数s和t,满足: s e 1 + t e 2 = 1 s_{e1}+t_{e2}=1 se1+te2=1S和t有一个是负数,假定s是负数,由欧几里德算法可计算 c 1 − 1 m o d n c_1^{-1} mod n c11modn ( c 1 − 1 ) − s ∗ c 2 t = ( m − e 1 ) − s ∗ ( m − e 2 ) t = m ( s e 1 + t e 2 ) m o d n = m (c_1^{-1})^{-s}* c_2^t=(m^{-e_1})^{-s}* (m^{-e_2})^t=m(s^{e_1}+t^{e_2}) mod n=m (c11)sc2t=(me1)s(me2)t=m(se1+te2)modn=m

对第三点的补充:

由于RSA算法是决定性算法(即对相同的明文始终会给出相同的密文)和具有特殊的代数结构等原因,用RSA算法进行直接加密在很多环境下是不安全的。故在使用RSA进行加密前,需要对明文做某种预处理,一般是***进行随机化的填充***。

ElGamal公钥密码体制

诞生

ElGamal密码体制是T.ElGamal于1985年提出,是最有名的公钥密码体制之一,它的安全性是基于离散对数问题.

ElGamal公钥密码体制的原理

密钥的生成

选取大素数p, g ∈ Z p ∗ g∈Z_p^* gZp是一个本原元(生成元)。
p、g 作为系统参数所有用户共享。
系统中每个用户U都随机挑选一个整数x,2≤ x ≤ p-2,并计算:
y = g x ( m o d p ) y= g^x\pmod p y=gx(modp)
y作为用户U的公开密钥,而x作为用户U的秘密密钥

补充本原元的概念

在mod p(p是一个素数)下,根据欧拉定理,尽管每一个 g p − 1 ≡ 1 ( m o d p ) g^{p-1}\equiv 1\pmod p gp11(modp)但是并不一定是一个生成元,假设一个数g对于模p来说是原根,那么 g i ( m o d p ) g^i\pmod p gi(modp)的结果两两不同,且有 1 < g < p , 0 < = i < p 1<g<p,0<=i<p 1<g<p0<=i<p,那么g可以称为是模p的一个原根


生成元,本原元,原根都是一个意思

加密

  1. 用户A先把明文M编码为一个在 0 到(p-1)之间的整数m 作为传输的明文;
  2. 用户A挑选一个秘密随机数 r ( 2≤ r ≤ p-2 ),
    并计算: c 1 = g r ( m o d p ) c1= g^r \pmod p c1gr(modp)
  3. 用户A计算: c 2 = m ⋅ y r ( m o d p ) c2 = m· y^r \pmod p c2myr(modp)其中y是用户B的公开密钥;
  4. 用户A把二元组 (c1 ,c2) 作为其密文传送给用户B。

解密

用户B接收到密文二元组(c1 ,c2)后,做解密计算: m = c 2 ∗ ( c 1 x ) − 1 ( m o d p ) m=c_2*(c_1^x)^{-1}\pmod p m=c2(c1x)1(modp)

ElGamal算法特点:

  • “非确定性的”。由于密文依赖于执行加密过程的用户A所选择的随机数 r ,所以,加密相同的明文可能会产生不同的密文。
  • 密文空间大于明文空间。明文空间为Zp* ,而密文空间为 Zp* × Zp* 对于每个明文,其密文由2个Zp*上的元素组成。

你可能感兴趣的:(学科基础)