目录

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

问题描述:在利用Elgamal算法公钥中,已知参数(本题中数字均为十进制整数)

p=26622572818608571599593915643850055101138771
g=65539,
小明的公钥为:
14632691854639937953996750549254161821338360
如果你知道模数p-1可以分解为
{{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}}
请利用Pohlig–Hellman算法求私钥x;

一、大步小步法

(一)、原理:

g为p的原根,p-1是g的阶,求解问题为x=loggβ。x = {log}_g{\beta}。x=logg​β。

若使用穷举方法对x尝试0到p-1之间的数,验证β=gx\beta=g^xβ=gx,则算法复杂度为O(p-1)

小步大步法基于以下事实:

β=gx\beta = g^xβ=gx,设x=i⋅m+jx = i ·m+jx=i⋅m+j,其中0≤i,j<m0\leq i,j < m0≤i,j<m,如果令m=p−1m=\sqrt{p-1}m=p−1​,此时建立一个条目为(j,gj)(j,g^j)(j,gj)的表(j表的长度为m)\sqrt{m})m​),则i⋅m+ji ·m+ji⋅m+j可以遍历1到p-1的全部内容,并且遍历的复杂度取决于i,为O(p−1)O(\sqrt{p-1})O(p−1​),(m为定值,j已经存放在表中,建立j表的复杂度为O(p−1)O(\sqrt{p-1})O(p−1​),j表排序的复杂度为O(p−1⋅logp−1)O(\sqrt{p-1}·{log}\sqrt{p-1})O(p−1​⋅logp−1​),所以总复杂度为O(p−1)O(\sqrt{p-1})O(p−1​)
ps:在x=i⋅m+j中ps:在x = i ·m+j中ps:在x=i⋅m+j中,对于每个i,j,其变化较小每次加1,这是小步,而导致x每次变化的间隔较大为m(因为i·m),这是大步,即为小步大步法命名

大步小步法分析参考文章:https://blog.csdn.net/m0_66201040/article/details/124453140
复杂度分析:

(二)、实现思路

输入:生成元g的阶p-1和元β\betaβ
输出:离散对数x=loggβx = {log}_g{\beta}x=logg​β
– 设置m=⌈p−1⌉m =\lceil\sqrt{p-1}\rceilm=⌈p−1​⌉
– 建立一个条目为 的表(j,gj(modp)g^j(mod p)gj(modp)),其中 。以条目中的第二项对表排序
– 计算 和设置g^m
– 从0到m-1进行如下循环
• 检查γ\gammaγ是否为表中某个第2项。
• 如果γ≡gi(modp)\gamma \equiv g^i(mod p)γ≡gi(modp),则返回(x=i·m+j)
• 设置 γ=γ⋅g−m\gamma = \gamma ·{g^{-m}}γ=γ⋅g−m (其中g−m为gmg^{-m}为g^mg−m为gm的模逆元)

(三)、代码实现

## n为g的阶
import gmpy2
def little_big_step_method(g,beta,N,p):# 求解x = (log_g)betam = int(math.sqrt(N))+1gj_j_dict= {}# 建立(g^j,j)表,与上述原理(j,g^j表内容相反)for j in range(0,m):gj_j_dict[pow(g,j,p)] = j gj_sorted_list = sorted(gj_j_dict)gamma = betafor i in range(0,m):if gamma in gj_sorted_list:return i*m + gj_j_dict[gamma]gamma = (gamma * gmpy2.invert(pow(g,m,p),p) )%p

二、Pohlig-Hellman

(一)、 原理

如果要求解x使得β=gxmodp\beta = g^x mod pβ=gxmodp,g为素数p的原根,阶为p-1 ,如果p−1=Πi=1tqieip-1= \Pi_{i=1}^{t}q_i^{e^i}p−1=Πi=1t​qiei​,且qiq^{i}qi互素,那么若能高效求出xmodq1e1,xmodq2e2,...,xmodqieix\;mod\;q_1^{e_1},x\;mod\;q_2^{e_2} ,...,x\;mod\;q_i^{e_i}xmodq1e1​​,xmodq2e2​​,...,xmodqiei​​,就可以使用中国剩余定理快速求出xmod(p−1)x\;mod\;(p-1)xmod(p−1)

令xi=xmodqieix_i = x\;mod\;q_i^{e_i}xi​=xmodqiei​​,则会有x=ki⋅qiei+ri,β=gxmodx=k_i·q_i^{e_i}+r_i,\beta = g^x\;mod\;x=ki​⋅qiei​​+ri​,β=gxmod,p记g的阶为N=p-1则有:
βNqieimodp=(gx)Nqiei=gki⋅N⋅gxi⋅Nqiei\beta^{\cfrac{N}{q_i^{e_i}}} mod\;p = (g^x)^{\cfrac{N}{q_i^{e_i}}} = g^{ki·N}·g^{x_i · {\cfrac{N}{q_i^{e_i}}}}βqiei​​N​modp=(gx)qiei​​N​=gki⋅N⋅gxi​⋅qiei​​N​
由于gki⋅Nmodp=gki⋅(p−1)modp=1modpg^{ki·N}\;mod\; p = g^{ki·(p-1)}\;mod\; p = 1\;mod\;pgki⋅Nmodp=gki⋅(p−1)modp=1modp,所以:
βNqieimodp=gxi⋅Nqiβei=(gNqiei)ximodp\beta^{\cfrac{N}{q_i^{e_i}}} mod\;p = g^{x_i · {\cfrac{N}{q_i^\beta{e_i}}}} = {(g^{{\cfrac{N}{q_i^{e_i}}}})}^{\;x_i}\;mod \;pβqiei​​N​modp=gxi​⋅qiβ​ei​N​=(gqiei​​N​)xi​modp
令β′=βNqiei,g′=gNqiei\beta' =\beta^{\cfrac{N}{q_i^{e_i}}},g' = g^{{\cfrac{N}{q_i^{e_i}}}}β′=βqiei​​N​,g′=gqiei​​N​,所以到这步,就需求解问题β′=(g′)ximodp\beta' = (g')^{x_i}\;mod\;pβ′=(g′)xi​modp,即:xi=logg′β′x_i = {log}_{g'}^{\beta'}xi​=logg′β′​,就用小步大步法或是穷举法求出

(二)、实现思路

输入:已知大素数P的元根为g ,β\betaβ 是一个小于P的数,g模P的阶是N=p-1, 以及N的素数分解N=Πi=1tqieiN = \Pi_{i=1}^tq_i^{e_i}N=Πi=1t​qiei​​(t为N分解得到的素数的个数,相同的素数只记为一个)
输出:整数x∈ZNx\in Z_Nx∈ZN​ ,且gx=βmodPg^x= \beta \;mod\;Pgx=βmodP
1、对于每一个i∈1,...,ti \in {1,...,t}i∈1,...,t
(1)计算gi=gNqieig_i = g^{\cfrac{N}{q_i^{e_i}}}gi​=gqiei​​N​,易知g_i的阶是qieiq_i^{e_i}qiei​​(详见下图定理10.5)
(2)计算hi=βNqieih_i = \beta^{\cfrac{N}{q_i^{e_i}}}hi​=βqiei​​N​,hi∈<gi>h_i\in<g_i>hi​∈<gi​>
(3)使用穷举法或者大步小步法得到xix_ixi​,使得gixi=hi{g_i}^{x_i}= h_igi​xi​=hi​
2.利用中国剩余定理求解x,其中x=ximodqieix=x_i \;mod\;q_i^{e_i}x=xi​modqiei​​

(三)、代码实现

from hashlib import new
import math
import gmpy2def little_big_step_method(g,beta,N,p):# 求解x = (log_g)betam = int(math.sqrt(N))+1gj_j_dict= {}# 建立(g^j,j)表,与上述原理(j,g^j表内容相反)for j in range(0,m):gj_j_dict[pow(g,j,p)] = j gj_sorted_list = sorted(gj_j_dict)gamma = betafor i in range(0,m):if gamma in gj_sorted_list:return i*m + gj_j_dict[gamma]gamma = (gamma * gmpy2.invert(pow(g,m,p),p) )%p
def solve_g_i(g,q_i,N):g_i = []for q in q_i:g_i.append(pow(g,(N//q),N+1))return g_i
def solve_h_i(beta,q_i,N):h_i = []for q in q_i:h_i.append(pow(beta,(N//q),N+1))return h_i
if __name__ == '__main__':beta = 14632691854639937953996750549254161821338360p=26622572818608571599593915643850055101138771g=65539N = p-1L = [[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]]q_i = []for i in range(len(L)):q_i.append(L[i][0])g_i = [pow(g,N//q_i[i],p) for i in range(len(q_i))]h_i = [pow(beta,N//q_i[i],p) for i in range(len(q_i))]x_i = []# searchAll method# for i in range(len(q_i)):#     for j in range(q_i[i]):#         if pow(g_i[i],j,p) == h_i[i]:#             x_i.append(j)#             breakfor i in range(len(q_i)):x_i.append(little_big_step_method(g_i[i],h_i[i],q_i[i],p))
x = 0
for i in range(len(x_i)):Mi = N // q_i[i]Mii = gmpy2.invert(Mi, q_i[i])x = (x + x_i[i] * Mi * Mii) % Nprint("私钥x为:%d"%pow(g,x,p))

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

  1. [JAVA加解密]RSA算法、ElGamal算法

    一.RSA算法: 1.简介:RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的. ...

  2. 组合算法/全排列算法/求子集算法

    本文介绍组合算法,组合算法有很多,这里只介绍其中一种的两种形式. 全排列:全排列算法 组合:本文 子集算法:求子集算法 组合 leetcode实战:组合 给定两个整数 n 和 k,返回范围 [1, n ...

  3. 全排列算法(无重复数字全排列/有重复数字全排列)/ 组合算法/ 求子集算法

    写在前面 全排列 1 无重复数字全排列 1.1 紫书版本 1.2 回溯法 2 有重复数字全排列 复盘易错点(可跳过) 写在前面 很久很久以前就想写的一篇博客,因为懒一直没开工,但是学习全排列算法算是我 ...

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

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

  5. 分治算法求解列表中第k小的数

    分治算法地思想就是将复杂问题分解为简单的子问题,然后寻求子问题的地归结,并组合各个子问题的解一起得到最终复杂问题的解. 针对求解列表中第k小的数,暴力拆解法可以将列表排序然后根据索引求出列表中第k小的 ...

  6. ElGamal 算法思考

    前驱知识: 离散对数问题 离散对数 百度百科介绍: 在整数中,离散对数(英语:Discrete logarithm)是一种基于同余运算和原根的一种对数运算.而在实数中对数的定义 logba是指对于给定 ...

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

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

  8. elgamal算法加解密C语言,详解ElGamal加密算法

    ElGamal公钥密码体制是1984年斯坦福大学的Tather ElGamal提出的一种基于离散对数问题困难性的公钥体制.1985年,Tather ElGamal利用ElGamal公钥密码体制设计出E ...

  9. ElGamal算法加解密

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

最新文章

  1. 不仅仅是商务旗舰,金立M2017的拍照实力同样给力
  2. 《C++游戏开发》十八 角色在障碍物中智能行走的实现
  3. mysql function函数_详解MySQL如何按表创建千万级的压测数据
  4. 并发–顺序线程和原始线程
  5. [转载] C++灵魂所在之---多态的前世与今生
  6. 人工智能为什么这么火?
  7. MySQL的环境变量配置
  8. python日志模块----logging
  9. 海信计算机怎么开机,将海信电视连接到计算机的步骤_计算机的基本知识_IT /计算机_信息...
  10. 技术沙龙|赋能企业数字化转型,移动云云原生应用架构实践
  11. codeforces629C Famil Door and Brackets (dp)
  12. 矩阵论作业1,2,3讲
  13. Unity制作卡牌游戏
  14. Redis6:第六章:(2)Redis6 新数据类型:HyperLogLog
  15. Excel表格多个工作表数据汇总求和
  16. 怎样设置CAD图纸批量打印?
  17. 大学本科计算机考试小抄,大学考试允许带小抄 一页开卷学生抄到手酸
  18. torch.manual_seed()及其作用
  19. 5-1 Coursera吴恩达《序列模型》 第一周课程笔记-循环序列网络(RNN)
  20. 小雪特辑 | 天空划落雨加雪,冬天像是一首优雅的古典音乐

热门文章

  1. 过完双11,我去闲鱼当二道贩子
  2. 【Python】如何生成柯西分布随机数
  3. c语言让数码管显示时间,请问51单片机肿么编写程序让8个数码管显示时间(时分秒)...
  4. 机器学习——DEAP数据集
  5. 2020蚂蚁集团招股说明书.pdf
  6. 你是天蝎座(10.24-11.22)的吗?
  7. IOS基于新浪微博开放平台微博APP
  8. RabbitMQ安装过程(Win10)
  9. 【OpenCV入门教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放
  10. USR-TCP232-E2串口转以太网模块的使用方法