引言

  • 最近一段时间在再练习数论相关的密码学题目,自己之前对于数论掌握不是很熟练,借此机会先对数论基本的四大定理进行练习
  • 这次的练习时基于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题中运用的更多相关文章

  1. 在洛谷3369 Treap模板题 中发现的Splay详解

    本题的Splay写法(无指针Splay超详细) 前言 首先来讲...终于调出来了55555...调了整整3天..... 看到大部分大佬都是用指针来实现的Splay.小的只是按照Splay的核心思想和原 ...

  2. Wilson's Theorem

    ProofsSuppose first that $p$ is composite. Then $p$ has a factor $d > 1$ that is less than or equ ...

  3. 【经验】 Java BigInteger类以及其在算法题中的应用

    [经验] Java BigInteger类以及其在算法题中的应用 标签(空格分隔): 经验 本来在刷九度的数学类型题,有进制转换和大数运算,故而用到了java BigInteger类,使用了之后才发现 ...

  4. Java在算法题中的输入问题

    Java在算法题中的输入问题 在写算法题的时候,经常因为数据的输入问题而导致卡壳,其中最常见的就是数据输入无法结束. 1.给定范围,确定输入几个数据 直接使用普通的Scanner输入数据范围,然后使用 ...

  5. 数据流图——从软考真题中学画数据流图DFD

    文章目录 题目 画顶层图 画0层图 解题技巧 题目 建议将题目复制到word后与此文分屏查看.后面需要多次查看题目. 某高校欲开发一个成绩管理系统,记录并管理所有选修课程的学生的平时成绩和考试成绩, ...

  6. 你竟然在公钥中下毒!——如何在RSA公钥中添加后门

    原文:http://www.hackdig.com/?01/hack-17893.htm 分享到: 当我知道它是如何运行时,我惊得下巴都掉了.这是一个非常简单的手法,但这篇文章会颠覆你之前对RSA的看 ...

  7. 运维派 企业面试题3 为上题中的 "十个随机字母_test.html" 文件 更名

    Linux运维必会的实战编程笔试题(19题) 企业面试题3 #将试题2中创建的文件名uopiyhgawe_test.html# test-->修改为omg,html-->HTML 方法一: ...

  8. python在算法题中判断输入结束(EOF)

    有些算法题是这样要求的,一行输入一行数据,然后没有规定我要输入多少行,你要自行判断文件结束EOF,否则是会runtime error的,因为oj内部都是用文件来进行读写的. 例如a+b,每一行输入a ...

  9. 2017蓝桥杯省赛C/C++B(补题中)

    标题:等差素数列 2,3,5,7,11,13,....是素数序列. 类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列. 上边的数列公差为30,长度为6. 200 ...

随机推荐

  1. python(类多态)

    一.多态 (以封装和继承为前提)不同的子类调用相同的方法,产生不同的结果 class Dog(): def __init__(self,name): self.name = name def game ...

  2. System.Linq.Dynamic字符串转委托

    以前一直想着有没有一个方法能够把字符串直接转化成函数的,刚好有需求就找了下,还真有. 微软地址:https://docs.microsoft.com/en-us/previous-versions/b ...

  3. 面试被问了三次的http状态码到底有什么

    面试被问了三次的http状态码到底有什么 想想很多人面试都会有被问到http的状态码的经历,我也是经历了三面,每次都有提及这个问题.今天就来细致的讨论一下HTTP的状态码,如有不足,欢迎留言交流: H ...

  4. 关于使用ffmpeg的一些牢骚

    一.啰嗦几句 好几年不写博客了,一是工作计算机都加密了没法编辑提交:二是各种语言混用,什么都会就是什么都不会,delphi.c#.vb.python.c++要说我精通啥,啥也不精,所以不敢乱写. 最近 ...

  5. mybatis的关系映射

    一.多对一的映射关系 举例:根据员工编号查询员工所在部门的部门信息 第一步,需要在多的一方也就是员工实体类中持有一的一方部门实体类的引用 第二步,在dao接口中声明方法 第三步,在mapper中实现该 ...

  6. A*启发式搜索

    A*启发式搜索 其实是两种搜索方法的合成( A*搜索算法 + 启发式搜索),但要真正理解A*搜索算法,还是得先从启发式搜索算法谈起. 何为启发式搜索 启发式搜索算法有点像广度优先搜索,不同的是,它会优 ...

  7. 3D三栅极晶体管(摘抄)

    英特尔的科学家们在2002年发明了三栅极晶体管——这是根据栅极有三面而取名的. 传统“扁平的”2D平面栅极被超级纤薄的.从硅基体垂直竖起的3D硅鳍状物所代替.电流控制是通过在鳍状物三面的每一面安装一个 ...

  8. 设计者模式之GOF23命令模式

    命令模式Command 将一个请求封装为一个对象,从而使我们可用不同的请求对客户参数化:对请求排队或者记录请求日志,以及支持可撤销的操作.也称之为:动作Action模式,事务transaction模式 ...

  9. Mysql 常用数据库操作

    一.数据库操作: 1.查看数据库: >SHOW DATABASES; 2.创建数据库: >CREATE DATABASE db_name; //db_name为数据库名 3.使用数据库: ...

  10. C:习题1

    C 语言具有哪些主要特点? 1.兼高级语言和汇编语言优点的语言 2.一种结构化程序设计语言 3.语言数据类型丰富 4.具有种类丰富的运算符 5.有预处理功能 C 语言的主要用途是什么? 1.作为一种系 ...