公钥密码也称为非对称密码。使用公钥密码的每一个用户都分别拥有两个密钥:加密密钥与解密密钥,它们两者并不相同,并且由加密密钥得到解密密钥在计算上是不可行的。每一个用户的加密密钥都是公开的。
对称密码 | 公钥密码 |
---|---|
一般要求 | 一般要求 |
1.加密和解密使用相同的密钥和相同的算法 | 1.同一算法用于加密和解密,但加密和解密使用不同密钥 |
2.收发双方必须共享密钥 | 2.发送方拥有加密或解密密钥,而接收方拥有另一密钥 |
安全性安全 | 安全性要求 |
1.密钥必须是保密 | 1.两个密钥之一必须是保密的 |
2.若没有其他信息,则解密消息是不可能或至少是不可行的 | 2.若没有其他信息,则解密信息是不可能或至少是不可行的 |
3.知道算法和若干密文不足以确定密钥 | 3.知道算法和其中一个密钥以及若干密文不足以确定另一密钥 |
##常见的两个关于公钥密码的误区
关于公钥密码的常见的几种误区
单向陷门函数可以被定义为如下函数f:
目前人们主要是基于如下的数学上的困难问题来设计单向函数和公钥密码体制:
RSA公钥算法是由 MIT (麻省理工学院, Massachusetts Institute of Technology) 的Rivest, Shamir和Adleman在1978年提出来的。RSA方案是被最广泛接受并实现的通用公开密钥密码算法,目前已成为公钥密码的国际标准。该算法的数学基础是初等数论中的欧拉定理,其安全性建立在大整数因子分解的困难性之上。
附一张ppt提供的这三人的合影,ummmm,去网上对比了下,没问题~
PS:吐槽一下,非对称真的比对称好理解很多来着~
p
,q
,(p,q为互异素数,需要保密),e
使 g c d ( φ ( n ) , e ) = 1 , 1 < e < φ ( n ) gcd(φ(n),e) =1, 1<e<φ(n) gcd(φ(n),e)=1,1<e<φ(n){e,n}
; 私钥为{d,n}
明文:M, 密文 C = p o w ( M , e , n ) C = pow(M, e, n) C=pow(M,e,n)解释下,M的e次方对n取余,一般M为明文的10进制形式
密文C, 明文 M = p o w ( C , d , n ) M = pow(C, d, n) M=pow(C,d,n)
设明文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。
"欧拉定理"指的是:
如果两个正整数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∗(1−1/p1)∗(1−1/p2)∗(1−1/p3)∗(1−1/p4)…..(1−1/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) ap−1≡1(modp)
另一种有用的表示形式是:若p是素数且a是任意正整数,则:
a p ≡ a ( m o d p ) a^p ≡ a (mod p) ap≡a(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=(x)(x2)(x8)我们先计算
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 xmodn,x2modn,x4modn,x8modn再计算
[ ( 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的安全性是基于分解大整数的困难性假定,之所以为假定是因为其困难性至今还未能证明。
若能将n分解为两个素数因子p,q,则可计算 φ ( n ) = ( p - 1 ) ( q - 1 ) φ(n)=(p-1)(q - 1) φ(n)=(p-1)(q-1) d = e - 1 m o d φ ( n ) d = e-1 mod φ(n) d=e-1modφ(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 c1−1modn则 ( 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 (c1−1)−s∗c2t=(m−e1)−s∗(m−e2)t=m(se1+te2)modn=m
由于RSA算法是决定性算法(即对相同的明文始终会给出相同的密文)和具有特殊的代数结构等原因,用RSA算法进行直接加密在很多环境下是不安全的。故在使用RSA进行加密前,需要对明文做某种预处理,一般是***进行随机化的填充***。
ElGamal密码体制是T.ElGamal于1985年提出,是最有名的公钥密码体制之一,它的安全性是基于离散对数问题.
选取大素数p, g ∈ Z p ∗ g∈Z_p^* g∈Zp∗是一个本原元(生成元)。
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 gp−1≡1(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<p,0<=i<p,那么g可以称为是模p的一个原根
生成元,本原元,原根都是一个意思
用户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)