引言

  • 最近一段时间在再练习数论相关的密码学题目,自己之前对于数论掌握不是很熟练,借此机会先对数论基本的四大定理进行练习
  • 这次的练习时基于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. 【漏洞预警】SaltStack远程命令执行漏洞 /tmp/salt-minions

    前言:   2020年5月3日,阿里云应急响应中心监测到近日国外某安全团队披露了SaltStack存在认证绕过致命令执行漏洞以及目录遍历漏洞.在多个微信群和QQ群已经有群友反映中招,请马上修复. 以下 ...

  2. 细说 PEP 468: Preserving Keyword Argument Order

    细说 PEP 468: Preserving Keyword Argument Order Python 3.6.0 版本对字典做了优化,新的字典速度更快,占用内存更少,非常神奇.从网上找了资料来看, ...

  3. 不可错过的java面试博客之java集合篇

    1. List List 是有序的 Collection.Java List 一共三个实现类: 分别是 ArrayList.Vector 和 LinkedList ArrayList ArrayLis ...

  4. 基于tp3开发的cms-前台代码执行

        内核 thinkphp PbootCMS-V1.2.1 ├─ apps         应用程序 │  ├─ admin     后台模块 │  ├─ api       api模块 │  ├ ...

  5. Pycharm修改HTML模板

  6. 第三家面试过程,及导出elcel的进一步小结。(8月11号 周五)

    今天收到第三家公司的面试通知,面试地址也在民治附近,面试时间是上午十点.今早又失眠了,感觉到这边这么几天,总是天天失眠,晚上睡不好白天瞌睡睡不着,估计还需要些许时间的适应,早上七点多我整理好面试需要准 ...

  7. C++单例写法

    #define __xx(WaveClassFile::me()) class Xx : public QObject{ Q_OBJECT public: static Xx & me(); ...

  8. 目前校园百晓生APP与CSDN软件的对比

    不忘初心.注入灵魂 设计之初 在做校园百晓生该APP时,初心是为校园的同学提供便捷的查询校园信息的服务,确实目前的软件已经实现了该功能,但是总感觉缺少一些灵魂,感觉大部分人渴望的重点在于信息而不是自己 ...

  9. [hdu5448 Marisa’s Cake]多边形面积,公式化简

    题意:给一个凸多边形,求任选若干点形成的多边形的面积和. 思路: 按一定方向(顺时针或逆时针)对多边形的顶点进行编号,则多边形的面积计算公式为:f1 x f2 + f2 x f3 + ... fn-1 ...

  10. java ->Iterator (迭代)

    Iterator迭代器概述 java中提供了很多个集合,它们在存储元素时,采用的存储方式不同.我们要取出这些集合中的元素,可通过一种通用的获取方式来完成. Collection集合元素的通用获取方式: ...