Wilson's theorem在RSA题中运用
引言
- 最近一段时间在再练习数论相关的密码学题目,自己之前对于数论掌握不是很熟练,借此机会先对数论基本的四大定理进行练习
- 这次的练习时基于
Wilson's theorem(威尔逊定理)在RSA题目中的练习 - 最近几次比赛中这个定理出现频率挺高的,正好之前
Rocarctf中有一道题考到了这个定理这次就用于练习
Wilson's theorem简介
- P 为质数 <==>(P−1)!≡ −1(mod P)
- 推论 & 变形式:
(p-1)! + (p-2) != p * (p-2)!
(p-1)! = p * (p-1)
(p-2)! % p = 1
- 这个定理作用就是在于可以将阶乘的复杂问题转换成为连乘的简单问题
实例练习
题目代码
import sympy
import random
def myGetPrime():
A= getPrime(513)
print(A)
B=A-random.randint(1e3,1e5)
print(B)
return sympy.nextPrime((B!)%A)
p=myGetPrime()
#A1=xxx
#B1=xxx
q=myGetPrime()
#A2=xxx
#B2=xxx
r=myGetPrime()
n=p*q*r
#n=xxx
c=pow(flag,e,n)
#e=0x1001
#c=xxx
#so,what is the flag?
具体代码可以在buuctf平台找到
思路分析
对于素数
p,q的获取是用B!%A后在获取其下一个素数实现,而问题的难处也在于大数B在阶乘后运算的复杂度,所以这里就要采用威尔逊定理将阶乘问题转换成连乘问题,即对于例如q!%p=>(q+1)*…….*(p-2)%p推导过程大致如下:
由上述代码可以得出以下式子:
1、myGetPrime()函数的返回结果记为\(d_1\)
2、R=randint(le3,le5)\(10^3\) ~ \(10^5\)的任意整数
3、\(B=A-R\)
4、\(d_1≡B!%A\)\((A-2)! = (A-2)(A-1)……(A-R+1)(A-R)!\)阶乘展开
由上述第三个变型式可得\((A-2)!%A ≡ 1⇒(A-2)(A-1)……(A-R+1)(A-R)!%A≡1\)
⇒\((A-2)(A-1)……(A-R+1)B!%A≡1\)
=>\(B!\)和\((A-2)*…*(B+1)\)是乘法逆元的关系,故而可以通过连乘模\(A\)求出\(B!\)而,此题中对于\(p\)的结果是next_prime(d1),所以最终p=invert(d1,A1)
最终exp
#!/usr/bin/python
# -*- coding:utf-8 -*-
# Author : Konmu
import gmpy2
from Crypto.Util.number import *
n=xxx
e=xxx
c=xxx
A1=xxx
B1=xxx
A2=xxx
B2=xxx
def Wilson(A,B):
mod = 1
for i in range(B+1,A-1):
mod *= i
mod %= A
return mod #这个就是B!
d1=int(gmpy2.invert(Wilson(A1,B1),A1))
d2=int(gmpy2.invert(Wilson(A2,B2),A2))
q=gmpy2.next_prime(d1)
p=gmpy2.next_prime(d2)
r=n/p/q
phi=(r-1)*(p-1)*(q-1) #三个素数求欧拉函数处理
d=gmpy2.invert(e,phi)
m=pow(c,d,n)
print(long_to_bytes(m))
总结
- 最近主要是对于基本的数论的四个定理的学习,还有就是python 每日一个小项目练习和flask框架学习,基本web知识学习
Wilson's theorem在RSA题中运用的更多相关文章
- 在洛谷3369 Treap模板题 中发现的Splay详解
本题的Splay写法(无指针Splay超详细) 前言 首先来讲...终于调出来了55555...调了整整3天..... 看到大部分大佬都是用指针来实现的Splay.小的只是按照Splay的核心思想和原 ...
- Wilson's Theorem
ProofsSuppose first that $p$ is composite. Then $p$ has a factor $d > 1$ that is less than or equ ...
- 【经验】 Java BigInteger类以及其在算法题中的应用
[经验] Java BigInteger类以及其在算法题中的应用 标签(空格分隔): 经验 本来在刷九度的数学类型题,有进制转换和大数运算,故而用到了java BigInteger类,使用了之后才发现 ...
- Java在算法题中的输入问题
Java在算法题中的输入问题 在写算法题的时候,经常因为数据的输入问题而导致卡壳,其中最常见的就是数据输入无法结束. 1.给定范围,确定输入几个数据 直接使用普通的Scanner输入数据范围,然后使用 ...
- 数据流图——从软考真题中学画数据流图DFD
文章目录 题目 画顶层图 画0层图 解题技巧 题目 建议将题目复制到word后与此文分屏查看.后面需要多次查看题目. 某高校欲开发一个成绩管理系统,记录并管理所有选修课程的学生的平时成绩和考试成绩, ...
- 你竟然在公钥中下毒!——如何在RSA公钥中添加后门
原文:http://www.hackdig.com/?01/hack-17893.htm 分享到: 当我知道它是如何运行时,我惊得下巴都掉了.这是一个非常简单的手法,但这篇文章会颠覆你之前对RSA的看 ...
- 运维派 企业面试题3 为上题中的 "十个随机字母_test.html" 文件 更名
Linux运维必会的实战编程笔试题(19题) 企业面试题3 #将试题2中创建的文件名uopiyhgawe_test.html# test-->修改为omg,html-->HTML 方法一: ...
- python在算法题中判断输入结束(EOF)
有些算法题是这样要求的,一行输入一行数据,然后没有规定我要输入多少行,你要自行判断文件结束EOF,否则是会runtime error的,因为oj内部都是用文件来进行读写的. 例如a+b,每一行输入a ...
- 2017蓝桥杯省赛C/C++B(补题中)
标题:等差素数列 2,3,5,7,11,13,....是素数序列. 类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列. 上边的数列公差为30,长度为6. 200 ...
随机推荐
- 在Windows中快速配置vim
vim原本是在Linux中的编辑器,如果使用熟练写代码速度可以远高于其它编辑器 当然很多OI比赛也会要求在Linux中进行 然而: 想学Linux,首先要有一个Linux,但有了Linux,这个直播间 ...
- 一只简单的网络爬虫(基于linux C/C++)————配置文件设计及读取
一般来说linux下比较大型的程序都是以配置文件作为参数介质传递的,该爬虫也采用配置文件的方式来获取参数,配置文件格式大致如下: max_job_num=1 #seeds=https://www.ba ...
- VMware的安装与部署Linux系统
首先我们需要准备好我们将会用到的东西:VMware12.RHEL7.0 网址我就不放了,大家自行百度哟. 一.安装VMware 我们需要安装VMware ...
- 【摘抄】深入解析Windows操作系统
一.线程是一个进程内部的实体,也是Windows执行此进程时的调度实体.若没有线程,进程的程序将不可能运行.线程包含以下部件: 1.一组代表处理器状态的CPU寄存器中的内容. 2.两个栈:一个用于线程 ...
- Java——Java中编码问题
在开发过程中经常会遇到一会乱码问题,不是什么大问题,但是也挺烦人的,今天来将我们开发总结的经验记录下来,希望可以给大家一些帮助. 一些概念: 字符:人们使用的记号,抽象意义上的一个符号.比如:‘1’, ...
- spring学习笔记(二)spring中的事件及多线程
我们知道,在实际开发中为了解耦,或者提高用户体验,都会采用到异步的方式.这里举个简单的例子,在用户注册的sh时候,一般我们都会要求手机验证码验证,邮箱验证,而这都依赖于第三方.这种情况下,我们一般会通 ...
- Day_12【集合】扩展案例4_判断字符串每一个字符出现的次数
分析以下需求,并用代码实现 1.利用键盘录入,输入一个字符串 2.统计该字符串中各个字符的数量(提示:字符不用排序) 3.如: 用户输入字符串 "If~you-want~to~change- ...
- 如何使用apt-get在ubuntu系统上安装OpenJDK 8
文章目录 添加ppa仓库 设置openjdk版本 查看java 版本 Android 8.1 系统编译的时候需要安装OpenJDK 8,这里如果可以自己下载源码编译安装,当然本想编译Android系统 ...
- 蓝桥杯备战(一)3n+1问题
[问题描述] 考虑如下的序列生成算法:从整数 n 开始,如果 n 是偶数,把它除以 2:如果 n 是奇数,把它乘 3 加1.用新得到的值重复上述步骤,直到 n = 1 时停止.例如,n = 22 时该 ...
- 设计模式之GOF23访问者模式
访问者模式Visitor 模式动机:对于存储在一个集合中的对象,他们可能具有不同的类型(即使有一个公共的接口),对于该集合中的对象,可以接受一类称为访问者的对象来访问,不同访问者的访问方式也不同 定义 ...