[rsa]p+1光滑,已知高位攻击P

from random import randint
from gmpy2 import *
from Crypto.Util.number import *


m = bytes_to_long(b'flag{********************************}')

def getprime(bits):
    while 1:
        n = 1
        while n.bit_length() < bits:
            n *= next_prime(randint(1,1000))
        if isPrime(n - 1):
            return n - 1

p = getprime(512)
q = getprime(512)
n = p*q
e = 65537
d = invert(e,(p-1)*(q-1))
c = pow(m,e,n)

res = []
mod = []
[mod.append(getprime(128)) for i in range(12)]
[res.append(c%mod[i]) for i in range(12)]
print(n,(p>>128)<<128),mod,res)

'''
output:
3216831712236484919804716473942409526434016529181790011140718891645020999952523287950679312500771653918738887189899203815116997399422419456666136527466294225647700744715569996552708989626431982330367733125015062070399091789218760399060531383324158096784030850407432126491091299460659042468401054516052600467997
36691536769373164488130311421517753226870999465362409179446664596323017708216823951466573340643687346264018616414288774195411449434676147898363218552160256
[127358722814661886628344839530462144916373, 1569005233424413714924223862235964763229, 15953826944429720811716497916877126603181, 22667750449179799152236917772041505492557, 7259500259309895932387328648172298540473, 1216723397014858024629084355784570444737, 5803969258694833349275399163572927306963, 2847514965593473340352693322675908465517, 55965603506094486681210827499140188004581, 3758825246939161175629619499256754206153, 9865309015695677187200661453839724337633, 1985189335531812324455545509044214546841)]
[17514122934988110165886587218707943859589, 828023569353871016099054873610645592579, 3834965867062595899595546144451189629655, 5083410101797762407471893731877939884166, 6199590917760184276466050254032811548454, 208337506454727094683323122852921121527, 5210709327454808237359999225611588134922, 239093795148407379152016295908193630983, 29793049900271876372064873251244672365333, 1641943491807405218384351799880631607416, 1685895805013787734204509484411577153108, 1511298522529374764380482522275435302730)]
'''

solve1

n=3216831712236484919804716473942409526434016529181790011140718891645020999952523287950679312500771653918738887189899203815116997399422419456666136527466294225647700744715569996552708989626431982330367733125015062070399091789218760399060531383324158096784030850407432126491091299460659042468401054516052600467997
p4=36691536769373164488130311421517753226870999465362409179446664596323017708216823951466573340643687346264018616414288774195411449434676147898363218552160256#已知P的高位

pbits=p4.nbits()          #P原本的位数
kbits=128
print(pbits,n.nbits())

PR.<x> = PolynomialRing(Zmod(n))
f = x + p4
roots = f.small_roots(X=2^kbits,beta=0.4)
# 经过以上一些函数处理后,n和p已经被转化为10进制
print(roots)
if roots:
    p= p4 + int(roots[0])
    q=n//p
    assert p*q==n

mod = [127358722814661886628344839530462144916373, 1569005233424413714924223862235964763229, 15953826944429720811716497916877126603181, 22667750449179799152236917772041505492557, 7259500259309895932387328648172298540473, 1216723397014858024629084355784570444737, 5803969258694833349275399163572927306963, 2847514965593473340352693322675908465517, 55965603506094486681210827499140188004581, 3758825246939161175629619499256754206153, 9865309015695677187200661453839724337633, 1985189335531812324455545509044214546841]
res = [17514122934988110165886587218707943859589, 828023569353871016099054873610645592579, 3834965867062595899595546144451189629655, 5083410101797762407471893731877939884166, 6199590917760184276466050254032811548454, 208337506454727094683323122852921121527, 5210709327454808237359999225611588134922, 239093795148407379152016295908193630983, 29793049900271876372064873251244672365333, 1641943491807405218384351799880631607416, 1685895805013787734204509484411577153108, 1511298522529374764380482522275435302730]

e=65537
c=crt(res, mod)
d=inverse_mod(e,(p-1)*(q-1))
m=pow(c,d,n)
bytes.fromhex(hex(m)[2:])
#b'flag{5bb5e0a9d48f44a3770253875f263810}'

solve2

 python -m primefac -vs -m=p+1 3216831712236484919804716473942409526434016529181790011140718891645020999952523287950679312500771653918738887189899203815116997399422419456666136527466294225647700744715569996552708989626431982330367733125015062070399091789218760399060531383324158096784030850407432126491091299460659042468401054516052600467997

Z310  =  P155 x P155  =  36691536769373164488130311421517753226870999465362409179446664596323017708216823951466573340643687346264018616414289061014410434943387973225734363385787789 x 87672307989062215446143529710752157306955526821841719247488664102327017984537994201433268176885668357106056974714015205850633744163704470170502301010174673

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值