公钥密码学中的简单数学基础
本文基于《深入浅出密码学》第六章以及Paillier中使用到的相关数学知识进行总结,并计划不断更新
逆元
介绍
注意:不是所有的元素都存在乘法逆元
假设
a∈Zm,乘法逆元
a−1 定义为:
a⋅a−1≡1(modm)
如果一个元素a的逆元存在,则可以除以这个元素,因为
b/a≡b⋅a−1(modm)
判断
当且仅当
gcd(a,m)=1,一个元素
a∈Z 存在乘法逆元
a−1 ,即两数互质。
寻找
寻找元素的逆元比较困难,通常使用拓展欧几里得算法(见下)
应用
在 RSA 密码体系中会在选择公开指数 e 时保证
gcd(e,φ(n))=1,是为了保证 e 的逆元存在,即保证私钥始终存在,
d⋅e≡1modφ(n)
欧拉定理
假设
a 和
m 都是整数,且
gcd(a,m)=1,则
aφ(m)≡1(modm)
由于这个定理对模数 m 使适用,所以它也适用于整数环
Zm内的所有整数
补充
- 对质数
p ,
ϕ(p)=p−1
- 带有幂次素数的欧拉函数:若
p 为素数,且有
n=pr,则
φ(n)=φ(pr)=pr−1φ(p−1)【易于证明将其中p倍数都去除即可】
- 设
m=pq,若
p 和
q 互素且大于1,则
φ(m)=φ(p)φ(q)【易于证明因为两者互素】
应用
常应用于高指数求模的化简运算
例如:
21000000(mod7)
结合欧拉定理:
2φ(7)≡26≡1(mod7)
以及1000000=166666*6+4
所以:
21000000≡(26)166666⋅24≡2(mod7)
费马小定理
假设
a 为一个整数,
p 为一个素数,则
ap≡a(modp)
费马小定理是欧拉定理的一个特例,如果
p 为一个素数,则
φ(p)=p−1 成立。如果将这个值用于欧拉定理,则可得到:
aφ(p)=ap−1≡1(modm)
欧几里得算法
介绍
两个正整数
r0 和
r1 的最大公约数
gcd 表示为:
gcd(r0,r1)
对于小整数而言,最大公约数的计算非常容易就是将两个整数因式分解,并找出最大的公共因子。然而,对于公钥中的大整数而言,因式分解通常是不可能的,所以人们通常使用一种更有效的算法计算
gcd ,那就是欧几里得算法。
原理
这里使用的基础原理是
gcd(r0,r1)=gcd(r0−r1,r1)
证明如下:假设
gcd(r0,r1)=g ,由于g可以同时除
r0 与
r1 ,则可以记为
r0=g⋅x 和
r1=g⋅y ,其中
x>y 且x与y为互素的整数,即他们没有公共因子,则有
gcd(r0−r1,r1)=gcd(g⋅(x−y),g⋅y)=g
运算
我们可以迭代的使用上述过程,从而化简运算:
gcd(r0,r1)=gcd(r0−r1,r1)=gcd(r0−2r1,r1)=gcd(r0−3r1,r1)=⋯=gcd(r0−mr1,r1)
即可以表示为:
gcd(r0 mod r1,r1)
由于第一项比第二项小,通常可以交换它们:
gcd(r1,r0 mod r1)
在整个过程中,我们可以将查找两个给定整数的最大公约数化简为查找两个较小整数的最大公约数,迭代直至最后获得
gcd(rl,0)=rl,而这实际上也就是原始问题的答案
例如:计算
gcd(27,21)
image-20220925171519247
即使是处理非常大的数,欧几里得算法依然高效,迭代次数与输入系统操作数的位数有紧密关系,这意味着如果一个
gcd 涉及的数字都是1024位,则此
gcd 的迭代次数就是1024乘以一个常数(当然只有几千次迭代的算法在当今PC上很容易实现,该算法在实际上效率极高)
拓展欧几里得算法(EEA)
思路
执行标准的欧几里得算法,但将每轮迭代中的余数
ri 表示为以下形式的线性组合:
r1=si⋅r0+ti⋅r1
那么最后一轮迭代对应的等式为:
r1=gcd(r0,r1)=si⋅r0+ti⋅r1=sr0+tr1
这也意味着最后的系数
sl 也是等式所寻找的系数
s,同时
tl=t
例如:计算
r0=973
r1=301
i |
ri−2=qi−1+ri |
ri=[si]r0+[ti]r1 |
1 |
973=3⋅301+70 |
70=[1]r0+[−3]r1 |
2 |
301=4⋅70+21 |
21=301−4⋅70=r1−4(1r0−3r1)=[−4]r0+[13]r1 |
3 |
70=3⋅21+7 |
7=70−3⋅21=(1r0−3r1)−3(−4r0+13r1)=[13]r0+[−42]r1 |
4 |
21=3⋅7+0 |
|
上述过程计算了三个参数,即
gcd(973,301)=7,
s=13 及
t=−42
应用
计算线性组合
计算线性组合:
gcd(r0,r1)=s⋅r0+t⋅r1 其中 s 与 t 均表示整型系数
求逆元
EEA在非对称密码学中的主要应用就是计算整数的逆元
计算
r1 mod r0 的逆元
(r1<r0)
由上述可知,只有当
gcd(r0,r1)=1 的情况下逆元才存在。
由EEA可得:
si⋅r0+ti⋅r1=1=gcd(r0,r1)
计算:
s⋅r0+t⋅r1=1
s⋅0+t⋅r1≡1 mod r0
r1⋅t≡1 mod r0
即
t 本身就是
r1 的逆元:
t=r1−1 mod r0
综上,计算逆元
a−1 mod m ,直接使用输入参数为
m 和
a 的 EEA 即可,计算出来的输出值 t 即为其逆元
举例说明,计算
12−1 mod 67 的计算过程如下:
i |
qi−1 |
ri |
si |
ti |
2 |
5 |
7 |
1 |
-5 |
3 |
1 |
5 |
-1 |
6 |
4 |
1 |
2 |
2 |
-11 |
5 |
2 |
1 |
-5 |
28 |
即 12 的逆元为
12−1≡28 mod 67
注意:一般不需要系数 s ,实际中也不计算该值。该结果可能 t 是负数,这种情况下我们需要计算
t=t+r0
计算伽罗瓦域内的乘法逆元
与 AES 中的S-盒起源以及椭圆曲线公钥加密算法有关,EEA可以完全当做多项式(而不是整数)使用。如果想要计算有限域
GF(2m) 中
的一个逆元,算法的输入就是域元素
A(x) 和不可约多项式
P(x),由于
P(x) 是不可约多项式,所以
gcd 总是等于 1。即:
s(x)P(x)+t(x)A(x)=gcd(P(x),A(x))=1
同理:
t(x)≡A−1(x) mod P(x)
举例计算基于
P(x)=x3+x+1 的有限域
GF(23) 中
A(x)=x2 的逆元。
t(x) 多项式的初始值为:
t0(x)=0,
t1(x)=1
image-20220925234151438
即:
A−1(x)=t(x)=t4(x)=x2+x+1
中国剩余定理
在《孙子算经》中有这样一个问题:“今有物不知其数,三三数之剩二(除以3余2),五五数之剩三(除以5余3),七七数之剩二(除以7余2),问物几何?”这个问题称为“孙子问题”,该问题的一般解法国际上称为“中国剩余定理”。
明代程大位在他的著作《直指算法统宗》中,提出了“孙子歌”来求解该问题——“三人同行七十稀,五树梅花廿一枝, 七子团圆正半月,除百令五便得知。”
实际上说的是:只要是除以3余了一个1,就加上一个70;只要是除以5余了一个1,就加上一个21;只要是除以7余了一个1,就加上一个15。然后累加除以105即可。
举例
有一个年级的同学,每 9 人一排多 5 人,每 7 人一排多 1 人,每 5 人一排多 2 人,问这个年级至少有多少人 ? 题中9、7、5三个数两两互质。 则〔7,5〕= 35;〔9,5〕= 45;〔9,7〕= 63;〔9,7,5〕= 315。 为了使 35 被 9 除余 1,用 35×8=280 ; 使 45 被 7 除余 1,用 45×5=225 ; 使 63 被 5 除余 1,用 63×2=126 。 然后,280×5+225×1+126×2=1877, 因为,1877>315,所以,1877-315×5=302,就是所求的数。
再加上一句:计算这个总和除以 105 的余数。
分析
问题:计算一个整数 x ,使得它满足除以3余2、除以5余3、除以7余2。
问题分解:
如果能够找到三个整数
x1,
x2,
x3,使得:
-
x1 除以3余2、除以5余0、除以7余0
-
x2 除以3余0、除以5余3、除以7余0
-
x3 除以3余0、除以5余0、除以7余2
那么令
x=x1+x2+x3 ,就很容易验证这时的
x 就满足除以3余2、除以5余3、除以7余2。
如果分别称找到整数
x1,
x2,
x3 的问题为问题1、问题2、问题3,那么可以看出这三个问题本质上是类似的。
下面对问题1继续分解,如果能够找到一个整数
y1 满足
y1 除以3余1、除以5余0、除以7余0,那么令
x1=2 × y1 ,就很容易验证这时的
x1 就满足除以3余2、除以5余0、除以7余0。
因此定义
-
问题1-1为:寻找整数
y1 满足
y1 除以3余1、除以5余0、除以7余0
-
问题1-2为:寻找整数
y2 满足
y2 除以3余0、除以5余1、除以7余0
-
问题1-3为:寻找整数
y3 满足
y3 除以3余0、除以5余0、除以7余1
这三个问题本质上是相同的。
如果找到了
y1,
y2,
y3 ,那么就可以取
x=2×y1+3×y2+2×y3 。
下面以1-1为例:寻找整数
z 使得
z 除以3余1、除以5余0、除以7余0
即满足:
35k≡1(mod3),此时k就是5×7模3的逆,记作
[35−1]3,那么
z=5×7×[(5×7)−1]3
那么我们将问题分解复原可得:
x=2×(5×7×[(5×7)−1]3)+3×(3×7×[(3×7)−1]5)+2×(3×5×[(3×5)−1]7)
下面要讨论的是:如果有多个满足要求的整数,那么它们之间有什么关系呢?
假设
X,Y 都满足“除以3余a、除以5余b、除以7余c”。
观察
X−Y 会发现,
X−Y 满足“除以3余0、除以5余0、除以7余0”。因此
X−Y 一定是
3×5×7=105 的倍数。
这也就是说,在“模105同余”的意义下,之前通过分解问题、组合解答的方法所得到的 x 恰恰就是唯一解。
我们不难发现上述问题的解法具有明显的化归思想,将余n的问题全部化归成余1的基础问题,从而解决
一般化描述
下面把这个问题一般化:假设整数
m1,m2,...,mn 是
k 个两两互素的正整数,则对于任意的整数
a1,a2,...,an ,同余式组
⎩
⎨
⎧xx…x≡a1(modm1)≡a2(modm2)≡an(modmn)
一定有解,且解是唯一的,若令
N=i=1∏nmi
则
x≡∑i=1nai×miN×[(miN)−1]mi
特殊情况
p 和
q 是不相同的素数,
n=p⋅q ,则对于任意的一对
(x1,x2),
0≤x1<p 且
0≤x2<q,存在唯一的数
x,
0≤x<n
x1=x mod p ,且
x2=x mod q ,所以任意整数
x 都可以使用CRT表示方法唯一的表示成
(x1,x2)。
应用
1.经典问题求解
对于类似的韩信点兵问题,我们就可以使用上述公式,并结合逆元进行求解
2.CRT加速模运算
计算:
21000000(mod77)
一般求法
使用欧拉定理和模重复平方计算法计算,但计算量还是很大:
因为77=7*11,
φ(77)=φ(7)φ(11)=60
所以
260≡1(mod77)
又1000000=16666*60+40,所以
21000000=(260)16666⋅240≡240(mod77)
设m=77,b=2.令a=1.将40写成二进制,
40=23+25运用模重复平方法,我们依次计算如下:
n0=0.计算
a0=a≡1,
b1≡b2≡4(mod77)
n1=0.计算
a1=a0≡1,
b2≡b12≡16(mod77)
n2=0.计算
a2=a1≡1,
b3≡b22≡25(mod77)
n3=1.计算
a3=a2b3≡1,
b4≡b32≡9(mod77)
n4=0.计算
a4=a3≡25,
b5≡b42≡4(mod77)
n5=1.计算
a5=a4b5≡23(mod77)
最后计算出
21000000≡23(mod77)
使用CRT优化
分析:CRT可以用于大数求模的优化,大致思路是将模数先质因数分解,形成同余式组,然后求出该式中的
b1 与
b2。
这种我们就彻底将问题转换成了CRT问题
令
x=21000000.因为77=7*11,所以
x(mod77)等价于求解同余式组
{xx≡b1(modm1)≡b2(modm2)
结合欧拉定理:
2φ(7)≡26≡1(mod7)
以及1000000=166666*6+4
所以:
b1=21000000≡(26)166666⋅24≡2(mod7)
类似的,因为
2φ(11)≡210≡1(mod11)
以及1000000=10000*10
b2=21000000≡(210)10000≡1(mod11)
分别求解同余式并结合中国剩余定理有
x≡2×(11×[11−1]7)+1×(7×[7−1]11)≡100≡23(mod77)
因此
21000000≡23(mod77)
3.RSA加密优化-CRT表示法中的运算
当我们使用RSA私钥
(n,d) 对密文
c 进行解密(或签名时),我们需要计算模幂
m=cd mod n 。私钥指数
d 并不像公钥指数
e 那样方便。一个
k 比特的模
n ,对应的私钥指数
d 差不多跟它一样长。计算的工作量同长度
k 成正比,所以对于RSA私钥的运算存在优化空间
我们可以使用CRT更有效的计算:
m=cd mod n,由于模幂的运算量随着模的比特数k的立方增加而增加。所以做两次幂运算mod p和mod q,比做一次幂运算mod n效率要高。
首先使用
p,q (p>q) 提前计算以下值:
-
dP=e−1 mod (p−1)
-
dQ=e−1 mod (q−1)
-
qInv=q−1mod p
然后恢复出
x
我们知道
(cd mod p,cd mod q),那么通过CRT我们知道存在唯一的值
cd mod n 在范围
[0,n−1]内。
结合CRT的表示方法
(x1,x2)恢复出
x ,使用Garner's方程式。
其中的
qInv=q−1mod p 可以提前计算,我们还可以结合欧拉定理来减少
cd mod p 与
cd mod q 指数。
对RSA运算而言
dP=e−1 mod (p−1)=d mod (p−1)
dQ=e−1 mod (q−1)=d mod (p−1)
m1=cdP(modp)
m2=cdQ(modq)
qInv=q−1mod p
h=qInv⋅(m1−m2) mod p
m=m2+h⋅q
裴蜀定理
描述
裴蜀定理是一个关于最大公约数(或最大公约式)的定理
若
a,b 是整数,且
gcd(a,b)=d,那么对于任意的整数
x,y,ax+by 都一定是
d 的倍数,特别地,一定存在整数
x,y ,使
ax+by=d 成立。
推论及应用
a,b 互质的充要条件是存在整数
x,y 使
ax+by=1.
- 对于裴蜀等式
ax+by=c,当且仅当m是a及b的最大公约数d的倍数时有整数解。裴蜀等式有解时必然有无穷多个整数解,每组解x,y 都称为裴蜀数,可以拓展欧几里得算法获得。例如:12 和 42 的最大公因數是 6,则方程
12x+42y=6 有解。有
(−3)×12+1×42=6,
4×12+(−1)×42=6
- 裴蜀等式也可以用来给最大公约数定义:
d 其实就是最小的可以写成
ax+by 形式的正整数。
Carmichael定理
在数论中,Carmichael函数的定义为使得
am≡1(mod )n 成立的最小正整数
m,其中
(a,n)=1 ,将
m 记作
λ(n) 。在抽象代数术语中,
λ(n) 是模
n 的乘法群的指数。
Carmichael函数也被称为规约函数(reduced totient function)以及最小泛指数函数(least universal exponent function)。
λ(8)=2,即
m=2 为使得
am≡1(mod )n 成立的最小正整数,此时对于任意的
a 满足
(a,8)=1 ,有
a2=1(mod8) 也就是说
12≡1mod8,
32=9≡1mod8,
52=25≡1mod8,
72=49≡1mod8
与欧拉函数的关系
对于欧拉函数来说,
φ(8)=4,因为欧拉函数只需要满足对于所有与8互素的数
a 有
a4≡1(mod8),而不需要满足
a 的最小性。
Carmichael定理
Carmichael定理解释了如何计算素数幂
pr 的
λ(pr)。对于奇数素数的幂以及 2 和 4,
λ(pr) 等于欧拉函数
φ(pr) ,对于
23 及以上的 2 的幂次,它等于欧拉函数的一半,即:
image-20220914003446044
用Carmichael定理计算
λ(n)
根据唯一因式分解定理,任何
n>1的整数都可以用唯一的方式写成
n=p1r1p2r2⋯pkrk,其中,
p1<p2<…<pk 是由小到大排列的素数,
r1,r2,…,rk是正整数。那么,
λ(n)就是其中每一项的
λ的最小公倍数,有:
λ(n)=lcm(λ(p1r1),λ(p2r2),…,λ(pkrk))
上述的公式可由中国剩余定理来证明,这里不再展开。
Carmichael函数的性质
由上述定理易得:
a∣b⇒λ(a)∣λ(b)
λ(lcm(a,b))=lcm(λ(a),λ(b))
二项式定理展开
(1+x)n=∑k=0nCnkxk( mod n2)=1+nx( mod n2)【从
n2 开始后面的项均可以被
n2 整除】
(1+x)n(mod n2)的数学处理:
(1+x)n=∑k=0nCnkxk( mod n2)=1+nx( mod n2)
(1+kn)m≡knm+1(modn2)
参考文章:
《深入浅出密码学》
中国剩余定理(CRT )
使用中国剩余定理CRT对RSA运算进行加速
《信息安全数学基础》-上海交通大学