Discrete Log Algorithms :Baby-step giant-step
离散对数的求解
1.暴力
2.Baby-step giant-step
3.Pollard’s ρ algorithm
……
下面搬运一下Baby-step giant-step 的做法


这是在 https://ctf-wiki.github.io/ctf-wiki/crypto/asymmetric/discrete-log/discrete-log/上看到的,比较容易理解。
而且,里面的代码写得简洁明了。
写一下自己理解和自己照着写了一遍
原文代码:
def bsgs(g, y, p):
m = int(ceil(sqrt(p - 1)))
S = {pow(g, j, p): j for j in range(m)} #在字典S中存放了g^j和对应的j
gs = pow(g, p - 1 - m, p) #求解的是baby step中的值,也就是g^(-m),其实就是g^m mod p的逆元,也就可以使用egcd来求解
for i in range(m):
if y in S:
return i * m + S[y] #S[y]取出的是此时y对应的i
y = y * gs % p #如果baby step的值和 giant step的值不相等,继续执行baby step
return None
照着写一遍的代码
#求解离散对数问题 import math
def egcd(a,b):
r0,r1,s0,s1=1,0,0,1
n=b
while(b):
q,a,b=a//b,b,a%b
r0,r1=r1,r0-q*r1
s0,s1=s1,s0-q*s1
return r0%n #拓展欧几里得返回的三个值是,a是a和b的最大公因数,r0和s0分别是ax+by=c中的一组解x和y,【此时只是选择返回一个r0,因为得到的是ax+by=gcd(a,b)中的x即可,有的时候x或者y可能为负数,在求解正数的逆元的时候负数要对n再次求模运算 #求解离散对数就是,X=G^a mod P,其中给出X,G,P的值,要求解的是 a的值,此处采用的是Baby step giant step的方法 def bsgs(x,g,p): #求解x=g^a mod p中的a,其中g是生成元
m=math.ceil(math.sqrt(p-1)) #m的值是 p-1开平方后向上取整
bstep={pow(g,j,p):j for j in range(m)} #每一次 j 的增加表示 “baby-step”,一次乘上g,字典S中存了所有的g^j(j<m)以及其对应的j
gstep=egcd(pow(g,m),p) #算出了gstep的值,也就是g^-m的值
for i in range(m):
if x in bstep:
return i*m+bstep[x]
x=x*gstep%p print(bsgs(37,3,101))
继续学习其他的做法
参考资料:http://zoo.cs.yale.edu/classes/cs257/ppt/all/Mac/19_DiscreteLog.ppt
Discrete Log Algorithms :Baby-step giant-step的更多相关文章
- Discrete Log Algorithms :Baby-step giant-step 【二】
import gmpy2 def discreteLog(g,p,a): #离散对数,求 g^x=a mod p中的x table={} sq=gmpy2.isqrt(p-1) m=gmpy2.add ...
- POJ 2417 Discrete Logging ( Baby step giant step )
Discrete Logging Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 3696 Accepted: 1727 ...
- 解高次同余方程 (A^x=B(mod C),0<=x<C)Baby Step Giant Step算法
先给出我所参考的两个链接: http://hi.baidu.com/aekdycoin/item/236937318413c680c2cf29d4 (AC神,数论帝 扩展Baby Step Gian ...
- [置顶] hdu2815 扩展Baby step,Giant step入门
题意:求满足a^x=b(mod n)的最小的整数x. 分析:很多地方写到n是素数的时候可以用Baby step,Giant step, 其实研究过Baby step,Giant step算法以后,你会 ...
- HDU 2815 Mod Tree 离散对数 扩张Baby Step Giant Step算法
联系:http://acm.hdu.edu.cn/showproblem.php?pid=2815 意甲冠军: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQ ...
- POJ 3243 Clever Y (求解高次同余方程A^x=B(mod C) Baby Step Giant Step算法)
不理解Baby Step Giant Step算法,请戳: http://www.cnblogs.com/chenxiwenruo/p/3554885.html #include <iostre ...
- 数论之高次同余方程(Baby Step Giant Step + 拓展BSGS)
什么叫高次同余方程?说白了就是解决这样一个问题: A^x=B(mod C),求最小的x值. baby step giant step算法 题目条件:C是素数(事实上,A与C互质就可以.为什么?在BSG ...
- 【POJ2417】baby step giant step
最近在学习数论,然而发现之前学的baby step giant step又忘了,于是去翻了翻以前的代码,又复习了一下. 觉得总是忘记是因为没有彻底理解啊. 注意baby step giant step ...
- 『高次同余方程 Baby Step Giant Step算法』
高次同余方程 一般来说,高次同余方程分\(a^x \equiv b(mod\ p)\)和\(x^a \equiv b(mod\ p)\)两种,其中后者的难度较大,本片博客仅将介绍第一类方程的解决方法. ...
随机推荐
- org.springframework.beans.factory.BeanCreationException,Invocation of init method failed,Context initialization failed
G:\javaanzhuang\apache-tomcat-\bin\catalina.bat run [-- ::,] Artifact ssm_qingmu02_web:war exploded: ...
- java使用wait(),notify(),notifyAll()实现等待/通知机制
public class WaitNotify { static boolean flag=true; static Object lock=new Object(); static class Wa ...
- Golang操作结构体、Map转化为JSON
结构体生成Json package main import ( "encoding/json" "fmt" ) type IT struct { Company ...
- oracle 12cR2 smart flash cache实测
最近一直在处理新系统的性能优化问题,这两天特地测试了下oracle 11gR2开始引入的smart flash cache. 其介绍参考MOS文档,How To Size the Database S ...
- 20165211 2017-2018-2 《Java程序设计》课程总结
20165211 2017-2018-2 <Java程序设计>课程总结 一.每周作业及实验报告博客链接汇总 预备作业1:我期望的师生关系 预备作业2:学习基础和C语言调查 预备作业3:Li ...
- fastjson常用方法
fastjson是一款alibaba公司开发的json工具包.json经常被使用在数据传输方面,因此特意对它的一些常用方法做备注,欢迎看客在评论区补充或指出问题. 首先定义一个实体类,用于我们进行对象 ...
- centos在图形界面和命令行之间切换的快捷键是什么?
答: ctrl+alt+F1 或者ctrl+alt+F2 1.当前处于图形界面时,按ctrl+alt+F2可进入命令行模式 2. 当前处于命令行模式,按ctrl+alt+F1可进入图形界面
- 【Dalston】【第二章】客户端负载均衡(Ribbon)
对于大型应用系统负载均衡(LB:Load Balancing)是首要被解决一个问题.在微服务之前LB方案主要是集中式负载均衡方案,在服务消费者和服务提供者之间又一个独立的LB,LB通常是专门的硬件,如 ...
- python 之 运算符
Python 运算符 Python 运算符 什么是运算符? 本章节主要说明Python的运算符.举个简单的例子 4 +5 = 9 . 例子中,4和5被称为操作数,"+"号为运算 ...
- 数据集是 seq 文件的处理办法
数据集是 seq 文件的处理办法 2017-03-17 最近下了一个数据集,是 seq 格式的,第一次处理这种数据.使用了官方提供的 matlab 工具包:https://pdollar.github ...