1.模运算(mod)
模运算也可以称为取余运算,例如 23≡11(mod12),因此如果a=kn+b,也可以表示为a ≡ b(mod n),运算规则:
(a+b) mod n = ((a mod n) + (b mod n))mod n
(a*b) mod n = ((a mod n) * (b mod n)) mod n
- 完全剩余集合
1~n-1构成了自然数n的完全剩余集合,对于任意一个整数m%n都存在于1~n的集合中。
- 构造加法链
在加密算法中,运用到了大量的取模运算,对于一个k位数模n,所有的运算例如加减乘除中间结构将不会超过2k位,因此例如ax mod n将会大大简化计算时的复杂度。
例如a8 mod n 在计算时可以这样计算 ((a2 mod n)2 mod n)2 mod n
当指数x不是2的倍数时则需要构造加法链,例如25,25 = 16 + 8 +1 = 24 + 23 + 20
因此a25 mod n = (a * a8 * a16 ) mod n = ((((a2 * a)2)2)2*a)mod n
C语言表示
unsigned long ss(unsigned long x , unsigned long y , unsigned long n) { unsigned long s,t,u; int i ; s = 1; t =x ; u=y; while(u){ if(u&1) s = (s*t)&n; u>>=1; t = (t*t) % n ; } return (s); }
- 素数
最大公因数(gcd)
gcd(4,2)=2 gcd(4,3)=1 gcd(6,4)=2
c语言:
int gcd(int x,int y){ int m; while(x>0){ m = x; x = x%y; y = m; } return m
- 模逆元
逆元:
方程 的解称为 关于模 的逆,当 (即 , 互质)时,方程有唯一解,否则无解。
那么逆元可以用来干什么呢,比如说对于 ,并没有 ,但是直接除又会爆精度,这时我们就可以用到逆元,假设用 代表 的逆元,那么 。
模逆元:
4 * x ≡ 1(mod 7),即 4x = 7k + 1
更常见的问题是:1 = (a * x) mod n 也可以写作 a-1≡ x (mod n)
因此这里存在一个解集的问题:
当gcd(a,n) = 1 , a-1 ≡ x (mod n) 存在唯一解
当gcd(a,n) ≠ 1 a-1 ≡ x (mod n) 无解
如何找出a%n 的逆元,利用拓展欧几里得算法
void e_gcd(int a, int b, int &gcd, int &x, int &y) { if (b == 0) { x = 1; y = 0; gcd = a; } else { e_gcd(b, a % b, gcd, y, x); y -= x * (a / b) } }
- 费马小定理
这个定理在初中数学联赛中经常会遇到,貌似之前看过高中联赛也有过,只不过CMO作为了基础写了一下。
内容:如果m是一个素数,且a不是m的倍数,那么根据定理存在 a m-1≡ 1(mod m)
- 欧拉函数
欧拉函数:φ(n)表示从1~n-1中有多少个数与n互为质数。 φ(1) = 1,通项公式:φ(n)=n*(1-1/p1)*(1-1/p2)*(1-1/p3)*(1-1/p4)…..(1-1/pn)
其中 p1~pn为n的质因数。
在一些加密算法中,产生秘钥的过程即计算欧拉函数的过程。
- 有限域上的离散对数
模指数是频繁运用于密码学中的另一种单向函数
例如:3x≡ 15 mod 17 , x = 6
不是所有的离散对数都有相应解 例如 3 x ≡ 7 mod 13 没有整数x可以符合这个公式,因此这个离散对数无解。有限域上的离散对数存在于两种情况中:
1.质数域中的乘法群
2.有限域中的椭圆曲线群
原文地址:https://www.cnblogs.com/sylover/p/11570254.html