公钥密码体制
对称密钥的三大问题
- 密钥交换
- 密钥管理:每两个用户之间的密钥都不相同
- 抵赖行为:不承认发送过某条消息
单向陷门函数
希望可以找到一个密码体制,对于给定的加密ek,除了消息接受者,求dk在计算上不可行。其中ek可公开,无需分享密钥。
单向函数:一个函数容易计算但求逆困难。(还没有一个函数没证明单向)
单向陷门函数:存在一个单向函数,该函数在具有特定知识(称为陷门)后容易求逆
单向函数定义
假定n=pq(p、q为不同的大素数),b为正整数,定义f:Zn→Zn,f(x)=xb mod n
陷门:大数n的因式分解
若已知n的因式分解n=pq,则=(p-1)(q-1)
若gcd(b,φ(n))=1,且ab 1 mod φ(n)
f-1:Zn→Zn,f-1(x)=xa mod n
公钥密码使用方式
用于加密:公钥加密私钥解密,无需交换密钥
用于认证:防止抵赖,如果要证明某文件为自己生成,则可以使用自己的私钥加密,其他人接收到之后通过公钥验证签名,用手中的所有公钥尝试,使用谁的公钥能够解密就是谁生成的文件
RSA算法
数学基础
欧拉定理:
费马小定理:
密码算法
n=pq,K={(n,p,q,e,d): ed 1 mod φ(n)}
定义,(n,e)为公钥,(n,d)为私钥
参数生成
素性检测、公私钥对
加解密过程的快速实现:
- 平方-乘算法
- 蒙哥马利算法
- 中国剩余定理加速解密
平方-乘算法
要计算:
(实际上就是模平方重复法的变体)

如上图示例:
97262 2659(mod 11413)
26592
蒙哥马利算法
蒙哥马利变换
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)
素数定理
若n=pq,为1024比特,则p,q为512比特(为素数的概率)
素性检测
费马素性检测:若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,满足,称n为对于基b的Euler伪素数
p-1=2st,
则下列同余式中至少有一个成立:
强伪素数:设n为奇合数,n-1=2st,t为奇数,整数b与n互素,满足bt=1 mod n,或者存在r,0≤r<s,有,称n为对于基b的强伪素数
Solovay-Strassen算法
随机选择整数a在1到n-1之间,x=,若x=0则n为合数;若
则n是素数,否则为合数(计算雅可比符号)
判断具有1/2的错误概率(若n为素数则输出一定为素数,若n为合数则有1/2的概率输出为合数)
Miller-Rabin算法
n-1=2st的形式,其中t为奇数
随机选择整数a在1到n-1之间
计算
如果,那么n为素数;否则进行下列循环:
for i=0 to s-1:
if ,then n是素数
else b=b2 mod n
若循环能结束则n为合数
若n为强伪素数,则输出可能为素数;若n为素数,则输出一定为素数,具有1/4的错误概率,优于Solovay-Strassen算法
AKS算法
确定性素性检测方法
理论基础:,n是素数,当且仅当
该算法为该理论复杂度的改进:
算法的时间复杂度高于概率算法
- 若存在整数a>0且b>1,满足n=ab,则输出合数
- 找出满足
的最小的r
- 若对a≤r,1<gcd(a,n)<n,输出合数
- 若n≤r,输出素数
- for a=1 to
do
- if (x+a)n≠xn+a (mod xr-1, n),输出合数
- 输出素数
共模攻击
给群组中每个人相同的公钥n,但指数e和d不同时可能产生共模攻击
- 对于群组内成员,即使不分解n也可以解密其他人消息
(自己有,因此可以计算
)
- 群组外人员如果截获到发送给群组不同成员的同一消息,而两个加密指数互素,则可以直接恢复消息
令m为明文消息,加密指数为,且二者互素,故存在r,s使得
,假设r为负数
则
小加密指数攻击
若选择的e较小(如3),则加密会很快
Coppersmith定理攻击:n为大整数,f为次数为e的多项式,可以在log n时间内有效计算出f(x)=0 mod n的小于的解。
应避免使用小的加密指数,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),定义
(x,y∈Zn),其中n为公钥,p、q为私钥
这是一个单向陷门函数,陷门为n的分解。f(x)=x2 mod n
公开密钥算法
加密:
解密:
两个密钥不能相互推导(或推导的难度不亚于密码分析)
其中一个密钥公开(),另一个密钥保密(
)
每一个用户掌握一个私钥,并将相应的公钥放在公共目录中
问题:如何让别人正确知道你的公钥?(如何保证你发出的公钥不被篡改/如何证明一个公钥是不是你的?)
答案:通过可信授权中心(PKI),每个人将自己的公钥发给PKI,由PKI为该公钥签名,相当于提供一个证书,在将这个有签名的公钥返还给用户。
离散对数问题
对于乘法群,一个n阶元素a∈G和β∈<a>
问题:找到唯一非负整数i不大于n-1,满足ai=β
将整数i记为,称为β的离散对数
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(y1a)-1 mod p
注意r在加密的时候需要随机选择,加密后应立即销毁不能在信道上传输。
加密运算具有不确定性。
注意三个公钥中只有β与私钥a直接相关。
椭圆曲线
设a,b∈R是满足的实常数,方程
所有解(x, y)∈R×R连同一个无穷远点
组成的集合E称为一个非奇异椭圆曲线。
从函数图像来看,椭圆曲线有两种,一种有一条线,一种有两条线
Weierstrass方程
定义在代数闭域上射影平面坐标的一般方程
K上的射影平面P2(K)是K3/{(0, 0, 0)}上关系~的等价类集合,每个等价类记作(X:Y:Z)
(X1,Y1,Z1) ~ (X2,Y2,Z2)
非奇异:在P点至少有一个非0。
椭圆曲线E:非奇异Weierstrass方程的所有P2()的解
y2+a1xy+a3y=x3+a2x2+a4x+a6
(E,+)是一个以无穷远点0为单位元的阿贝尔群,加法规则为:
其中R为直线PQ或过点P的切线与椭圆曲线的第三个交点

(当P和Q重合时,直线是曲线的切线,把y作为因变量对x求导计算)
椭圆曲线密码(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
存在弱椭圆曲线:超奇异曲线()和异常曲线(
)
可以基于ECC构建DH密钥交换协议:首先选择公开参数,Alice发送
,Bob发送
,二者交换后计算分别得到
即为私钥。(仍然易受到中间人攻击)
也可以基于ECC构建ElGamal密码体制:首先选择公开参数
B发送明文消息m给A需要加密:
随机选择
计算
发送给A
解密:
数字签名
签名方案:一个签名方案由一个五元组构成(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 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的任何签名要求:
若E想得到A关于消息m的签名,,可以通过m1和m2的签名构造m的签名。
因此不要对陌生消息签名,签名之前先对消息求摘要、身份认证。
签名和公钥加密结合的方案:
- 第一种方案:先签名后加密——
- 第二种方案:先加密后签名——
- 第二种方案可能存在伪造签名混淆发送者的问题,因此采用第一种方案更好。
ElGamal签名方案:
设p为一个大素数,使得上的离散对数问题难解。令
是一个本原元,令
,定义
其中为公钥,
为私钥
对以及一个秘密的随机数
,定义
其中
对于
定义
容易证明
数字签名标准
DSA算法,签名比验证快很多,不能加密和密钥分配,专用于数字签名,比RSA慢
设p是一个大素数,使得上的离散对数问题难解。令
是一个q阶元素(q为素数),
上的离散对数问题也难解。(整数k与p-1互素,k∈[0, p-2],q|p-1)
验证是否成立。成立则数字签名有效。
椭圆曲线数字签名
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,定义
其中
PGP安全协议
一种以用户为中心的可提供机密性和鉴别的安全协议。

若需要签名和加密,则先签名再加密,如需压缩则加密后压缩:
















