前驱知识:

离散对数问题

离散对数

百度百科介绍:

在整数中,离散对数(英语:Discrete logarithm)是一种基于同余运算和原根的一种对数运算。而在实数中对数的定义 logba是指对于给定的ab,有一个数x,使得bx=a。相同地在任何群G中可为所有整数k定义一个幂数为bx,而离散对数logba是指使得bx=a的整数k。 [2]

离散对数在一些特殊情况下可以快速计算。然而,通常没有具非常效率的方法来计算它们。公钥密码学中几个重要算法的基础,是假设寻找离散对数的问题解,在仔细选择过的群中,并不存在有效率的求解算法。

详细定义见 现代密码学第四版(杨波编注)

测试:

  1. 离散对数问题: 已知1<g<p(g为原根) ,1<y<p,求x使得y=gx mod p
  2. x^k=c mod p? 已知c, k, p, 如何求解
  3. p= 276297763524605454993173661243865038299

    及原根 g=2;

    y=2x=221634578126418725062848422909836271381 mod p.

    x                                                                    (答案为:3281483258849663070761913167

通过上述测试则可以继续查看下面内容

主要内容:

ElGamal 算法问题及其思考

密钥产生过程

–    首先产生一大素数p, 产生原根g和小于p的随机数x,计算y≡gx mod p,以(y, g, p)作为公开密钥,x作为秘密密钥.

加密过程

设欲加密明文消息为M(如果M长度超过p则进行分组) . 随机选整数k,1< k<p-1

计算密文对: C = {C1,C2}, 发送给接收者.

C1≡gk mod p,   C2≡ykM mod p.

参数选取

(1) 参数gp可以全网公用,也可一人一套;

(2) 加密不同的明文分组时须选用独立的随机数k,但秘密的解密密钥d 可以长期不变.

(3)通常将大素数p选为安全素数,即p=2q+1,且q为素数;

(4)  p的位数应在1024比特以上;

例题1

Alice 要加密 M= “good” Bob:

good=1735356260

首先得到 Bob的公开密钥 yB,选择随机 k= 55556855068253029573 计算:

K=2k= 2449332849913969723717932843268286 96205 mod p.

计算密文对:  C1 = 168233921366350220394075 289481675258886 mod p; C2=190728535576783591596526073857710412715 mod p.

发送 {C1,C2} 给Bob .      加密后:(good=676f6f64)

与RSA的对比

安全性分析

1.穷举攻击:

最为简单的求解DLP的方法是连续计算?0 ?1 ?2. . . ,直到得到?。这一方法需要O(?1)次乘法,这里 ?1?的阶,因此,当?足够大的值时,这不是有效方法(这恰好是密码关注的情形)最为简单的求解"DLP" 的方法是连续计算g^0,
g^1, g^2,". . . ",直到得到y。这一方法需要O(p-1)次乘法,这里 p-1是g的阶,因此,当p取足够大的值时,这不是有效方法(这恰好是密码关注的情形)。

2.小步大步算法:

?=?−1,这里??的阶。小步大步算法是对穷举搜索方法在效率和存储之间的平衡,它的基础是以下事实。如果? = ??,则 我们可以写 ?=??+?,这里 0  ? ? < ?。因此, ??  ?????,这意味着?(??)??? 这就给出如下计算 ?的方法。令m=⌈√(p-1)⌉,这里p-"1 " 是g的阶。

小步大步算法是对穷举搜索方法在效率和存储之间的平衡,它的基础是以下事实。如果β" = " g^x,则 我们可以写 x=i⋅m+j,这里" 0 "≤ i, j < m。因此, g^x  ≡ g^(i⋅m)⋅g^j,这意味着β(g^(-m) )^i≡g^j 。 这就给出如下计算 x的方法。

输入:生成元?的阶 ?1和元 ?输出: 离散对数 ?=log??(1) 设置?=?−1(2) 建立一个条目 (???)的表, 这里 0 ? < ?。以条目中      的第2项对表排序。(3) 计算?? 和设置?=?(4)  ?  ?−1 进行如下循环:(4.1)   检查  ?是否为表中某个第2 (4.2)   如果?  g? 则返回 (? = ?? + ?)(4.3)   设置  ??g?输入:生成元g的阶 p-1和元 β。
输出: 离散对数 x=log_g⁡β 。
(1) 设置m=⌈√(p-1)⌉。
(2) 建立一个条目 为(j,g^j)的表, 这里" 0 "≤j < m。以条目中
"      " 的第2项对表排序。
(3) 计算g^m  和设置γ=β。
(4)"  " i 从"0 " 到 m-1 进行如下循环:
("4.1")"   " 检查"  " γ是否为表中某个第2项 。
("4.2")"   " 如果γ ≡" " "g" ^j, 则返回 (x = i⋅m + j)。
("4.3")"   " 设置"  " γ≡γ⋅g^(-m) 。

空间和时间复杂度分析:

3.指数积分算法:

指数积分算法是目前已知最有力的计算离散对数方法。这项技术并不能应用于所有群,但是,一旦可以使用,算法为亚指数时间复杂度。指数积分算法可以应用于有限乘法群 ??指数积分算法需要选择一个相对较小在??中的元集合? ,称之为分解基。这种方法中,??中大的元可以有效表示为集合?上元的乘积。指数积分算法是目前已知最有力的计算离散对数方法。这项技术并不能应用于所有群,但是,一旦可以使用,算法为亚指数时间复杂度。指数积分算法可以应用于有限乘法群 Z_p^∗ 。指数积分算法需要选择一个相对较小在Z_p^∗ 中的元集合S ,称之为分解基。这种方法中,Z_p^∗ 中大的元可以有效表示为集合S上元的乘积。

题目与代码:

题目一:

p=26622572818608571599593915643850055101138771
{{2, 1}, {3, 1}, {5, 1}, {7, 1}, {11, 1}, {13, 1}, {17, 1}, {19, 
  1}, {29, 1}, {31, 1}, {37, 1}, {41, 1}, {47, 1}, {53, 1}, {61, 
  1}, {73, 1}, {97, 1}, {101, 1}, {103, 1}, {107, 1}, {113, 1}, {137, 
  1}, {139, 1}, {151, 1}, {167, 1}, {173, 1}, {179, 1}}

g=65537, 
g^x=14632691854639937953996750549254161821338360 (mod p)
利用中国剩余定理求x;

代码一:

import math#欧几里得算法求最大公约数def get_gcd(a, b):k = a // bremainder = a % bwhile remainder != 0:a = b b = remainderk = a // bremainder = a % breturn b#扩展欧几里得算法求线性方程的x与ydef get_(a, b):if b == 0:return 1, 0else:k = a // bremainder = a % b        x1, y1 = get_(b, remainder)x, y = y1, x1 - k * y1         return x, y#计算逆元的函数,返回值是逆元
def answer(a,b):        #将初始b的绝对值进行保存if b < 0:m = abs(b)else:m = bflag = get_gcd(a, b)if flag == 1: x, y = get_(a, b)  x0 = x % m #对于Python '%'就是求模运算,因此不需要'+m'return x0else:return("Do not have!")def str_to_hex(s):return ' '.join([hex(ord(c)).replace('0x', '') for c in s])def hex_to_str(s):return ''.join([chr(i) for i in [int(b, 16) for b in s.split(' ')]])def str_to_bin(s):return ' '.join([bin(ord(c)).replace('0b', '') for c in s])def bin_to_str(s):return ''.join([chr(i) for i in [int(b, 2) for b in s.split(' ')]])def exGcd(a,b,xy):#求特解if b==0:xy[0]=1xy[1]=0#print ("(f, g) is ", a)return ar=exGcd(b,a%b,xy)t = xy[0]xy[0] = xy[1]xy[1]=t-a//b*xy[1]return r
#-----------------------------------------以下为求出密文的e次方---------------------------#a=26622572818608571599593915643850055101138771
h=14632691854639937953996750549254161821338360
s=[[2, 1], [3, 1], [5, 1], [7, 1], [11, 1], [13, 1], [17, 1], [19, 1], [29, 1], [31, 1], [37, 1], [41, 1], [47, 1], [53, 1], [61, 1], [73, 1], [97, 1], [101, 1], [103, 1], [107, 1], [113, 1], [137, 1], [139, 1], [151, 1], [167, 1], [173, 1], [179, 1]]g=65537
x=1
n=[]#模数mi
e=[]#加密指数
c=[]#密文
hi=[]
gi=[]
r=len(s)for i in s:for j in range(i[1]):x=x*i[0]n.append(i[0])
#print(x-(a-1))for i in range(r):q=a//s[i][0]x=pow(g,q,a)gi.append(x)
for i in range(r):q=a//s[i][0]x=pow(h,q,a)hi.append(x)for i in range(r):for j in range(0,s[i][0]-1):x=jt=pow(gi[i],x,a)if(t==hi[i]):c.append(x)breakprint(c)
#print(hi)
#print(gi)
#print(len(c)-len(n))Z=1#即是m
for i in range(r):Z=Z*n[i]
#print(Z)z=[]#保存的是每一项的ai*Mi*Mi'for i in range(r):Mi=(Z//n[i])#即是Mi#print(Mi)x=(answer(Mi,int(n[i])))#求出 Mi'print(x)s=Mi*x#print(s)s=s*c[i]z.append(s)ans=0#求和的结果
for i in z:ans=ans+ip=ans%Z#即是密文的e次方
#a=e[0]#本题的加密指数为5
print(p)'''#———————————————————————以下为大数开方(考虑牛顿迭代法)———————————————#def five_e_root(x):if(x==0):return 0x0=xx1=(4*x0//5)+(x//(x0*x0*x0*x0*5))#迭代法求五次方根while(abs(x1-x0)>0.00001):#要求精度x0=x1x1=(4*x0//5)+(x//(x0*x0*x0*x0*5))return x1#print(p)
p=five_e_root(p)
#print(p)#结果p=hex(p)#转换为16进制
print(p)'''

题目二:

椭圆曲线是secp256k1
y^2 = x^3 + ax + b,其中 a = 0,b = 7
p = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F = 2 ^ 256 - 2 ^ 32 - 2 ^ 9 - 2 ^ 8 - 2 ^ 7 - 2 ^ 6 - 2 ^ 4 - 1 
点G的x和y坐标分别为:
x=79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798    y=483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8

已知私钥为您的学号,求公钥

[115558381663906209150297993116070464229031829974553177032784681955324439750888, 84875200934012589315793426756669380005172249774350913639994928299122491983685]

#coding:utf-8
#欧几里得算法求最大公约数
def get_gcd(a, b):k = a // bremainder = a % bwhile remainder != 0:a = b b = remainderk = a // bremainder = a % breturn b#改进欧几里得算法求线性方程的x与y
def get_(a, b):if b == 0:return 1, 0else:k = a // bremainder = a % b       x1, y1 = get_(b, remainder)x, y = y1, x1 - k * y1          return x, y#返回乘法逆元
def yunsle(a,b):#将初始b的绝对值进行保存if b < 0:m = abs(b)else:m = bflag = get_gcd(a, b)#判断最大公约数是否为1,若不是则没有逆元if flag == 1:   x, y = get_(a, b)   x0 = x % m #对于Python '%'就是求模运算,因此不需要'+m'#print(x0) #x0就是所求的逆元return x0else:print("Do not have!")mod=0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
#print(mod)
#mod=23
a=0
b=7
G=[0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798,0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8]
#G=[3,10]
#次数
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#私钥k为您的学号
k=xxxxxxx
temp=Gdef get_result2(tmp_list):P=tmp_list[0]for i in range(1,len(tmp_list)):Q=tmp_list[i]if P == Q:aaa=(3*pow(P[0],2) + a)bbb=(2*P[1])if aaa % bbb !=0:val=yunsle(bbb,mod)y=(aaa*val) % modelse:y=(aaa/bbb) % mod else:aaa=(Q[1]-P[1])bbb=(Q[0]-P[0])if aaa % bbb !=0:val=yunsle(bbb,mod)y=(aaa*val) % modelse:y=(aaa/bbb) % modRx=(pow(y,2)-P[0] - Q[0])  % modRy=(y*(P[0]-Rx) - P[1])  % modP=[Rx,Ry]return Pdef jieguo(G,num):global list1temp=Gi=2while(i*2<=num):aaa=(3*pow(temp[0],2) + a)bbb=(2*temp[1])if aaa % bbb !=0:val=yunsle(bbb,mod)y=(aaa*val) % modelse:y=(aaa/bbb) % modRx=(pow(y,2)-temp[0] - temp[0]) % modRy=(y*(temp[0]-Rx) - temp[1]) % modtemp=[Rx,Ry]i=i*2list1.append(temp)rest_num=num-iif rest_num!=0:jieguo(G,rest_num)list1=[]
jieguo(G,k)
list1.append(G)
result=get_result2(list1)print(result)#print(temp)

ElGamal 算法思考相关推荐

  1. Pohlig-Hellman算法求Elgamal算法私钥+大步小步法解决DLP(离散对数问题)

    目录 问题描述:在利用Elgamal算法公钥中,已知参数(本题中数字均为十进制整数) 一.大步小步法 (一).原理: (二).实现思路 (三).代码实现 二.Pohlig-Hellman (一). 原 ...

  2. ELGamal算法的编程实现

    ELGamal算法的编程实现 [实验目的] [实验环境] [实验预备知识点] [实验内容] [实验步骤] [实验思考题] [实验目的] 1.理解非对称密码算法的工作原理 2.了解ELGamal算法的密 ...

  3. ElGamal算法加解密

    文章目录 ElGamal算法加解密 算法流程 代码实现 测试数据 运行结果 ElGamal算法加解密 算法流程 参数选取:素数p,生成元g,小于p的随机非负整数x 产生密钥:公钥: y = g ^ x ...

  4. 密码学之公钥密码体系(3):ElGamal算法

    密码学之公钥密码体系(3):ElGamal算法 文章目录 1. ElGamal算法 2. ElGamal算法基本原理 2.1 ElGamal密钥生成 2.2 ElGamal加密过程 2.3 ElGam ...

  5. elgamal签名算法c语言,ElGamal算法

    [声明] 一.本文实用于初学者,目的在于帮助大家熟悉一些系统底层的知识. 二.本文只是为了让广大网友共同提高一些基础知识,本人决无卖弄之意,只供需要这方面知识的读者阅读,如果你是高手,或者不需要这方面 ...

  6. python实现公钥密码ElGamal算法

    Program : ElGamal (on group) In this part, you are required to implement the ElGamal algorithm from ...

  7. elgamal加密算法 java_JAVA加解密17-非对称加密算法-ElGamal算法

    一.概述 1.ElGamal算法和ECC算法基于离散对数问题 2.这个是一个单向的过程.虽然密钥对构造简单,但是只是乙方向另外一方单向传送数据进行加解密,不能反向操作 3.这里只有"公钥加密 ...

  8. 分布式唯一id:snowflake算法思考

    匠心零度 转载请注明原创出处,谢谢! 缘起 为什么会突然谈到分布式唯一id呢?原因是最近在准备使用RocketMQ,看看官网介绍: 一句话,消息可能会重复,所以消费端需要做幂等.为什么消息会重复后续R ...

  9. 基于双向匹配的陌生人社交策略及算法思考

    前言 作为连接人的工具,社交产品的价值不言而喻:熟人社交领域,微信已占据绝对霸主地位,但是在陌生人社交领域还未出现类似绝对地位的产品,今天就以探探和Tinder为例,跟大家聊聊陌生人社交.本文主要通过 ...

最新文章

  1. 微信小程序 自定义导航栏,只保留右上角胶囊按钮
  2. arcgis server 开发
  3. mac平台反编译apk,获取源码,androidmanifest和资源文件
  4. Artifactory——启动错误[Artifactory failed to initialize: check Artifactory logs for errors.]解决方案
  5. 新的学期、新的开始、新的付出、新的收获!
  6. Mac VSCode配置C语言环境(可以调试)
  7. Onedrive云盘程序——OneManager小白设置指南
  8. Ubuntu Server 16.04 安装并用两块硬盘做RAID1
  9. paip.软件开发之COOKIE调试
  10. UE4 GameplayTag 初始化造成崩溃错误
  11. qq西游服务器制作教程,QQ西游修罗版开区一键服务端+完整客户端+GM辅助工具+教程...
  12. 记Chrome崩溃解决方案
  13. chart的简单使用
  14. OSChina 周二乱弹 ——女孩在身上纹了个四叶草
  15. Codeforces - Serval and Rooted Tree
  16. css3怎么做多边形,CSS | 实现有趣的多边形
  17. 软文发稿推广要怎么做?
  18. element的el-table-column循环渲染和自定义列
  19. 借助海尔平台打造智能家居的一点想法
  20. 惠普光影精灵7Victus 评测

热门文章

  1. canner CMS 系统 (公司在台湾) https://www.canner.io/
  2. Java爬虫历险记 -- (1)爬取百度首页的logo
  3. SpringBoot整合MybatisPlus实战动态SQL,java定时器实现原理
  4. 上市公司广告宣传推广费-含沪深A股主板、中小企业板等(2011-2020年)
  5. React Native开发环境配置检测
  6. 欧姆龙PLC以太网与西门子WINCC通讯
  7. java周志第二周_20165325 2017-2018-2 《Java程序设计》结对编程_第二周:四则运算
  8. 基于MATLAB的图片中字符的分割与识别
  9. 史上最详尽的RGB-D传感器选型调研报告
  10. Python统计文件夹大小