非对称加密算法之EIGamal公钥密码体制

非对称加密算法之EIGamal公钥密码体制

依赖数学难题:离散对数问题

什么是离散对数问题?在掌握这个问题之前,得先知道一点数学概念

欧拉函数

在RSA中,有提到,不再详细叙述。就是求对于正整数n,有多少个小于它并且和它互质的正整数。表达式φ(n)

欧拉定理

若n,a为正整数,且n、a互质,则aφ(n)1(modn),这也就是所谓的欧拉定理。

原根

仍然设n、a为互质的正整数,令ad1(modn),如果用δ(n,a)表示使该式子成立的最小整数d,此时如果δ(n,a)=φ(n)成立,则称a为模n的原根。

通俗点来讲,使ad1(modn)成立的d有很多的值,而如果所有的d值中,φ(n)的值是最小的,那么久称a是n的原根

举例说明:

假如n=7,a=3,两数互质.则313233343536(mod7)分别等于3、6、2、4、5和1。很显然,只有d=6时满足3d1(mod7)d=φ(7)这个时候就可以称a=3为模7的原根。

再举一个反例:

假如n=7,a=2,两数互质,但212223242526(mod7)分别等于2、4、1、2、4、1。发现d分别为3和6时,都满足式子,但是d取最小时,不等于φ(7)。所以a=2不是模7的原根。

而且原根有个性质,那就是δ(n,a)一定能整除φ(n),所以在判断a是不是原根的时候,只需要检验a的φ(n)的可约次方模n的值即可。

还有就是我们可以运用以上性质,很轻易地就完成一些看似很复杂的运算,比如求解7222的个位是几。

计算过程如下

7222=(74)5572

74中的4为欧拉函数φ(10)的值,而φ(10)是一个计算个位非常重要的存在,因为需要mod10运算所以原式为

=(7φ(10))5572

由欧拉定理得(7φ(10))=1(mod10)

=15572=9(mod10)

离散对数

终于讲回了正题,离散对数是什么,如果对于一个整数b和质数p和质数p的原根a,可以找到一个唯一的指数i,使得b=ai (mod p)    0ip1成立,那么指数i也就称为b的以a为基数的模p的离散对数。

离散对数难题

而离散对数的难题则是指,当已知一个大质数p和它的一个原根a,如果给定一个b,要计算b的以a为基数的模p的离散对数i的值是很困难的。

ELGamal加密算法

介绍完其数学基础后,就该直接介绍加密算法了。

私钥与公钥的计算

以下步骤依次进行

  • 随机地选择一个大素数p,要求p-1有大素数因子,p是公开的,作为公钥一部分
  • 选择一个模p的原根α,公开,作为公钥一部分
  • 选取整数i,使i(1,p1),这个是私钥,作为私钥保管。
  • 计算b=αi(mod p),b也是公开的。
    自此,我们得到了公钥集合(p,α,b)和私钥i
    这个保密效果为什么好呢,因为本运算基于离散对数困难性,b的以α为基数的模p的离散对数i的计算是很困难的,也就是由公钥得出私钥是很困难的。

加密过程

对于明文消息M,采取以下步骤进行加密

  • 随机地选取一个整数kk(1,p1)
  • 计算U=bk(mod p),使用公钥中的b、p
  • 计算C1=αk(mod p),使用公钥中的α、p
  • 计算C2=UM(mod p),使用明文M和前面得到的U和公钥中的p
  • 得到的(C1,C2)也就是我们的密文

解密过程

  • 计算V=C1i(mod p)
  • 计算M=V1(mod p)

tip:模逆运算可采用拓展欧几里得算法,比较常规。

posted @   三木森林  阅读(245)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示