引言

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

    1,在python的图像学习中,有时我们需要在同一个窗口中,显示多个图像,方便我们查看输出图像的区别. 2,在pycharm中,导入matplotlibmokuai,据说此模块来自matlab,因为没 ...

  2. 使用 kind 快速搭建 kubernetes 环境

    使用 kind 快速搭建 Kubernetes 环境 Intro kind(Kubernetes IN Docker) 是一个基于 docker 构建 Kubernetes 集群的工具,非常适合用来在 ...

  3. python call java jar

    python脚本如何调用Java的jar文件呢? HelloWorld.java public class HelloWorld { public static void main(String[] ...

  4. shell字符串索引

    shell中的字符串索引一会从0开始,一会从1开始,见例子: #!/bin/bash string="hello world" length=${#string} echo &qu ...

  5. python安装pycrypto库

    使用pycharm时安装pycrypto库,一直安装不上,提示安装成功,退出去一看,依旧没有 最后选择了pip安装,但一直报错(Microsoft Visual C++ 9.0 is required ...

  6. 网络流 A - PIGS POJ - 1149 最大流

    A - PIGS POJ - 1149 这个题目我开始感觉很难,然后去看了一份题解,写的很好 https://wenku.baidu.com/view/0ad00abec77da26925c5b01c ...

  7. java基础篇 之 final关键字

    ​ final,字面上是最终的意思,通常来说,我们用它来作为修饰符的时候,都是代表"这是无法改变的"的意思.不想改变可能出与两种理由:设计或效率.由于这两个原因相差甚远,所以我们在 ...

  8. 【FreeRTOS实战汇总】小白博主的RTOS学习实战快速进阶之路(持续更新)

    博主是个小白,打算把这段时间系统学习RTOS的文章统一整理到这里,另外本文会给出一些参考性资料和指导性建议: 本文宗旨 FreeRTOS 是由Richard Barry在2003年由设计的,由于其设计 ...

  9. 3-JVM垃圾回收算法和垃圾收集器

    垃圾回收算法和垃圾收集器 1.什么是垃圾回收 对于内存当中无用的对象进行回收,如何去判断一个对象是不是无用的对象. 引用计数法: 每个对象中都会存储一个引用计数,每增加一个引用就+1,消失一个引用就- ...

  10. Mysql 常用函数(12)- left 函数

    Mysql常用函数的汇总,可看下面系列文章 https://www.cnblogs.com/poloyy/category/1765164.html left 的作用 返回字符串 str 中最左边的 ...