非对称加密算法之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:模逆运算可采用拓展欧几里得算法,比较常规。

posted @ 2022-03-18 10:42  三木森林  阅读(181)  评论(0编辑  收藏  举报