【密码学RSA】2021四川省信息与网络安全赛_cr4ck费马小定理推导求解共有公约数p

1.题目:

import os
from Crypto.Util import number

with open('../secret/flag', 'rb') as f:
    flag = f.read()
    
assert(len(flag) < 200)
p = number.getPrime(1024)
q = number.getPrime(1024)
n = p * q
e = 65537

data = number.bytes_to_long("JDSE")
flag = number.bytes_to_long(os.urandom(255-len(flag)) + flag)

with open('output.txt', 'w') as f:
    print(n, file=f)
    print(pow(flag, e, n), file=f)
    print(pow(data, p, n), file=f)

n=16190071651163806295864019410478994111033069033627784225762863537603051286100205075670533295885064417368900028860200646693729094397336259104108103548185993908365388380839285172911963120514072321190266876940732034732397117137061394460746923843922245782775468266708629538795929791940224005947023797710889884139262655896037569495345277362100989310206818815906815037340109507090191392200724993896961774561625607045531746223966956306007588691156861073213545675831176519130019553724245771994149735589727939984664508149900746138671733567269193055682039733308565608623124419978622690108399287267782094992833491412117540060443
c=15303419998661114679314254717914026405478757825416735351601804954118839229797070479526681279224742375492655311505697019190557550696467480133256967636550925789855469334208787745973414205031434095712965892662629942032090010088494752811463912882633957119964067548777662273186260137022598527046219193475032906299912859488699286089311234866062127452250073707233182744079405190900962311612847001444141191413026226164120884637043140094140783528285331931332316785677352225990586242903100117563104312764791553556755518103356463537538508315396815826486784213208395270070213346386705111244580124327114520898478012805359398827670
c1=1510184595792565064445440906881935995266619097536001461530783965780154369249043641074486895520464486085479962000078556210579654456510298579647913754227118673129421819393900310384823524058038067616709691791898230083313217906194886078501873907639225319148093330535005464365092684845804210054017334558737467574892102337630443813828900547064330664128905647113707379303375108854244133403877761359312330320014228059025076059037200823315174250296513866303939391915733284159144473793081857745772615093108270863280285078431940816859845225827381322898005915615672862823461308519156692000709906390303017977729854164511610194054

2.分析:flag需要先求d,由于d=gmpy2.invert(e,phi),所以需要知道p和q。p通过data来求解

推导过程:

已知c1=pow(data, p, n)
           =data^p%n
所以 data^p=c1+kn
c1=data^p-kn
    =data^p-k*p*q    #两边同时模p
c1%p=data^p%p   #根据费马小定理:a^p ≡a (mod p)
         =data%p
kp=data-c1
n=p*q #都存在公约数p可以用欧几里得算法求解
p=gmpy2.gcd(data-c1,n)

3.脚本:

import os
from Crypto.Util.number import *
import gmpy2
import libnum
n = 16190071651163806295864019410478994111033069033627784225762863537603051286100205075670533295885064417368900028860200646693729094397336259104108103548185993908365388380839285172911963120514072321190266876940732034732397117137061394460746923843922245782775468266708629538795929791940224005947023797710889884139262655896037569495345277362100989310206818815906815037340109507090191392200724993896961774561625607045531746223966956306007588691156861073213545675831176519130019553724245771994149735589727939984664508149900746138671733567269193055682039733308565608623124419978622690108399287267782094992833491412117540060443
c = 15303419998661114679314254717914026405478757825416735351601804954118839229797070479526681279224742375492655311505697019190557550696467480133256967636550925789855469334208787745973414205031434095712965892662629942032090010088494752811463912882633957119964067548777662273186260137022598527046219193475032906299912859488699286089311234866062127452250073707233182744079405190900962311612847001444141191413026226164120884637043140094140783528285331931332316785677352225990586242903100117563104312764791553556755518103356463537538508315396815826486784213208395270070213346386705111244580124327114520898478012805359398827670
c1 = 1510184595792565064445440906881935995266619097536001461530783965780154369249043641074486895520464486085479962000078556210579654456510298579647913754227118673129421819393900310384823524058038067616709691791898230083313217906194886078501873907639225319148093330535005464365092684845804210054017334558737467574892102337630443813828900547064330664128905647113707379303375108854244133403877761359312330320014228059025076059037200823315174250296513866303939391915733284159144473793081857745772615093108270863280285078431940816859845225827381322898005915615672862823461308519156692000709906390303017977729854164511610194054
e = 65537
data = bytes_to_long(b'JDSE') #字符串转换
print(data)
p=gmpy2.gcd(data-c1,n)

q=n//p
n=p*q
phi=(p-1)*(q-1)
d=gmpy2.invert(e,phi)
flag=pow(c,d,n)
print(long_to_bytes(flag))

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值