非对称加密体制
非对称加密体制
一、问题由来
加密通信中经常面临一个问题:陌生人之间加密通信需要如何管理和分发密钥?
对称密码体制在其中的困难有:
1.假设n个人通信,每人都要(n-1)个密钥,可信中心分发个密钥。密钥太多难以管理。
2.陌生人不能提前约定密钥。
3.不能用作数字签名。
二、基础概念
密钥
(PK, SK)
PK:俗称公钥(Public Key),通常公钥是公开的,可以被任何实体通过有效渠道获取;
SK:俗称私钥(Secret Key),通常私钥是保密的,不能被任何实体通过非法渠道获取;
非对称加密通常基于数学函数而不是随机序列。
公钥和私钥之间具有一定关联。
公钥公开,用于加密,私钥解密,不能公开。
Alice在知道公钥和明文的情况下,容易计算,加密。
MIlice仅仅知道公钥而反推私钥,是困难的。
Milice知道公钥和密文,也很难解出明文。
Bob在拿到密文后,很容易根据私钥解密出明文。
加密函数
一个单向函数
一一映射的函数,才是可逆的:当
一个可逆函数,若它满足:
对所有,易于计算f(x);
对“几乎所有由f(x)求x“极为困难”,以至于实际上不可能做到,则称f为一单向(One-way)函数。
单项陷门函数
给定x,计算y = f(x)是容易的;
给定y,计算x使y = f(x)是困难的;
存在z,已知z时, 对给定的任何y,若相应的x存在,则计算x使y = f(x)是容易的。
陷门作为私钥
密码通信
密码通信分为两个不同阶段。
会话密钥交换阶段:用来协商接下来的密钥——对称加密的密钥。
保密信息交换阶段:流密码或分组密码。速度快,场景需求。
session:会话:建立一次连接
session key:每次会话使用不同的密钥,模仿一次一密。
passwd只做一致性验证,“口令”,不是密码(key),不参与任何变换。
三、Diffie-Hillman密码体制
1.基础知识
本原元:对于一个素数,如果数值,,…,是各不相同的整数,并且以某种排列方式组成了从1到q-1的所有整数,则称整数a是素数q的一个本原元。
离散对数:对于一个整数b和素数q的一个本原元a,可以找到一个唯一的指数i,使得
成立,则指数i称为b的以a为基数的模q的离散对数。
离散对数难题:已知a和i,求解b是相对容易的,但是已知a和b,求解i是非常困难的。
2.Diffie-Hillman协议
其中大素数q及其原根a是可公开的。
用户A:随机选择一个数,计算。作为私钥。作为公钥。
用户B:随机选择一个数,计算。作为私钥。作为公钥。
用户A已知B的公钥后,利用自己的私钥计算
用户B已知A的公钥后,利用自己的私钥计算
共享密钥.
Deffie-Hellman密钥交换算法安全性源于在有限域上计算离散对数,应该是一个素数,并且q应该足够大:系统的安全性取决于与q同样长度的数的因子分解的难度;可以选择任何模n的本原元a,通常选择最小的a(一般是一位数)。
为什么应该是一个素数?
在 Diffie-Hellman 协议中,我们需要选择一个 q 的生成元 g。生成元 g 的阶是指最小的正整数 n,使得 。由Lagrange定理知,一个群的任意元素的阶都是该群阶的因数。在 DH 协议中,我们关心的是模 q 的乘法群,这个群的阶是 q-1。所以,任意元素(比如生成元 g)的阶必须是 q-1 的因数。因此,如果 (q-1)/2 是素数,那么 q-1 可能因数就只有 1, 2, (q-1) 和 (q-1)/2,所以生成元 g 的阶只可能是这四个数。
因为我们希望生成元 g 的阶尽可能大,以便增加攻击者破解的难度。如果 (q-1)/2 是素数,那么 g 的阶很大可能会是 (q-1) 或者 (q-1)/2,这样就可以提高 DH 协议的安全性。
3.Diffie-Hillman协议的缺陷:中间人攻击
中间人Malice攻击协议,而不是攻击算法。
用户A:随机选择一个数,计算。作为私钥。作为公钥,发送给M。
用户M:随机选择一个数,计算。发送给B。
用户B:随机选择一个数,计算。作为私钥。作为公钥,发送给M。
用户M:随机选择一个数,计算。发送给A。
A认为共享密钥是
B认为共享密钥是
M用A的公钥和自己选的m计算出A所认为的共享密钥。
M用B的公钥和自己选的m计算出B所认为的共享密钥。
从而实现了中间人攻击。
AB之间没有进行任何身份认证机制,所以容易遭受中间人攻击。当A接收到来自M的”公钥“时,并没有认证这个”公钥“来自于B。
四、背包密码体制
背包算法(来自01背包问题)
明文按照物品个数分组,位置一一对齐,给定一系列值和一个和,计算使之满足
求解很困难,验证很容易。是个NP问题。
作为密文。作为明文。背包序列作为公钥。
超递增背包序列:作为私钥,用来解密 。
超递增序列:它的每一项都大于它之前所有项之和;
例一:{1, 3, 6, 13, 27, 52}
超递增背包问题的解:
计算其总重量并与序列中最大的数比较
如果总重量小于这个数,则它不在背包中;
反之,则它在背包中,背包重量减去这个数。
考查数列下一个最大的数,重复直到结束
如果总重量减为零,那么有一个解;
反之无解。
问题的转化
超递增背包问题的解很容易找到;
非超递增背包问题是困难问题,没有快速解法。
超递增背包问题向非超递增背包问题的转化
取一个超递增序列,比如{2, 3, 6, 13, 27, 52};
分别选取和,用去乘所有的项,作为模数进行模运算。比如
得到一个非超递增序列,{62, 93, 81, 88, 102, 37};
超递增序列作为私人密钥,得到的非超递增序列作为公钥。
其中的盲因子n,m也是不能公开的。
五、RSA密码体制
1.密钥生成、加密、解密
密钥生成
首先选取两个大素数p和q,计算n = pq;(主要时间开销在此,选择大数、判断素性。)
随机选取加密密钥e,使e和(p - 1)(q - 1)互素;(使e在mod(p - 1)(q - 1)下存在逆元)
用扩展欧几里德算法计算解密密钥d,以满足:
,即 ;
公开钥为,秘密钥为。
加密过程
加密的数学变换:
M>n时,是不方便还原的(一个剩余类)。所以M<n.
如果消息大于M,就分组,加密,再串接。
实际应用多数是加密一些消息密钥和安全参数,常常M<n.
解密过程
解密的数学变换:
正确性验证
(欧拉定理)
M:字符串:看作01代码,再转换成整数
其中的幂运算:(大指数模幂运算:不是先算幂再取模)
快速幂取模
求数m的二进制表达式
带余除法(开销较大)
1 | while(m){ |
----->
1 | 位运算(更快) |
RSA的安全性完全依赖于分解大数的难度:
129位十进制数字的模数是能分解的临界数,n应该大于这个数。
RSA的n起初512位,后来提升为1024位(民用)2024位(涉密)。
2.选择密文攻击
加密的公私钥对(公钥加密,私钥解密),不能用来签名(私钥签名,公钥验证)
即不能用同一套密钥加密和签名。
对协议的攻击
例一
Eve在Alice的通信过程中进行窃听,设法成功选取了一个用她的公开密钥加密的密文c。Eve想读出信息m,。
Eve选取一个随机数r,满足r小于n。她得到Alice的公钥e:
Eve让Alice用她的私人密钥对y签名,以便解密y:
Eve计算:
例二
Alice是一个公开的计算机公证人,Eve想让Alice对一个本来不愿意签名的消息签名,例如。
如果
Eve让Alice用她的私人密钥对和分别签名,从而获得了Alice对的签名:
Eve计算:
同模攻击
对RSA的公共模数攻击
不同的使用者采用相同模数 , 即使 和 不同,假如两个公钥互素,则无需任何的解密技术就可以恢复明文。
设 位明文, 两个公钥为 和 , 模数为 , 两个密文为:
由于 和 互素, 根据扩展欧几里德算法找出 和 , 满足:
假定 是负数( 或 中有一个必须是负数), 用欧几里德算法可计算 :
六、Elgamal密码体制
该密码体制基于离散对数难题。选择一个素数p,两个随机数g和x(g<p,x<p),计算。公开密钥是y、g和p,私钥是x。设待加密消息为m:
加密
首先选择随机数r,只要r与p-1互素;
计算: 和 ,a和b作为密文对,密文的长度是明文的两倍;
解密
计算: ;
验证:,。
七、椭圆曲线密码体制ECC(Elliptic Curve Cryptography)
(注:椭圆曲线是光滑的三次曲线,椭圆是二次曲线,两者不是同一个东西。)
ECC基于椭圆曲线上的离散对数问题。它的求解更难,这使得密钥长度大大减小。
(相同密钥长度,对称加密安全性更强。)
参考:零知识证明 - 椭圆曲线基础 - 知乎 (zhihu.com)
实数域上的椭圆曲线
对于固定的实数a,b,满足方程: 的所有点的集合,外加一个零点和无穷远点O,其中x和y是实数域上取值。
有限域上的椭圆曲线:
其中是有限域上取值。域上的元素是m位的串。
只要非负整数a和b满足:,那么表示模p的椭圆群,这个群中的元素和一个称为无穷远点的O共同组成椭圆群——Abel群(单位元、逆元、交换律、结合律)。
加法规则:
:切线
倍点规则:
两个互不为逆的点P(x1,y1)和Q(x2,y2)的加法规则
其中
对任意点P(x1,y1)的倍点规则
其中,
定义一:mP = P + P +…+ P (m个P)
定义二:P是椭圆曲线E上的一个点,若存在最小的正整数n,使得nP = O,其中O是无穷远点,则称n是P的阶数。
加解密过程
系统的建立
选取一个有限域GF(p)和定义在该域上的椭圆曲线E(a,b)和E(a,b)上的一个阶为n的点P(xp, yp);
GF(p)、a、b、P(xp, yp)和n都是公开信息。
密钥的生成
在区间[1, n-1]中随机选取一个整数d;
计算Q = d×P;
实体的公开密钥是Q,私钥是证书d。
已知d,P,Q易算;已知P,Q,d难算。
消息传输
Bob试图将消息M发送给Alice时,执行下列操作
查找Alice的公钥Q;
将消息M表示成一个域元素m∈GF(p);
在区间[1, n-1]中随机选取一个整数k;
计算点(x1, y1) = kP;
计算点(x2, y2) = kQ,如果x2 = 0,则返回到第三步;
计算;
传送加密数据(x1, y1, c)给Alice。
当Alice解密从Bob收到的密文(x1, y1, c)时,执行下列操作
使用她的私钥d,计算点(x2, y2) = d(x1, y1);
计算;
计算,而,即恢复出明文。
整数到域元素的转换
文字消息—ascii----二进制01串----整数-----域元素
平方剩余
如果p是素数,且a小于p,如果 x2 ≡ a modp对于一些x成立,则称a是对模p的平方剩余。
例如:p = 7, 4 ≡ 22 ≡ 52 mod7 (2和5称为平方根)
整数到域元素的转换(设明文消息是m, 0≤m≤M)
取一个足够大的整数k∈[30,50];
不妨取k = 30,计算一系列的x∈{mk+j}j =0,1,2…,直到x3+ax+b(modp)是模p的平方剩余;
(x, (x3+ax+b)1/2)即为椭圆曲线上的点。