zoukankan      html  css  js  c++  java
  • 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知识学习
  • 相关阅读:
    telerik:RadGrid 在表格中编辑更新数据
    给已存在的表添加一个新字段
    Microsoft.Office.Interop.Excel 导出Excel
    反射导出 Excel
    aspx页面中获取当前浏览器url
    图片切换效果
    .net错误处理机制(转)
    javascript:void(0)知多少
    30款jQuery常用网页焦点图banner图片切换 下载 (转)
    Html.RenderPartial与Html.RenderAction区别(转)
  • 原文地址:https://www.cnblogs.com/Konmu/p/12507303.html
Copyright © 2011-2022 走看看