第11章 Diffie- Hellman协议
公钥密码学始于 Whitfield Diffie和 Martin Hellman于1976年发表的"New Diretions in Cryptography"
密钥管理的困难:对于N个互相通信的用户,一共需要 N(N-1)/2个密钥。数量上的快速增长使得密钥难以管理
Diffie和Hellman设想出公开加密,隐藏解密的方式,课解决分发密钥问题(公钥密码体制)
DH密钥交换协议:能在不安全信道上协商得到相同密钥
11.1群
群中选择任何一个元素g,考虑序列1,g,g2,g3,⋯(模p)的无限序列,由于Zp中只有有限个,所以该序列必定会开始重复。假定从gi =gj处开始重复,其中i<j,可得1=gj-i。
阶:存在一个数q=j-i使得gq=1(mod p),q为g的阶。
生成元:此时g为此序列的生成原,此时明显q为gn(mod p)的个数
本原元:至少有一个元素g能够生成整个群,即可将群看作1,g1 ,g3 ,...,gp-2
任意g的阶都是p-1的因子
11.2基本的DH
可公开&基本元素:大素数p和群Zp的本原g
交换过程:
Alice选择Zp中的一个随机数x,这就相当于在1,⋯,p-1中选择一个随机数,接着计算gx modp并把结果发送给 Bob
Bob在Zp也选择一个随机数y,计算gymodp并把结果发送给Alice
最终的结果k定义为gxy,双方都可计算得到k
image-20210416165742990
安全性基于离散对数问题:攻击者无法通过信道中的gx 和gy 计算得到k,最好的方式是通过gx计算出x,但相当困难
11.3中间人攻击
中间人可以面向A,B分别伪装成B,A
image-20210416170039442
基础设施解决方法:使用数字电话本:使用电话本验证身份-->PKI类
非基础设施型:一定方法验证如电话语音,视频通话
11.4一些可能的问题
攻击者拦截通信并替换gx,使得到的k=1,密钥貌似完成却无效
g非Zp本原元,子群较小容易被攻击
结合以上两种方式,攻击者可以拦截通信并替换gx为阶较小的h完成攻击,a和b会生成较小的子群
11.5安全的素数
安全素数p:形如2q+1的素数,其中q也为素数
安全素数生成群Zp有:
■ 只包含1的平凡子群。
■包含2 个元素的子群,即1和p-1。
■包含q 个元素的子群。
■包含 2q 个元素的整个群。
选取包含q个元素的子群,不用担心有更深子群的问题
前两个子群数量过少不安全,包含2q的子群有如下问题:
2q个数中有一半都是平方数,有一半是非平方数,攻击者可通过Legendre判断gx是否为平方数以推断x的最低位
A,B应检查受到的gn 是否为g生成子群中的元素:Legendre符号或r≠1且rq mod p = 1
11.6使用较小的子群
原因:安全素数方法效率不高:p有n位时,q有n-1位,求幂则约需要3n/2此乘法运算
选择一个256位的素数q(即2255<q<2256),然后找一个更大的素数p满足p=Nq+1,其中N为任意值。要找到这样的p,可以先在适当的范围内随机选择一个N,计算p=Nq+1,并检查p是否为素数。由于p一定是奇数,容易发现 N必为偶数。素数p可以有几千位长
然后需要找到一个阶为q的元素。我们使用类似于安全素数情况中的方法,在Zp中选择一个随机数a,令g= α,验证g≠1并且g=1(由于q是奇数,第二个测试条件涵盖了g=p-1)。如果g不满足这些条件,就选择另一个α并再次尝试。
new检查1<r<p且rq=1,由于rq=1,所以只需计算re(mod_p) ,p 为至少2000位时能够节省7/8的工作俩
11.7p的长度
如要保证128位安全性,需要6800位的p,性能难以接受,更何况公钥本身就很慢
我们要仔细研究公钥操作的性能:公钥暂时用于加密对称密码的密钥,而对称密钥有更新周期,所以公钥的保护性可以没这么好,至少保证未来20年即可(对称密钥需50年)
11.8实践准则
选择256位的素数p,以应对碰撞攻击时有128位安全性
接受子群描述(p,q,g)时应验证:
p和q 都是素数,q有256 位,并且p足够大(不要信任太小的密钥)
q是(p-1)的因子
g≠1且gq=1
接收应属于子群元素的r时应验证1<r<p且rq=1
11.9可能出错的地方
起因:IKE协议应用了DH协议,但没规定如何处理重发的消息
攻击方式:攻击者将Y替换成阶乘为d的元素(d是p-1的小因子),这样可以尝试(x mod d)的可能性以猜测Alice生成的k
解决方案:检查接收的每一个值都在正确的子群中
11.10习题
11.1 假设有200个人想要使用对称密钥来进行安全通信,每两个人之间都要有一个对称密钥,那么一共需要多少个对称密钥?
答:对N个通信人需要 N(N-1)/2,即需要200*199/2=19900个
11.2 计算在模p=11乘法群中分别由 3、7、10 生成的子群。
答:
由3生成的子群:1,3,4,5,9
由7生成的子群:2,3,4,5,6,7,9,10
由10生成的子群:1,10
11.4 如果在Alie和Bob两人所有的通信中,Alie使用相同的x和g,Bob使用了相同的y和g,会不会产生什么问题?
答:会产生问题.如果密钥长期不更换,攻击者会在碰撞得到x后破译过去的所有信息且继续监听破译
11.5 Alice和Bob打算利用DH协议来协商一个256 位的AES密钥,不过他们现在不知道该使用多大的公钥gx和gy,256 位、512 位还是其他值?你有什么建议
第11章问题
为何当且仅当rg=1(modp)时,r为模p平方数?
第12章RSA
基于大整数分解问题
应用于数字签名和公钥加密
12.1引言
DH单向函数:假设p和q是公开已知的,那么可以由x计算(gx mod p),但是给定gxmodp却不能计算出x。
RSA陷门单项函数:给定公开已知的信息n和e,容易由m计算memodn,但相反的方向却不行。不过如果知道n的因子分解,那么反向计算就变得容易了。(陷门信息:n的因式分解)
12.2中国剩余定理
已知x mod p,xmod q,那么就能够求出x,表示为已知(a,b)可求x
可行性证明:有唯一的x满足(a,b)
假设有x'也满足(a,b).则有d=x-x',所以d mod p = (x-x')mod p=(x mod p)-(x'mod p) = 0,可得d为p倍数,同理d为q倍数.由于1<x,x'<n-1,所以0≤d<n-2.由于p,q为不等素数,所以d为pq=n的倍数.所以d只可能为0,x唯一
12.2.1 Garner公式
((a-b)(q-1 mod p))mod p)· q +b
证明
image-20210416230528279
可明显简化计算,解决CRT问题
12.2.2推广
CRT也可为n为不同素数乘积的情形
12.2.3应用
做大量模运算时可大量节约时间
模运算:x+y的CRT表示就是((x+y)modp,(x+y)mod q),两部分可通过(x mod p)+(y mod p)modp方式解决
乘法运算:xy的 CRT表示是(xy mod p,xy mod q),两部分可通过(x mod p)*(y mod p)mod p方式解决
指数运算:。假设要计算xsmod n,指数s有k位,大约就需要 3k/2次模n乘法。另外,在我们计算(xsmodp,xsmodq)时,对于模p运算,可以把指数s模(p-1)约化,对于模q运算也类似,所以只需要计算(xsmod(p-1)mod p,xsmod(q-1)mod q)。
12.2.4结论
n=pq时,x模n可以表示为(xmodp,xmodq)对,而且这两种表示之间的转换相当简单。如果要做很多次模一个合数的乘法,而且已知该合数的因子分解,那么就可以使用CRT 表示来加快计算(如果不知道n的因子分解,就不能用它来加快计算)。
12.3模n乘法
对任何素数p,xp-1=1(mod p)对0<x<p成立,但对合数n不成立.我们需要找到指数t使得xt=1 mod n对计划所有的x成立
存在xt=1(mod p)和xt=1(mod q),所以p-1|t且q-1|t,所以可约定t=lcm(p-1,q-1)
一半来说可直接使用φ(n)=(p-1)(q-1)作为t,但lcm(p-1,q-1)更准确
12.4 RSA
首先随机选择两个不同的大素数p和q,计算n=pq。
使用两个不同的指数,通常称为e和d并且满足ed=1(mod t),其中t= lcm(p-1,q-1),部分教科书中写作ed=1(mod φ(n))。公开的指数e应该选取为某一小奇数值,并用extendedGCD函数来计算e模t的逆d,以确保ed=1(mod t)。
加密消息m,发送者计算密文ε=me(modn)。为了解密密文c,接收者计算e(mod n)。
这就等于(m)=m~=m"'=(m)·m=(1)·m=m(mod n),其中k是某个存在的值,所以
接收者能够解密密文 m"而得到明文 m。
(n,e)对构成了公钥,这些公钥被分发给很多不同的参与方。(p.q,t.d)构成了私钥,
由生成 RSA 密钥的人秘密保存。
12.4.1RSA数字签名
为了签署一个消息m,私钥的拥有者计算s=m1/emod n。现在(m,s)就是一个经过签名的消息,要验证签名,任何知道公钥的人都可以验证 se= m(mod n)是否成立。
只有掌握了私钥,才可以计算m的e次方根
12.4.2公开指数
攻击者可能通过说服私钥的拥有者签署消息c来解密
解决方法:对同一个n使用两个不同的公开指数,以消除了系统之间的相互影响,简化系统
可选取较小的公开指数用于签名
12.4.3私钥
攻击者只知道公钥(n,e),那么计算私钥(p,q,t,d)中的任何一个值都是极其困难的。只要n足够大,就没有算法能够在可以接受的时间内做到这一点。
解决方案:把n分解为p和q,然后再计算t 和d。
由于知道d等价于知道p和g,那么可以安全地假设她知道n的因子,从而可以使用CRT表示来进行计算。
12.4.4n的长度
n应该与DH中的模p具有相同的长度
保护数据20年,n的绝对最小长度是2048位
两个素数p和q应该具有相同的长度,要得到一个k位的模n,可以生成两个随机的k/2 位的素数并把它们相乘
12.4.5生成RSA密钥
10.4中generateLargePrime的修改版,区别是p满足p mod 3≠1和p mod5 ≠1
仅指定长度无需指定范围区间
能够生成所有密钥参数
12.5使用RSA的缺陷
攻击者可通过Sign(m1)和Sign(m2)相乘得到Sign(m3)
加密短消息(密钥)不会模约化运算,消息会被还原
解决方案:使用编码函数消除原有结构(类填充),如PKCS#1 v2.1包括了两个RSA加密方案和两个RSA签名方案,并可以使用不同的散列函数
12.6加密
由于加密消息受限于n长度,所以我们不几乎不适应RSA直接加密信息
通用解决方案:选择一个随机的密钥K,利用RSA密钥加密K。然后使用密钥K通过分组密码或者流密码来加密实际的消息m
easier解决方案:选择随机数r∈Zp,作哈希K=h(r)为密钥,优点如下
r是随机选择的,所以不可以利用r的结构来攻击加密方案中RSA这部分
其次散列函数保证了不同结构的r不会得到相同结构的K(除了相同输入必须产生相同的输出这一明显的必要条件)。
发送者对密钥进行加密
接收者计算K=h(c1/emod n),得到同一个密钥K。image-20210416231809198
安全性分析:攻击者最多只知道K,而不可能随机映射出散列函数的输入r
12.7签名
由于信息m可能有多种结构,需要统一格式
先对消息进行散列运算,生成k为伪随机映射随机数s
签名
验签
只要散列函数是安全的,就只能通过试错法来获取成(m)的值。
随机数生成器也是随机映射,任何人都可以产生形如(s,s1/e)的数对,其中s的值是随机的,并不会提供任何新的信息来帮助攻击者伪造签名。
对任何特定的消息m,只有知道私钥的人才能够计算相应的(s,s1/e)对,这是因为s必须h(m)计算出来,然后s1/e必须由s计算得到。so任何验证签名的人都知道 Alice一定给该消息进行过签名
12.8习题
12.1 设p=89,q=107,n=p,a=3,b=5,在Z上找到满足a=x(mod p)且b=x(mod g)的x。
12.2 设p=89,q=107,n=p,x=1796,y=8931,计算x+y(mod n)。要求先直接计算,再使用CRT表示计算。
12.3 设p=89.q=107,n=p,x=1796,y=8931,计算x(mod n)。要求先直接计算,再使用CRT表示计算。
12.4 设p=89,4=101,n-pg.e=3,那么(n,e)是一个有效的RSA公钥吗?如果是,就计算相应的 RSA 私钥d;如果不是,请说明理由。
12.5 设p=79,q=89.n=pq,e=3.那么(n,e)是一个有效的RSA公钥吗?如果是,就计算相应的 RSA 私钥d; 如果不是,请说明理由。
12.6 为了提高解密的速度。Alice令私钥d=3.再计算d模1的逆来作为e.这种设计决策好吗?
12.7 一个256位的 RSA 密钥(模数为256 位的密钥)和一个256位的AES密钥提供了相似的安全强度吗?
12.8 设p=71,q=89,n=pg,e=3。首先计算d.接着利用RSA 基本操作计算消息m-5416、mz= 2397、ms=m;m2(mod n)的签名,并验证m;的签名等于m和m,的签名的乘积。
标签:公钥,计算,第十一章,第十二章,RSA,密钥,子群,mod From: https://www.cnblogs.com/charliecza/p/17263990.html