非对称加密算法之EIGamal公钥密码体制
非对称加密算法之EIGamal公钥密码体制
依赖数学难题:离散对数问题
什么是离散对数问题?在掌握这个问题之前,得先知道一点数学概念
欧拉函数
在RSA中,有提到,不再详细叙述。就是求对于正整数n,有多少个小于它并且和它互质的正整数。表达式\(\varphi(n)\)
欧拉定理
若n,a为正整数,且n、a互质,则\(a^{\varphi(n) }\equiv1(mod n)\),这也就是所谓的欧拉定理。
原根
仍然设n、a为互质的正整数,令\(a^d\equiv1(mod n)\),如果用\(\delta(n,a)\)表示使该式子成立的最小整数d,此时如果\(\delta(n,a)=\varphi(n)\)成立,则称a为模n的原根。
通俗点来讲,使\(a^d\equiv1(mod n)\)成立的d有很多的值,而如果所有的d值中,\(\varphi(n)\)的值是最小的,那么久称a是n的原根
举例说明:
假如n=7,a=3,两数互质.则\(3^1、3^2、3^3、3^4、3^5、3^6 (mod 7)\)分别等于3、6、2、4、5和1。很显然,只有d=6时满足\(3^d\equiv1(mod 7),d=\varphi(7)\)这个时候就可以称a=3为模7的原根。
再举一个反例:
假如n=7,a=2,两数互质,但\(2^1、2^2、2^3、2^4、2^5、2^6 (mod 7)\)分别等于2、4、1、2、4、1。发现d分别为3和6时,都满足式子,但是d取最小时,不等于\(\varphi(7)\)。所以a=2不是模7的原根。
而且原根有个性质,那就是\(\delta(n,a)\)一定能整除\(\varphi(n)\),所以在判断a是不是原根的时候,只需要检验a的\(\varphi(n)\)的可约次方模n的值即可。
还有就是我们可以运用以上性质,很轻易地就完成一些看似很复杂的运算,比如求解\(7^{222}\)的个位是几。
计算过程如下
\(7^{222}=(7^4)^{55}*7^2\)
而\(7^4\)中的4为欧拉函数\(\varphi(10)\)的值,而\(\varphi(10)\)是一个计算个位非常重要的存在,因为需要mod10运算所以原式为
\(=(7^{\varphi(10)})^{55}*7^2\)
由欧拉定理得\((7^{\varphi(10)})=1(mod10)\)
=\(1^{55}*7^2=9(mod 10)\)
离散对数
终于讲回了正题,离散对数是什么,如果对于一个整数b和质数p和质数p的原根a,可以找到一个唯一的指数i,使得\(b=a^i\ (mod \ p)\ \ \ 其中\ 0\leqslant i\leqslant p-1\)成立,那么指数i也就称为b的以a为基数的模p的离散对数。
离散对数难题
而离散对数的难题则是指,当已知一个大质数p和它的一个原根a,如果给定一个b,要计算b的以a为基数的模p的离散对数i的值是很困难的。
ELGamal加密算法
介绍完其数学基础后,就该直接介绍加密算法了。
私钥与公钥的计算
以下步骤依次进行
- 随机地选择一个大素数p,要求p-1有大素数因子,p是公开的,作为公钥一部分
- 选择一个模p的原根\(\alpha\),公开,作为公钥一部分
- 选取整数\(i\),使\(i\in(1,p-1)\),这个是私钥,作为私钥保管。
- 计算\(b=\alpha^i(mod\ p)\),b也是公开的。
自此,我们得到了公钥集合\((p,\alpha,b)\)和私钥\(i\)。
这个保密效果为什么好呢,因为本运算基于离散对数困难性,b的以α为基数的模p的离散对数i的计算是很困难的,也就是由公钥得出私钥是很困难的。
加密过程
对于明文消息M,采取以下步骤进行加密
- 随机地选取一个整数\(k,k\in(1,p-1)\)
- 计算\(U=b^k(mod\ p)\),使用公钥中的b、p
- 计算\(C_1=\alpha^k(mod\ p)\),使用公钥中的α、p
- 计算\(C_2=UM(mod\ p)\),使用明文M和前面得到的U和公钥中的p
- 得到的\((C_1,C_2)\)也就是我们的密文
解密过程
- 计算\(V=C_1{^i}(mod\ p)\)
- 计算\(M=V^{-1}(mod\ p)\)
tip:模逆运算可采用拓展欧几里得算法,比较常规。