公钥密码体制
对称密钥的三大问题
密钥交换
密钥管理:每两个用户之间的密钥都不相同
抵赖行为:不承认发送过某条消息
单向陷门函数
希望可以找到一个密码体制,对于给定的加密ek ,除了消息接受者,求dk 在计算上不可行。其中ek 可公开,无需分享密钥。
单向函数:一个函数容易计算但求逆困难。(还没有一个函数没证明单向)
单向陷门函数:存在一个单向函数,该函数在具有特定知识(称为陷门)后容易求逆
单向函数定义
假定n=pq(p、q为不同的大素数),b为正整数,定义f:Zn →Zn ,f(x)=xb mod n
陷门:大数n的因式分解
若已知n的因式分解n=pq,则φ ( n ) \varphi(n) φ ( n ) =(p-1)(q-1)
若gcd(b,φ(n))=1,且ab≡ \equiv ≡ 1 mod φ(n)
f-1 :Zn →Zn ,f-1 (x)=xa mod n
公钥密码使用方式
用于加密:公钥加密私钥解密,无需交换密钥
用于认证:防止抵赖,如果要证明某文件为自己生成,则可以使用自己的私钥加密,其他人接收到之后通过公钥验证签名,用手中的所有公钥尝试,使用谁的公钥能够解密就是谁生成的文件
RSA算法
数学基础
欧拉定理:( a , n ) = 1 , a φ ( n ) ≡ 1 ( m o d n ) (a,n)=1,a^{\varphi(n)}\equiv 1\pmod n ( a , n ) = 1 , a φ ( n ) ≡ 1 ( m o d n )
费马小定理:a p ≡ a ( m o d p ) a^p\equiv a\pmod p a p ≡ a ( m o d p )
密码算法
n=pq,K={(n,p,q,e,d): ed≡ \equiv ≡ 1 mod φ(n)}
定义e k ( x ) = x e ( m o d n ) , d k ( y ) = y d ( m o d n ) , ( x , y ∈ Z n ) e_k(x)=x^e\pmod n,d_k(y)=y^d\pmod n,(x,y\in Z_n) e k ( x ) = x e ( m o d n ) , d k ( y ) = y d ( m o d n ) , ( x , y ∈ Z n ) ,(n,e)为公钥,(n,d)为私钥
参数生成
素性检测、公私钥对
加解密过程的快速实现:
平方-乘算法
要计算a b m o d n a^b\mod n a b m o d n :
b = ∑ i = 0 l − 1 b i 2 i , b i ∈ { 0 , 1 } , b l − 1 = 1 b = b l − 1 2 l − 1 + b l − 2 2 l − 2 + . . . + b 1 ⋅ 2 + b 0 = 2 ( 2 ( . . . ( 2 ( b l − 1 ) + b l − 2 ) + . . . ) + b 1 ) + b 0 a b = a ∑ i = 0 l − 1 b i 2 i = ( ( ( . . . ( 1 × a b l − 1 ) 2 × a b l − 2 ) 2 × . . . ) 2 × a b 1 ) 2 × a b 0 b=\sum_{i=0}^{l-1}b_i2^i,b_i\in\{0,1\},b_{l-1}=1\\
b=b_{l-1}2^{l-1}+b_{l-2}2^{l-2}+...+b_1\cdot 2+b_0\\
=2(2(...(2(b_{l-1})+b_{l-2})+...)+b_1)+b_0\\
a^b=a^{\sum_{i=0}^{l-1}b_i2^i}=(((...(1\times a^{b_{l-1}})^2\times a^{b_{l-2}})^2\times ...)^2\times a^{b_1})^2\times a^{b_0} b = i = 0 ∑ l − 1 b i 2 i , b i ∈ { 0 , 1 } , b l − 1 = 1 b = b l − 1 2 l − 1 + b l − 2 2 l − 2 + . . . + b 1 ⋅ 2 + b 0 = 2 ( 2 ( . . . ( 2 ( b l − 1 ) + b l − 2 ) + . . . ) + b 1 ) + b 0 a b = a ∑ i = 0 l − 1 b i 2 i = ( ( ( . . . ( 1 × a b l − 1 ) 2 × a b l − 2 ) 2 × . . . ) 2 × a b 1 ) 2 × a b 0
(实际上就是模平方重复法的变体)
如上图示例:
97262 ≡ \equiv ≡ 2659(mod 11413)
26592 ≡ \equiv ≡ 5634(mod 11413)
蒙哥马利算法
蒙哥马利变换
d=232 ,264 ,假设d=232
模N::k=32n比特奇数,IN=-N-1 mod 232
R=dn >N,(R,N)=1,a,b∈ZN
A=Mont(a) = aR mod N
MontInv(A) = AR-1 mod N
MontInv(Mont(a)) = a mod N
A = Mont(a), B = Mont(b)
MontMult(A,B)=ABR-1 = aRbRR-1 = abR mod N = Mont(ab mod N)
MontMult(A,MontMult(A,A))=Mont(a3 mod N)
MontMult(A,B) = ABR-1 mod N
T = AB, 2n位整数,T=(0t2n-1 t2n-2 …t1 t0 )
计算T’=T+N×((t0 ×IN) mod 232 )
(1) T’ = T mod N
(2) T’ = t0 +(N×IN)t0 = 0 mod 232
(3) T’ >> 32, T’ = T×232 mod N
令T=T’, 重复上述步骤n次,T×2-32n = TR-1 mod N
T’ = (0ctn-1 ’tn-2 ’…t0 ’),如果T’>N,返回T’-N,否则返回T’=(tn-1 ’tn-2 ’…t0 ’)
快速模幂运算ae mod N
中国剩余定理
把解密时的一个式子拆成两个式子来算(模p和q)
素数定理
π ( N ) ≈ N ln N \pi(N)\approx\frac{N}{\ln N}
π ( N ) ≈ ln N N
若n=pq,为1024比特,则p,q为512比特
1 ln 2 512 ≈ 1 355 \frac{1}{\ln 2^{512}}\approx\frac{1}{355} l n 2 5 1 2 1 ≈ 3 5 5 1 (为素数的概率)
素性检测
费马素性检测 :若p为素数,(a,p)=1,则ap-1 = 1 mod p
伪素数 :设n为奇合数,如果整数b,(b,n)=1,使得bn-1 =1 mod n,则称n为对于基b的伪素数
Euler伪素数 :设n为正奇合数,整数b,(b,n)=1,满足b p − 1 2 ≡ ( b n ) m o d n b^{\frac{p-1}{2}}\equiv (\frac{b}{n})\mod n b 2 p − 1 ≡ ( n b ) m o d n ,称n为对于基b的Euler伪素数
p-1=2s t,a p − 1 − 1 = ( a 2 s − 1 t + 1 ) ( a 2 s − 2 t + 1 ) . . . ( a t + 1 ) ( a t + 1 ) a^{p-1}-1=(a^{2^{s-1}t}+1)(a^{2^{s-2}t}+1)...(a^{t}+1)(a^{t}+1) a p − 1 − 1 = ( a 2 s − 1 t + 1 ) ( a 2 s − 2 t + 1 ) . . . ( a t + 1 ) ( a t + 1 )
则下列同余式中至少有一个成立:
a t ≡ − 1 m o d p , a 2 t ≡ − 1 m o d p , . . . , a 2 s − 1 t ≡ − 1 m o d p a^t\equiv -1\mod p, a^{2t}\equiv -1\mod p,...,a^{2^{s-1}t}\equiv -1\mod p a t ≡ − 1 m o d p , a 2 t ≡ − 1 m o d p , . . . , a 2 s − 1 t ≡ − 1 m o d p
强伪素数 :设n为奇合数,n-1=2s t,t为奇数,整数b与n互素,满足bt =1 mod n,或者存在r,0≤r<s,有b 2 r t ≡ − 1 m o d n b^{2^rt}\equiv -1\mod n b 2 r t ≡ − 1 m o d n ,称n为对于基b的强伪素数
Solovay-Strassen算法
随机选择整数a在1到n-1之间,x=( a n ) (\frac{a}{n}) ( n a ) ,若x=0则n为合数;若x ≡ a n − 1 2 ( m o d n ) x\equiv a^{\frac{n-1}{2}}\pmod n x ≡ a 2 n − 1 ( m o d n ) 则n是素数,否则为合数(计算雅可比符号)
判断具有1/2的错误概率(若n为素数则输出一定为素数,若n为合数则有1/2的概率输出为合数)
Miller-Rabin算法
n-1=2s t的形式,其中t为奇数
随机选择整数a在1到n-1之间
计算b = a t m o d n b=a^t\mod n b = a t m o d n
如果b ≡ 1 ( m o d n ) b\equiv 1\pmod n b ≡ 1 ( m o d n ) ,那么n为素数;否则进行下列循环:
for i=0 to s-1:
if b ≡ − 1 ( m o d n ) b\equiv -1\pmod n b ≡ − 1 ( m o d n ) ,then n是素数
else b=b2 mod n
若循环能结束则n为合数
若n为强伪素数,则输出可能为素数;若n为素数,则输出一定为素数,具有1/4的错误概率,优于Solovay-Strassen算法
AKS算法
确定性素性检测方法
理论基础:a ∈ Z , n ∈ N , n ≥ 2 , ( a , n ) = 1 a\in Z,n\in N,n\ge 2,(a,n)=1 a ∈ Z , n ∈ N , n ≥ 2 , ( a , n ) = 1 ,n是素数,当且仅当( x + a ) n = x n + a ( m o d n ) (x+a)^n=x^n+a\pmod n ( x + a ) n = x n + a ( m o d n )
该算法为该理论复杂度的改进:( x + a ) n = x n + a ( m o d x r − 1 , n ) (x+a)^n=x^n+a\pmod {x^r-1,n} ( x + a ) n = x n + a ( m o d x r − 1 , n )
算法的时间复杂度高于概率算法
若存在整数a>0且b>1,满足n=ab ,则输出合数
找出满足ord r ( n ) > log 2 n \operatorname {ord}_r(n)>\log_2n o r d r ( n ) > log 2 n 的最小的r
若对a≤r,1<gcd(a,n)<n,输出合数
若n≤r,输出素数
for a=1 to ⌊ φ ( r ) log n ⌋ \lfloor{\sqrt{\varphi(r)}\log n}\rfloor ⌊ φ ( r ) log n ⌋ do
if (x+a)n ≠xn +a (mod xr -1, n),输出合数
输出素数
共模攻击
给群组中每个人相同的公钥n,但指数e和d不同时可能产生共模攻击
对于群组内成员,即使不分解n也可以解密其他人消息
e 1 d 1 ≡ 1 m o d φ ( n ) , e 2 d 2 ≡ 1 m o d φ ( n ) e_1d_1\equiv 1\mod \varphi(n),e_2d_2\equiv 1\mod \varphi(n) e 1 d 1 ≡ 1 m o d φ ( n ) , e 2 d 2 ≡ 1 m o d φ ( n )
e 2 d 2 ′ ≡ 1 m o d ( e 1 d 1 − 1 ) ⇒ e 2 d 2 ′ ≡ 1 m o d φ ( n ) e_2d_2'\equiv 1\mod(e_1d_1-1)\Rightarrow e_2d_2'\equiv 1\mod \varphi(n) e 2 d 2 ′ ≡ 1 m o d ( e 1 d 1 − 1 ) ⇒ e 2 d 2 ′ ≡ 1 m o d φ ( n )
(自己有e 1 , d 1 e_1,d_1 e 1 , d 1 ,因此可以计算d 2 ′ d_2' d 2 ′ )
群组外人员如果截获到发送给群组不同成员的同一消息,而两个加密指数互素,则可以直接恢复消息
令m为明文消息,加密指数为e 1 , e 2 e_1,e_2 e 1 , e 2 ,且二者互素,故存在r,s使得r e 1 + s e 2 = 1 re_1+se_2=1 r e 1 + s e 2 = 1 ,假设r为负数
则( c 1 − 1 ) − r c 2 s = m r e 1 + s e 2 = m m o d n (c_1^{-1})^{-r}c_2^s=m^{re_1+se_2}=m\mod n ( c 1 − 1 ) − r c 2 s = m r e 1 + s e 2 = m m o d n
小加密指数攻击
若选择的e较小(如3),则加密会很快
Coppersmith定理攻击 :n为大整数,f为次数为e的多项式,可以在log n时间内有效计算出f(x)=0 mod n的小于n 1 e n^{\frac{1}{e}} n e 1 的解。
应避免使用小的加密指数,e最少应选取216 +1=65537
在短消息加密之前应该首先填充
总结
教科书式的RSA方案是不安全的,速度慢是其主要缺点(硬件实现比DES慢1000倍,软件慢100倍,选择特定的e值能够大大加快RSA的速度)
可用于加密、密钥交换和数字签名
Rabin密码体制
设n=pq,其中p,q为素数,均为4k+3型素数
P=C=Zn ,且定义K={(n,p,q)}
对于k=(n,p,q),定义
e k ( x ) = x 2 ( m o d n ) , d k ( y ) = y ( m o d n ) e_k(x)=x^2\pmod n, d_k(y)=\sqrt y\pmod n e k ( x ) = x 2 ( m o d n ) , d k ( y ) = y ( m o d n )
(x,y∈Zn ),其中n为公钥,p、q为私钥
这是一个单向陷门函数,陷门为n的分解。f(x)=x2 mod n
公开密钥算法
加密:C = E K p u b ( P ) C=E_{K_{pub}}(P) C = E K p u b ( P )
解密:P = D K p r v ( C ) P=D_{K_{prv}}(C) P = D K p r v ( C )
两个密钥不能相互推导(或推导的难度不亚于密码分析)
其中一个密钥公开(K p u b K_{pub} K p u b ),另一个密钥保密(K p r v K_{prv} K p r v )
每一个用户掌握一个私钥,并将相应的公钥放在公共目录中
问题:如何让别人正确知道你的公钥?(如何保证你发出的公钥不被篡改/如何证明一个公钥是不是你的?)
答案:通过可信授权中心(PKI),每个人将自己的公钥发给PKI,由PKI为该公钥签名,相当于提供一个证书,在将这个有签名的公钥返还给用户。
离散对数问题
对于乘法群( G , ⋅ ) (G,\cdot) ( G , ⋅ ) ,一个n阶元素a∈G和β∈<a>
问题:找到唯一非负整数i不大于n-1,满足ai =β
将整数i记为ind α ( β ) \operatorname {ind}_{\alpha}(\beta) i n d α ( β ) ,称为β的离散对数
Diffie-Hellman算法
交换素数p和本原元g
Alice和Bob选择各自的私钥,Alice向Bob发送X=gx mod p,Bob向Alice发送Y=gy mod p。
之后Alice计算k=Yx mod p,Bob计算k=Xy mod p,二者计算的值相等,实现密钥交换。
上述的密钥交换方案不安全。容易遭受中间人攻击。
如果Eve能够截获两者发送的X和Y,他用自己的密钥进行计算然后分别发送给Alice和Bob,这样A和B接收到的就是Eve的值。
ElGamal密码体制
假设p为一个大素数,使得p构成乘法群上的离散对数问题难解。令α∈Zp 是一个本原元,令P=Zp *,C=Zp ×Zp ,定义K={(p,α,a,β): β=αa mod p}
其中p,α,β为公钥,a为私钥。
对k=(p,α,a,β)以及一个秘密的随机数r∈Zp-1 ,定义ek (x,r)=(y1 , y2 )
其中y1 =αr mod p, y2 =xβr mod p
定义dk (y1 , y2 )=y2 (y1 a )-1 mod p
注意r在加密的时候需要随机选择,加密后应立即销毁不能在信道上传输。
加密运算具有不确定性。
注意三个公钥中只有β与私钥a直接相关。
椭圆曲线
设a,b∈R是满足4 a 3 + 27 b 2 ≠ 0 4a^3+27b^2\ne 0 4 a 3 + 2 7 b 2 = 0 的实常数,方程y 2 = x 3 + a x + b y^2=x^3+ax+b y 2 = x 3 + a x + b 所有解(x, y)∈R×R连同一个无穷远点O O O 组成的集合E称为一个非奇异椭圆曲线。
从函数图像来看,椭圆曲线有两种,一种有一条线,一种有两条线
Weierstrass方程
定义在代数闭域K ˉ \bar K K ˉ 上射影平面坐标的一般方程
Y 2 Z + a 1 X Y Z + a 3 Y Z 2 = X 3 + a 2 X 2 Z + a 4 X Z 2 + a 6 Z 3 ( a 1 , a 2 , a 3 , a 4 , a 6 ∈ K ˉ ) Y^2Z+a_1XYZ+a_3YZ^2=X^3+a_2X^2Z+a_4XZ^2+a_6Z^3 (a_1,a_2,a_3,a_4,a_6\in\bar K) Y 2 Z + a 1 X Y Z + a 3 Y Z 2 = X 3 + a 2 X 2 Z + a 4 X Z 2 + a 6 Z 3 ( a 1 , a 2 , a 3 , a 4 , a 6 ∈ K ˉ )
K上的射影平面P2 (K)是K3 /{(0, 0, 0)}上关系~的等价类集合,每个等价类记作(X:Y:Z)
(X1 ,Y1 ,Z1 ) ~ (X2 ,Y2 ,Z2 )
F ( X , Y , Z ) = Y 2 Z + a 1 X Y Z + a 3 Y Z 2 − X 3 − a 2 X 2 Z − a 4 X Z 2 − a 6 Z 3 = 0 F(X,Y,Z)=Y^2Z+a_1XYZ+a_3YZ^2-X^3-a_2X^2Z-a_4XZ^2-a_6Z^3=0 F ( X , Y , Z ) = Y 2 Z + a 1 X Y Z + a 3 Y Z 2 − X 3 − a 2 X 2 Z − a 4 X Z 2 − a 6 Z 3 = 0
非奇异:∂ F ∂ X , ∂ F ∂ Y , ∂ F ∂ Z \frac{\partial F}{\partial X},\frac{\partial F}{\partial Y},\frac{\partial F}{\partial Z} ∂ X ∂ F , ∂ Y ∂ F , ∂ Z ∂ F 在P点至少有一个非0。
椭圆曲线E:非奇异Weierstrass方程的所有P2 (K ˉ \bar K K ˉ )的解
y2 +a1 xy+a3 y=x3 +a2 x2 +a4 x+a6
(E,+)是一个以无穷远点0为单位元的阿贝尔群,加法规则为:
P + 0 = 0 + P = P − 0 = 0 P = ( x 1 , y 1 ) ≠ 0 , − P = ( x 1 , − y 1 − a 1 x 1 − a 3 ) Q = − P , P + Q = 0 P , Q ≠ 0 , Q ≠ − P , P + Q = − R P+0=0+P=P\\
-0=0\\
P=(x_1,y_1)\ne 0, -P=(x_1,-y_1-a_1x_1-a_3)\\
Q=-P,P+Q=0
P,Q\ne 0,Q\ne -P,P+Q=-R P + 0 = 0 + P = P − 0 = 0 P = ( x 1 , y 1 ) = 0 , − P = ( x 1 , − y 1 − a 1 x 1 − a 3 ) Q = − P , P + Q = 0 P , Q = 0 , Q = − P , P + Q = − R
其中R为直线PQ或过点P的切线与椭圆曲线的第三个交点
(当P和Q重合时,直线是曲线的切线,把y作为因变量对x求导计算d y d x \frac{dy}{dx} d x d y )
椭圆曲线密码(ECC)
阶:有限域Fq 上的椭圆曲线E(Fq )由点组成,其上点的数量即为#E(Fq )。称为椭圆曲线的阶。
倍点运算:P+P
椭圆曲线离散对数问题:已知曲线E(Fq ),阶为n的点G∈E(Fq ),P∈<G>,椭圆曲线离散对数问题是指确定整数k∈[0,…,n-1]使得P=KG成立。
安全参数的选取:
(q, a, b, G, n, h)
对于特征为p的有限域Fq
其中a、b为椭圆曲线的参数,G为基点,阶为n,有限域Fq 的特征为p
F p ( p > 3 ) : y 2 = x 3 + a x + b , a , b ∈ F p , ( 4 a 3 + 27 b 2 ) m o d p ≠ 0 F_p(p>3): y^2=x^3+ax+b,a,b\in F_p,(4a^3+27b^2)\mod p\ne 0 F p ( p > 3 ) : y 2 = x 3 + a x + b , a , b ∈ F p , ( 4 a 3 + 2 7 b 2 ) m o d p = 0
F 2 m ( p = 2 ) : y 2 + x y = x 3 + a x + b , a , b ∈ F 2 m , b ≠ 0 F_{2^m}(p=2): y^2+xy=x^3+ax+b,a,b\in F_{2^m}, b\ne 0 F 2 m ( p = 2 ) : y 2 + x y = x 3 + a x + b , a , b ∈ F 2 m , b = 0
存在弱椭圆曲线:超奇异曲线(p ∣ q + 1 − # E ( F q ) p|q+1-\#E(F_q) p ∣ q + 1 − # E ( F q ) )和异常曲线(# E ( F q ) = p \#E(F_q)=p # E ( F q ) = p )
可以基于ECC构建DH密钥交换协议 :首先选择公开参数( q , F q , E , G , n ) (q,F_q,E,G,n) ( q , F q , E , G , n ) ,Alice发送P a = a G P_a=aG P a = a G ,Bob发送P b = b G P_b=bG P b = b G ,二者交换后计算分别得到S = a b G S=abG S = a b G 即为私钥。(仍然易受到中间人攻击)
也可以基于ECC构建ElGamal密码体制 :首先选择公开参数( q , F q , E , G , n ) , A : ( d A , P A ) , P A = d A G (q,F_q,E,G,n), A:(d_A,P_A),P_A=d_AG ( q , F q , E , G , n ) , A : ( d A , P A ) , P A = d A G
B发送明文消息m给A需要加密:
随机选择r ∈ Z n r\in Z_n r ∈ Z n
计算C 1 = r G , Q = r P A ( Q x ≠ 0 ) ; C 2 = m Q x C_1=rG, Q=rP_A(Q_x\ne 0);C_2=mQ_x C 1 = r G , Q = r P A ( Q x = 0 ) ; C 2 = m Q x
发送( C 1 , C 2 ) (C_1,C_2) ( C 1 , C 2 ) 给A
解密:d A C 1 = d A r G = r P A = Q , m = C 2 Q x − 1 d_AC_1=d_ArG=rP_A=Q,m=C_2Q_x^{-1} d A C 1 = d A r G = r P A = Q , m = C 2 Q x − 1
数字签名
签名方案:一个签名方案由一个五元组构成(P,A,K,S,V),其中
P是所有可能的消息组成的有限集
A是所有可能的签名组成的有限集
K是所有可能的密钥组成的有限集(密钥空间)
对于每一个k∈K,有一个秘密的签名函数sigk ∈S和一个相应的公开的验证函数verk ∈V,sigk :P→A,verk :P×A→{true, false},满足:
当y=sigk (x)时,verk (x,y)=true,否则为false
RSA签名方案
设n=pq,p,q为素数,P=A=Zn ,定义K={(n,p,q,e,d): ed ≡ \equiv ≡ 1 mod φ(n)}
对于k=(n,p,q,e,d),定义sigk (x)=xd mod n和verk (x,y)=true ↔ x=ye mod n
(x,y∈Zn ),(n,e)为公钥,(n,d)为私钥
存在性伪造问题 :任何人都可以伪造他人的签名y,对应消息为x=ek (y)=ye ,一般这个消息是无意义的,但要防止攻击者计算大量的ek (y),找出有意义的值从而伪造签名。
可以通过给消息添加可以识别的冗余信息或者对消息摘要后签名
选择密文攻击 :
假设A响应E的任何签名要求:c = m e m o d n c=m^e mod n c = m e m o d n
x = r e m o d n , y = x c m o d n x=r^e\mod n,y=xc\mod n x = r e m o d n , y = x c m o d n
y d m o d n = ( x c ) d m o d n = r c d m o d n y^d\mod n=(xc)^d\mod n=rc^d\mod n y d m o d n = ( x c ) d m o d n = r c d m o d n
r − 1 y d m o d n = r − 1 r c d m o d n = m r^{-1}y^d\mod n=r^{-1}rc^d\mod n=m r − 1 y d m o d n = r − 1 r c d m o d n = m
若E想得到A关于消息m的签名,m = m 1 m 2 m o d n m=m_1m_2\mod n m = m 1 m 2 m o d n ,可以通过m1 和m2 的签名构造m的签名。
m d m o d n = ( m 1 m 2 ) d m o d n = ( m 1 d m o d n ) ( m 2 d m o d n ) m o d n m^d\mod n=(m_1m_2)^d\mod n=(m_1^d\mod n)(m_2^d\mod n)\mod n m d m o d n = ( m 1 m 2 ) d m o d n = ( m 1 d m o d n ) ( m 2 d m o d n ) m o d n
因此不要对陌生消息签名,签名之前先对消息求摘要、身份认证。
签名和公钥加密结合的方案:
第一种方案:先签名后加密——y = s i g A l i c e ( x ) , z = e B o b ( x , y ) y=sig_{Alice}(x),z=e_{Bob}(x,y) y = s i g A l i c e ( x ) , z = e B o b ( x , y )
第二种方案:先加密后签名——z = e B o b ( x ) , y = s i g A l i c e ( z ) z=e_{Bob}(x),y=sig_{Alice}(z) z = e B o b ( x ) , y = s i g A l i c e ( z )
第二种方案可能存在伪造签名混淆发送者的问题,因此采用第一种方案更好。
ElGamal签名方案 :
设p为一个大素数,使得( Z p ∗ , ⋅ ) (Z_p^*, \cdot) ( Z p ∗ , ⋅ ) 上的离散对数问题难解。令α ∈ Z p ∗ \alpha\in Z_p^* α ∈ Z p ∗ 是一个本原元,令P = Z p ∗ , A = Z p ∗ × Z p − 1 P=Z_p^*,A=Z_p^*\times Z_{p-1} P = Z p ∗ , A = Z p ∗ × Z p − 1 ,定义K = { ( p , α , a , β ) : β = α a m o d p } K=\{(p,\alpha,a,\beta):\beta=\alpha^a\mod p\} K = { ( p , α , a , β ) : β = α a m o d p }
其中p , α , β p,\alpha,\beta p , α , β 为公钥,a a a 为私钥
对k = ( p , α , a , β ) k=(p,\alpha,a,\beta) k = ( p , α , a , β ) 以及一个秘密的随机数r ∈ Z p − 1 ∗ r\in Z_{p-1}^* r ∈ Z p − 1 ∗ ,定义s i g k ( x , r ) = ( γ , δ ) sig_k(x,r)=(\gamma,\delta) s i g k ( x , r ) = ( γ , δ )
其中γ = α r m o d p , δ = ( x − a γ ) r − 1 m o d p − 1 \gamma=\alpha^r\mod p,\delta=(x-a\gamma)r^{-1}\mod p-1 γ = α r m o d p , δ = ( x − a γ ) r − 1 m o d p − 1
对于x , γ ∈ Z p ∗ , δ ∈ Z p − 1 x,\gamma\in Z_p^*,\delta\in Z_{p-1} x , γ ∈ Z p ∗ , δ ∈ Z p − 1
定义v e r ( x , ( y , δ ) ) = t r u e ⇔ β γ γ δ ≡ α x m o d p ver(x,(y,\delta))=true\Leftrightarrow \beta^\gamma\gamma^\delta\equiv\alpha^x\mod p v e r ( x , ( y , δ ) ) = t r u e ⇔ β γ γ δ ≡ α x m o d p
容易证明β γ γ δ ≡ α a γ + r ( x − a γ ) r − 1 m o d p − 1 ≡ α x m o d p \beta^\gamma\gamma^\delta\equiv\alpha^{a\gamma+r(x-a\gamma)r^{-1}\mod p-1}\equiv\alpha^x\mod p β γ γ δ ≡ α a γ + r ( x − a γ ) r − 1 m o d p − 1 ≡ α x m o d p
数字签名标准
DSA算法,签名比验证快很多,不能加密和密钥分配,专用于数字签名,比RSA慢
设p是一个大素数,使得( Z p ∗ , ⋅ ) (Z_p^*, \cdot) ( Z p ∗ , ⋅ ) 上的离散对数问题难解。令α ∈ Z p ∗ \alpha\in Z_p^* α ∈ Z p ∗ 是一个q阶元素(q为素数),< α > <\alpha> < α > 上的离散对数问题也难解。(整数k与p-1互素,k∈[0, p-2],q|p-1)
γ = α k m o d p , δ = ( x + a γ ) k − 1 m o d p − 1 ( k ∈ Z p − 1 ∗ ) ∵ k δ ≡ x + a γ m o d p − 1 , ∴ α k δ ≡ α x + a γ m o d p ⇒ α x β γ ≡ γ δ m o d p , δ = ( x + a γ ) k − 1 m o d q γ ′ = γ m o d q = ( α k m o d p ) m o d q , δ = ( x + a γ ′ ) k − 1 m o d q α x β γ ′ ≡ γ δ m o d p γ = ( α x β γ ′ ) δ − 1 m o d q m o d p ⇒ γ = ( α x δ − 1 m o d q β γ ′ δ − 1 m o d q m o d p ) m o d q = γ ′ \gamma=\alpha^k\mod p,\delta=(x+a\gamma)k^{-1}\mod p-1(k\in Z_{p-1}^*)\\
\because k\delta\equiv x+a\gamma\mod p-1,\therefore\alpha^{k\delta}\equiv\alpha^{x+a\gamma}\mod p\\
\Rightarrow\alpha^x\beta^\gamma\equiv\gamma^\delta\mod p,\delta=(x+a\gamma)k^{-1}\mod q\\
\gamma'=\gamma\mod q=(\alpha^k\mod p)\mod q,\delta=(x+a\gamma')k^{-1}\mod q\\
\alpha^x\beta^{\gamma'}\equiv\gamma^\delta\mod p\\
\gamma=(\alpha^x\beta^{\gamma'})^{\delta^{-1}\mod q}\mod p\Rightarrow \gamma=
(\alpha^{x\delta^{-1}\mod q}\beta^{\gamma'\delta^{-1}\mod q}\mod p)\mod q=\gamma' γ = α k m o d p , δ = ( x + a γ ) k − 1 m o d p − 1 ( k ∈ Z p − 1 ∗ ) ∵ k δ ≡ x + a γ m o d p − 1 , ∴ α k δ ≡ α x + a γ m o d p ⇒ α x β γ ≡ γ δ m o d p , δ = ( x + a γ ) k − 1 m o d q γ ′ = γ m o d q = ( α k m o d p ) m o d q , δ = ( x + a γ ′ ) k − 1 m o d q α x β γ ′ ≡ γ δ m o d p γ = ( α x β γ ′ ) δ − 1 m o d q m o d p ⇒ γ = ( α x δ − 1 m o d q β γ ′ δ − 1 m o d q m o d p ) m o d q = γ ′
验证γ = ( α x δ − 1 m o d q β γ ′ δ − 1 m o d q m o d p ) m o d q = γ ′ \gamma=
(\alpha^{x\delta^{-1}\mod q}\beta^{\gamma'\delta^{-1}\mod q}\mod p)\mod q=\gamma' γ = ( α x δ − 1 m o d q β γ ′ δ − 1 m o d q m o d p ) m o d q = γ ′ 是否成立。成立则数字签名有效。
s i g K ( x , k ) = ( γ , δ ) , γ = ( α k m o d p ) m o d q , δ = ( SHA-1 ( x ) + a γ ) k − 1 m o d q e 1 = SHA-1 ( x ) δ − 1 m o d q , e 2 = γ δ − 1 m o d q v e r K ( x , ( γ , δ ) ) = t r u e ⇔ ( α e 1 β e 2 m o d p ) m o d q = γ sig_K(x,k)=(\gamma, \delta), \gamma=(\alpha^k\mod p)\mod q,\delta=(\operatorname {SHA-1}(x)+a\gamma)k^{-1}\mod q\\
e_1=\operatorname {SHA-1}(x)\delta^{-1}\mod q,e_2=\gamma\delta^{-1}\mod q\\
ver_K(x,(\gamma,\delta))=true\Leftrightarrow(\alpha^{e_1}\beta^{e_2}\mod p)\mod q=\gamma s i g K ( x , k ) = ( γ , δ ) , γ = ( α k m o d p ) m o d q , δ = ( S H A - 1 ( x ) + a γ ) k − 1 m o d q e 1 = S H A - 1 ( x ) δ − 1 m o d q , e 2 = γ δ − 1 m o d q v e r K ( x , ( γ , δ ) ) = t r u e ⇔ ( α e 1 β e 2 m o d p ) m o d q = γ
椭圆曲线数字签名
p是一个大素数,E定义在Fp 上的椭圆曲线。设A是E上阶为q(素数)的一个点,使得在<A>上的离散对数问题是难处理的。设P={0,1}*,A=Zq *×Zq *,定义K={(p,q,E,A,m,B): B=mA}
其中0≤m≤q-1,值p,q,E,A,B为公钥,m为私钥。
对于K和一个秘密的随机数k,1≤k≤q-1,定义
s i g K ( x , k ) = ( r , s ) sig_K(x,k)=(r,s)
s i g K ( x , k ) = ( r , s )
其中
PGP安全协议
一种以用户为中心的可提供机密性和鉴别的安全协议。
若需要签名和加密,则先签名再加密,如需压缩则加密后压缩:Z ( S i g ( H ( M ) , k R a ) ∣ ∣ M ) Z(Sig(H(M),kR_a)||M) Z ( S i g ( H ( M ) , k R a ) ∣ ∣ M )