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