公钥密码体制

对称密钥的三大问题

  1. 密钥交换
  2. 密钥管理:每两个用户之间的密钥都不相同
  3. 抵赖行为:不承认发送过某条消息

单向陷门函数

希望可以找到一个密码体制,对于给定的加密ek,除了消息接受者,求dk在计算上不可行。其中ek可公开,无需分享密钥。
单向函数:一个函数容易计算但求逆困难。(还没有一个函数没证明单向)
单向陷门函数:存在一个单向函数,该函数在具有特定知识(称为陷门)后容易求逆

单向函数定义

假定n=pq(p、q为不同的大素数),b为正整数,定义f:Zn→Zn,f(x)=xb mod n
陷门:大数n的因式分解
若已知n的因式分解n=pq,则APP公钥 和 MD5指纹_因式分解=(p-1)(q-1)
若gcd(b,φ(n))=1,且abAPP公钥 和 MD5指纹_学习_02 1 mod φ(n)
f-1:Zn→Zn,f-1(x)=xa mod n

公钥密码使用方式

用于加密:公钥加密私钥解密,无需交换密钥
用于认证:防止抵赖,如果要证明某文件为自己生成,则可以使用自己的私钥加密,其他人接收到之后通过公钥验证签名,用手中的所有公钥尝试,使用谁的公钥能够解密就是谁生成的文件

RSA算法

数学基础

欧拉定理:APP公钥 和 MD5指纹_因式分解_03
费马小定理:APP公钥 和 MD5指纹_公钥密码_04

密码算法

n=pq,K={(n,p,q,e,d): edAPP公钥 和 MD5指纹_学习_02 1 mod φ(n)}
定义APP公钥 和 MD5指纹_学习_06,(n,e)为公钥,(n,d)为私钥

参数生成

素性检测、公私钥对
加解密过程的快速实现:

  • 平方-乘算法
  • 蒙哥马利算法
  • 中国剩余定理加速解密

平方-乘算法

要计算APP公钥 和 MD5指纹_单向函数_07

APP公钥 和 MD5指纹_APP公钥 和 MD5指纹_08

(实际上就是模平方重复法的变体)

APP公钥 和 MD5指纹_学习_09


如上图示例:

97262APP公钥 和 MD5指纹_学习_02 2659(mod 11413)

26592APP公钥 和 MD5指纹_学习_02

蒙哥马利算法

蒙哥马利变换
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-1t2n-2…t1t0)
计算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)

素数定理

APP公钥 和 MD5指纹_因式分解_12
若n=pq,为1024比特,则p,q为512比特
APP公钥 和 MD5指纹_学习_13(为素数的概率)

素性检测

费马素性检测:若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,满足APP公钥 和 MD5指纹_APP公钥 和 MD5指纹_14,称n为对于基b的Euler伪素数

p-1=2st,APP公钥 和 MD5指纹_学习_15
则下列同余式中至少有一个成立:
APP公钥 和 MD5指纹_学习_16
强伪素数:设n为奇合数,n-1=2st,t为奇数,整数b与n互素,满足bt=1 mod n,或者存在r,0≤r<s,有APP公钥 和 MD5指纹_公钥密码_17,称n为对于基b的强伪素数

Solovay-Strassen算法
随机选择整数a在1到n-1之间,x=APP公钥 和 MD5指纹_公钥密码_18,若x=0则n为合数;若APP公钥 和 MD5指纹_因式分解_19则n是素数,否则为合数(计算雅可比符号)
判断具有1/2的错误概率(若n为素数则输出一定为素数,若n为合数则有1/2的概率输出为合数)

Miller-Rabin算法
n-1=2st的形式,其中t为奇数
随机选择整数a在1到n-1之间
计算APP公钥 和 MD5指纹_APP公钥 和 MD5指纹_20
如果APP公钥 和 MD5指纹_公钥密码_21,那么n为素数;否则进行下列循环:
for i=0 to s-1:
if APP公钥 和 MD5指纹_APP公钥 和 MD5指纹_22,then n是素数
else b=b2 mod n
若循环能结束则n为合数

若n为强伪素数,则输出可能为素数;若n为素数,则输出一定为素数,具有1/4的错误概率,优于Solovay-Strassen算法

AKS算法
确定性素性检测方法
理论基础:APP公钥 和 MD5指纹_APP公钥 和 MD5指纹_23,n是素数,当且仅当APP公钥 和 MD5指纹_学习_24
该算法为该理论复杂度的改进:APP公钥 和 MD5指纹_因式分解_25
算法的时间复杂度高于概率算法

  • 若存在整数a>0且b>1,满足n=ab,则输出合数
  • 找出满足APP公钥 和 MD5指纹_单向函数_26的最小的r
  • 若对a≤r,1<gcd(a,n)<n,输出合数
  • 若n≤r,输出素数
  • for a=1 to APP公钥 和 MD5指纹_学习_27 do
  • if (x+a)n≠xn+a (mod xr-1, n),输出合数
  • 输出素数

共模攻击

给群组中每个人相同的公钥n,但指数e和d不同时可能产生共模攻击

  • 对于群组内成员,即使不分解n也可以解密其他人消息
    APP公钥 和 MD5指纹_公钥密码_28
    APP公钥 和 MD5指纹_因式分解_29
    (自己有APP公钥 和 MD5指纹_学习_30,因此可以计算APP公钥 和 MD5指纹_公钥密码_31
  • 群组外人员如果截获到发送给群组不同成员的同一消息,而两个加密指数互素,则可以直接恢复消息
    令m为明文消息,加密指数为APP公钥 和 MD5指纹_APP公钥 和 MD5指纹_32,且二者互素,故存在r,s使得APP公钥 和 MD5指纹_学习_33,假设r为负数
    APP公钥 和 MD5指纹_因式分解_34

小加密指数攻击

若选择的e较小(如3),则加密会很快
Coppersmith定理攻击:n为大整数,f为次数为e的多项式,可以在log n时间内有效计算出f(x)=0 mod n的小于APP公钥 和 MD5指纹_APP公钥 和 MD5指纹_35的解。
应避免使用小的加密指数,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),定义
APP公钥 和 MD5指纹_公钥密码_36
(x,y∈Zn),其中n为公钥,p、q为私钥

这是一个单向陷门函数,陷门为n的分解。f(x)=x2 mod n

公开密钥算法

加密:APP公钥 和 MD5指纹_公钥密码_37
解密:APP公钥 和 MD5指纹_学习_38
两个密钥不能相互推导(或推导的难度不亚于密码分析)
其中一个密钥公开(APP公钥 和 MD5指纹_因式分解_39),另一个密钥保密(APP公钥 和 MD5指纹_学习_40
每一个用户掌握一个私钥,并将相应的公钥放在公共目录中

问题:如何让别人正确知道你的公钥?(如何保证你发出的公钥不被篡改/如何证明一个公钥是不是你的?)
答案:通过可信授权中心(PKI),每个人将自己的公钥发给PKI,由PKI为该公钥签名,相当于提供一个证书,在将这个有签名的公钥返还给用户。

离散对数问题

对于乘法群APP公钥 和 MD5指纹_学习_41,一个n阶元素a∈G和β∈<a>
问题:找到唯一非负整数i不大于n-1,满足ai
将整数i记为APP公钥 和 MD5指纹_公钥密码_42,称为β的离散对数

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)
其中y1r mod p, y2=xβr mod p
定义dk(y1, y2)=y2(y1a)-1 mod p
注意r在加密的时候需要随机选择,加密后应立即销毁不能在信道上传输。
加密运算具有不确定性。
注意三个公钥中只有β与私钥a直接相关。

椭圆曲线

设a,b∈R是满足APP公钥 和 MD5指纹_因式分解_43的实常数,方程APP公钥 和 MD5指纹_因式分解_44所有解(x, y)∈R×R连同一个无穷远点APP公钥 和 MD5指纹_公钥密码_45组成的集合E称为一个非奇异椭圆曲线。

从函数图像来看,椭圆曲线有两种,一种有一条线,一种有两条线

Weierstrass方程

定义在代数闭域APP公钥 和 MD5指纹_APP公钥 和 MD5指纹_46上射影平面坐标的一般方程
APP公钥 和 MD5指纹_因式分解_47
K上的射影平面P2(K)是K3/{(0, 0, 0)}上关系~的等价类集合,每个等价类记作(X:Y:Z)
(X1,Y1,Z1) ~ (X2,Y2,Z2)
APP公钥 和 MD5指纹_因式分解_48
非奇异:APP公钥 和 MD5指纹_因式分解_49在P点至少有一个非0。

椭圆曲线E:非奇异Weierstrass方程的所有P2(APP公钥 和 MD5指纹_APP公钥 和 MD5指纹_46)的解
y2+a1xy+a3y=x3+a2x2+a4x+a6

(E,+)是一个以无穷远点0为单位元的阿贝尔群,加法规则为:

APP公钥 和 MD5指纹_公钥密码_51

其中R为直线PQ或过点P的切线与椭圆曲线的第三个交点

APP公钥 和 MD5指纹_公钥密码_52


(当P和Q重合时,直线是曲线的切线,把y作为因变量对x求导计算APP公钥 和 MD5指纹_APP公钥 和 MD5指纹_53

椭圆曲线密码(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

APP公钥 和 MD5指纹_因式分解_54
APP公钥 和 MD5指纹_APP公钥 和 MD5指纹_55

存在弱椭圆曲线:超奇异曲线(APP公钥 和 MD5指纹_单向函数_56)和异常曲线(APP公钥 和 MD5指纹_公钥密码_57

可以基于ECC构建DH密钥交换协议:首先选择公开参数APP公钥 和 MD5指纹_单向函数_58,Alice发送APP公钥 和 MD5指纹_单向函数_59,Bob发送APP公钥 和 MD5指纹_因式分解_60,二者交换后计算分别得到APP公钥 和 MD5指纹_因式分解_61即为私钥。(仍然易受到中间人攻击)

也可以基于ECC构建ElGamal密码体制:首先选择公开参数APP公钥 和 MD5指纹_APP公钥 和 MD5指纹_62
B发送明文消息m给A需要加密:
随机选择APP公钥 和 MD5指纹_公钥密码_63
计算APP公钥 和 MD5指纹_公钥密码_64
发送APP公钥 和 MD5指纹_因式分解_65给A
解密:APP公钥 和 MD5指纹_APP公钥 和 MD5指纹_66

数字签名

签名方案:一个签名方案由一个五元组构成(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 APP公钥 和 MD5指纹_学习_02 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的任何签名要求:APP公钥 和 MD5指纹_学习_68
APP公钥 和 MD5指纹_学习_69
APP公钥 和 MD5指纹_单向函数_70
APP公钥 和 MD5指纹_公钥密码_71

若E想得到A关于消息m的签名,APP公钥 和 MD5指纹_公钥密码_72,可以通过m1和m2的签名构造m的签名。
APP公钥 和 MD5指纹_因式分解_73

因此不要对陌生消息签名,签名之前先对消息求摘要、身份认证。

签名和公钥加密结合的方案:

  • 第一种方案:先签名后加密——APP公钥 和 MD5指纹_单向函数_74
  • 第二种方案:先加密后签名——APP公钥 和 MD5指纹_学习_75
  • 第二种方案可能存在伪造签名混淆发送者的问题,因此采用第一种方案更好。

ElGamal签名方案
设p为一个大素数,使得APP公钥 和 MD5指纹_因式分解_76上的离散对数问题难解。令APP公钥 和 MD5指纹_因式分解_77是一个本原元,令APP公钥 和 MD5指纹_公钥密码_78,定义APP公钥 和 MD5指纹_单向函数_79
其中APP公钥 和 MD5指纹_公钥密码_80为公钥,APP公钥 和 MD5指纹_公钥密码_81为私钥
APP公钥 和 MD5指纹_公钥密码_82以及一个秘密的随机数APP公钥 和 MD5指纹_APP公钥 和 MD5指纹_83,定义APP公钥 和 MD5指纹_APP公钥 和 MD5指纹_84
其中APP公钥 和 MD5指纹_公钥密码_85
对于APP公钥 和 MD5指纹_单向函数_86
定义APP公钥 和 MD5指纹_APP公钥 和 MD5指纹_87
容易证明APP公钥 和 MD5指纹_公钥密码_88

数字签名标准

DSA算法,签名比验证快很多,不能加密和密钥分配,专用于数字签名,比RSA慢
设p是一个大素数,使得APP公钥 和 MD5指纹_因式分解_76上的离散对数问题难解。令APP公钥 和 MD5指纹_因式分解_77是一个q阶元素(q为素数),APP公钥 和 MD5指纹_单向函数_91上的离散对数问题也难解。(整数k与p-1互素,k∈[0, p-2],q|p-1)

APP公钥 和 MD5指纹_单向函数_92
验证APP公钥 和 MD5指纹_APP公钥 和 MD5指纹_93是否成立。成立则数字签名有效。

APP公钥 和 MD5指纹_学习_94

椭圆曲线数字签名

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,定义
APP公钥 和 MD5指纹_公钥密码_95
其中

PGP安全协议

一种以用户为中心的可提供机密性和鉴别的安全协议。

APP公钥 和 MD5指纹_因式分解_96


若需要签名和加密,则先签名再加密,如需压缩则加密后压缩:APP公钥 和 MD5指纹_APP公钥 和 MD5指纹_97