阶和原根
阶和原根的定义
若对于数 a,有
ad≡1modm
且 d 是满足上述方程的最小正整数,则 d 为整数 a 模上 m 的阶,记作
ordm(a)=dσm(a)=d
寻找整数 a 模上 m 的阶
int step(int a, int m){
for(int i = 1; i < φ(m); i++){
if(pow(a, i) % m == 1){
return i;
}
}
return φ(m);
}
1
2
3
4
5
6
7
8
9
由欧拉定理可知,当(a, m) = 1
时,下式一定成立
aφ(m)≡1modm
当 a 模上 m 的阶 ord(a) = d,这个阶 d 等于 m 的欧拉函数值 φ(m) 时,我们称 a 是模 m 的一个原根
由于欧拉定理的前提条件(a, m) = 1
,故原根 a 只有可能出现在 m 的简化剩余系中(也叫既约剩余系,其元素个数等于 φ(m))
阶和原根的性质
阶将整除使同余方程成立的任意指数
ordm(a)=d→adi≡1modmd∣di
换句话说,阶 d 一定是其余所有使指数同余方程成立的指数 di 的因子(最小公因子)
剩余系的原根表示
用原根的指数形式可以表示模 m 的一个既约剩余系
[1,a,a2,...,aφ(m)−1]
若 m 是一个素数,原根可以表示一整个剩余系,即完全剩余系
[0,1,a,a2,...,aφ(m)−1]
对于原根的指数,有以下推论,当 a 是模 m 的原根,则 a 的 k 次方也是模 m 的原根
ak≡1modm(k,φ(m))=1
其实这是模 m 因子运算的一个子集,完整的推论是说,当
(k,φ(m))=d→adφ(m)≡1modm
d 是模 m 的某个因子,k 是原根上要指的指数,并且这个 k 一定是 a 模 m 的阶(当 d = 1 时,a 的指数 φ(m)/d 则一定等于 φ(m),即 φ(m) 为 a 的阶,故 a 为原根)
求解阶和原根
求解原根:最朴素的想法就是从小往上遍历,再一个个指数从小往大遍历,找到第一个 d = ord(a) 的整数
但根据原根 a 的性质
(k,φ(m))=d→ak≡1modm
可以根据已知的某一个快速求解所有原根
求解所有的阶
快速求解单一原根,根据 φ(m) 的因子指数计算,如求解 43 的一个原根,有
φ(43)=42→[1,2,3,6,7,14,21,42]
在对原根进行判断时,不用一个一个往上爬着求,直接求因子次方即可,如
22≡423≡826≡2127≡−1214≡1(mod43)
故 2 的阶为 14,不等于 φ(m),故不是原根,对于 3
32≡9...342≡1(mod43)
故 3 是 43 的一个原根,再根据既约剩余系的指数 i
[1,3,32,...,341]
若有指数 i 与 φ(m) 互质
(i,φ(m))=1→(3i)φ(m)≡1mod43
则 3 的 i 次方的阶为 φ(m),一定也为原根
如对于指数 5 而言,其与 φ(m) 互质(最大公因子为 1)
(5,42)=1→35≡28mod43
所以 28 也是 43 的一个原根
离散对数密钥协商
DH(Diffie-Hellman 算法),即为密钥协商
双方密钥协商过程如下
- 首先,选取一个大素数模 p,以及它的一个原根 g
- A 生成一个随机数 x,发送 g 的 x 次方给 B
- B 收到 g 的 x 方,另外生成一个随机数 y,并发送给 A
此时 A 和 B 就通过
作为会话密钥进行加密解密,即设 a 为明文
c≡gxyamodpa=indgc
a 为模 p 关于原根 g 的 c 的离散对数
椭圆曲线
群论基础
群、子群、阿尔贝群、陪集
自己去看,和离散数学内容重合
椭圆域几何定义及倍点
狭义的椭圆曲线
a2x2+b2y2=1
广义的椭圆曲线
y2=x3+ax+b
每个椭圆曲线都有一个无穷远点 O,这是椭圆曲线上的加法单位元,其实就是纵坐标 y = 0 的点
同一直线上的三个不同点的和一定为 O,单位元点有以下性质(符合群的定义)
椭圆上的加法:图 a 中,Q+R = -P1,P1 为直线 QR 和椭圆曲线的交点,-P1 为其关于 x 轴的对称点,图 b 同理
关于倍点,倍点运算即为重复加法运算
- 对于 2Q = Q+Q 来说,即在椭圆曲线一上做 Q 点的切线,假设与椭圆曲线二交于 R,则 -R 为其和点
- 对于 3Q = Q+Q+Q 而言,已知 2Q = -R,再加一个 Q,即连接 Q 和 -R,其交点 H 一定过曲线一,-H 即为 3Q
注意这里的 -R 和 -H 均为椭圆曲线上的逆元,其实并非直接将纵坐标取负(只是在上述两图中如此,为特殊情况),下面有说,其实是纵坐标的负数模上椭圆系的系数
椭圆域的代数加法
一些概念
- 椭圆域:即椭圆曲线上的阿尔贝群(满足交换律的群)
- 椭圆离散系,去除线的概念,椭圆系由一个个离散的点组成
椭圆曲线的代数逆元
P(x,y)→P−1=(x,−ymodp)
其中 p 为椭圆曲线的参数,有时也直接记作 -P
当某点的纵坐标 y 被 p 整除时,我们说这个点是一个无穷远点 O,如对于系数 p = 23 的椭圆域一定有无穷远点 O 如下
E23(a,b)→O(x0,23n)
在代数上,加法的坐标满足:P(x1, y2), Q(x2, y2), R(x3, y3) = P + Q
{x3=k2−x1−x2(modp)y3=k(x1−x3)−y1(modp)
对于常数 k,有
k={2y13x12+a(modp)x2−x1y2−y1(modp)P=QP=Q
其中 a 是椭圆曲线中 x 的系数(这里的 a 和 p 都是定义椭圆域的常数,已知)
椭圆曲线中逆元的计算(如何将小数化为整数),如对于 E23 的椭圆域
−2−1mod23=?
首先要将 2 的 -1 次方视为 2 的逆元,根据辗转相除法可知
1=23−11×2⇒2−1=−11=12(mod23)
所以有
−2−1mod23=−12mod23=11 举个栗子:在系数在E23
上且a = 1
的椭圆系中,有P(3, 10), Q(9, 7)
1、求解 -P
根据椭圆系的逆元定义,有
−P=(3,−10mod23)=(3,13)
2、求解 R = P + Q
首先明确 P 不等于 Q,则斜率 k 为
k=x2−x1y2−y1=−2−1mod23
这里采用逆元的计算方式来表示 -1/2,根据广义欧几里得有
1=23−11×2
固有
2−1=−11⇒k=−2−1=11mod23
根据公式直接计算 R 的横坐标
x3=k2−x1−x2=121−3−9(mod23)=17
纵坐标
y3=k(x1−x3)−y1=11×(3−17)−10(mod23)=20
故 R 坐标为 (17, 20)
3、求解 2P
这是一个倍点运算,此时斜率 k 为
k=2y13x12+a=203×32+1=57=7×5−1
根据辗转相除法,易知 5 的逆元为 -9
2353=4×5+3=3+2=3+1⇒1=−5+2×(23−4×5)=2×23−9×5=3−(5−3)=−5+2×3=3−2
则有
k=7×(−9)mod23=−63mod23=6
代入坐标计算公式
x3y3=k2−2x1(mod23)=7=k(x1−x3)−y1(mod23)=12
故 2P 坐标为 (7, 12)
椭圆域的倍点运算
对于 nP,将系数 n 用二进制表示,采用和快速模运算类似的方式,对 P 进行 logn 次加法(二倍点)运算
就是当当前位为 1 时,多加一个原点 P,同时每一轮进行一次二倍点运算(乘以 2)
- 模平方运算是当当前位为 1 时多乘上一个底数 a,其余时间每轮进行平方运算
倍点运算的代码实现
椭圆曲线加密
加密解密过程(背下来),公钥是用来加密的,私钥是用来解密的
就是通过一个公钥,进行倍点运算加密,倍点运算结果很难进行还原