现代密码学中的数论基础知识梳理 2021-09-05 网络 暂无评论 2152 次阅读 #导读 数论是一门研究自然数之间的关系和规律的学科,普遍认为是纯数学的分支,但并非是完全没有实用性的学科。现代密码学中用到了很多基础数论中的结论,特别是公钥加密体系(例如RSA算法,椭圆曲线加密等)。 本文目的在于梳理现代密码学中常用到的基础数论方面的定理和结论。其中包括素数的特性、欧几里德算法、线性方程定理、算术基本定理、模算数运算、线性同余定理、欧拉函数、费马小定理、中国剩余定理、欧拉定理、本原根、离散对数问题等等一些基础知识。了解这些知识,应该能够理解现代密码学中经典的 Diffie-Hellman密钥协商和RSA算法的原理,进而能够理解秘钥管理、数字签名、消息认证、公钥证书等密码学领域的问题。 本文很大程度上参考了数论概述里面的内容,也借鉴了算法导论和密码编码学与网络安全原理与实践的相关章节。 #一、关于互质和整除的一些有用结论和定理 数论对素数的特性尤其感兴趣,素数是整数的基础构件,就像是元素在化学式中的作用类似。 1、d整除a记作:$$d \mid a$$ 如果$$d \mid a$$且$$d \mid b$$,那么$$d \mid (ax + by)$$ 2、如果$$p$$是素数,且$$p$$整除乘积$$ab$$,则$$p$$整除$$a$$或者$$p$$整除$$b$$(或者$$p$$同时整除$$a$$和$$b$$)。 证明的关键是假设$$p$$不整除$$a$$,考虑$$1=gcd(p,a)$$同时整除$$p$$和$$a$$。但由于$$p$$是素数,$$p$$的因子只能是1或者$$p$$,所以$$gcd(p,a)=1$$。由后面的线性方程定理得知,可以构造线性方程$$px+ay=1=gcd(p,a)$$,两边同时乘上$$b$$,得$$bpx+aby=b$$,$$p$$整除左边等价于$$p$$整除右边的$$b$$。$$p$$不整除$$b$$的情况可以用同样的方式证明。 拓展:如果素数$$p$$整除整数乘积`$$a_{1}a_{2}a_{3}...a_{r}$$`,则$$p$$至少整除`$$a_{1}$$,$$a_{2}$$,$$a_{3}$$,...,$$a_{r}$$`中至少一个因数。 3、1和任意一个自然数是都是互质关系。 4、任意两个质数构成互质关系。 5、一个数是质数,另一个数只要不是前者的倍数,两者就构成互质关系,比如3和10。 6、如果两个数之中,较大的那个数是质数,则两者构成互质关系,比如97和57。 7、$$p$$是大于1的整数,则$$p$$和`$$p-1$$`构成互质关系,比如57和56。 8、$$p$$是大于1的奇数,则$$p$$和`$$p-2$$`构成互质关系,比如17和15。 9、素数$$p$$与1到`$$p-1$$`的任意整数均互质。并且阶乘`$$(p-1)!$$`与$$p$$互质,这个结论在后面费马小定理和欧拉定理的证明过程中会用到。 #二、欧几里德算法 欧几里德算法的原理和流程其实比较容易理解。 (GCD递归定理) :对于任意的非负整数$$a$$和正整数$$b$$,满足 $$gcd(a,b)=gcd(b,a\;mod\;b)$$ 更详细的将,其计算流程: `$$a=q_{1}\times b+r_{1}\\b=q_{2}\times r_{1}+r_{2}\\r_{1}=q_{3}\times r_{2}+r_{3}\\r_{2}=q_{4}\times r_{3}+r_{4}\\...\\r_{n-3}=q_{n-1}\times r_{n-2}+r_{n-1}\\r_{n-2}=q_{n}\times r_{n-1}+r_{n}\\r_{n-1}=q_{n+1}\times r_{n}+0\\$$` `$$r_{n}$$`即为求得的$$a$$和$$b$$的最大公约数。 以上流程主要需要思考三个问题: 1)为什么`$$r_{n}$$`是公约数?(需要从下往上推理) 2)为什么`$$r_{n}$$`是最大的公约数?(假设$$d$$是$$a$$与$$b$$的任意公约数,如果能够证明$$d$$整数`$$r_{n}$$`,即可得证。) 3)为什么欧几里德算法最后一定会终止?(因为每轮辗转之后的余数是单调递减的,辗转的轮次数有上界,最后一定能够保证余数为0,然后取最后一个非零余数`$$r_{n}$$`就是正确的结果。) 算法实现Demo: ``` //欧几里德算法迭代实现 public static int getGCD(int a,int b) { if (a=b return getGCD(b, a); } if (b>=1) {//保证b>=1 int temp = 0; while(b>0) { temp = a%b; a = b; b = temp; } return a; }else { return -1; } } ``` #三、扩展欧几里德算法 扩展欧几里德算法可以用来求解一类有意思的线性方程的整数解,该线性方程的整数求解过程与最大公约数有密切关系。 对于线性方程(a,b,c为常数): $$ax+by=c$$ 是很熟悉的方程。这里讨论情况是a,b,c满足一定的关系:$$c=gcd(a,b)$$,也即是这样的线性方程: $$ax+by=gcd(a,b)$$ 这个线性方程必然有整数解,但我们更关心如果用更好算法去求解,该算法利用欧几里德算法求解最大公约数过程中的中间商和余数,进行扩展运算,在求$$gcd(a,b)$$的过程中,同时也就求得线性方程的整数解$$(x,y)$$。 算法实现Demo: ``` public static long[] gcdExt(long a,long b){ long ans; long[] result=new long[3]; if(b==0) { result[0]=a; result[1]=1; result[2]=0; return result; } long [] temp=gcdExt(b,a%b); ans = temp[0]; result[0]=ans; result[1]=temp[2]; result[2]=temp[1]-(a/b)*temp[2]; return result; } ``` #四、算术基本定理 (算术基本定理):每个整数$$n\geqslant 2$$可唯一分解成素数的乘积: `$$n=p_{1}^{e_{1}}p_{2}^{e_{2}}...p_{r}^{e_{r}}$$` 其中,`$$p_{i}$$`为素数,且`$$p_{1} 标签: 密码学 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。