2023 贵州大数据安全精英赛 --- Crypto childrsa wp

news/2024/12/20 2:09:00/

文章目录

      • 题目
      • 解题过程
      • 解题代码

题目

childrsa.py

from Crypto.Util.number import *flag = b'xxx'
p = getPrime(512)
q = getPrime(512)
n = p * q
P = getPrime(1024)
Q = getPrime(1024)
N = P * Q
e = 65537
gift = (P+Q) >> 400hint = (p & ((1 << 350) - 1)) >> 5
enc_hint = pow(hint,e,N)
c = pow(bytes_to_long(flag),e,n)
f = open(f'out{i+1}.txt','w')
f.write(f'N = {N}\n')
f.write(f'n = {n}\n'
f.write(f'gift = {gift}\n')
f.write(f'enc_hint = {enc_hint}\n')
f.write(f'c = {c}')

out.txt

N = 19913283586978731272870374837854045562790864804312115658302463830117436116219931849180682454814957654994095500743161455669517742683196683945049694888375426558735311269294662060482717191409995553476857418604462748567614908456839975140435522714312533340013676955820372105156740228641356206825881138276471973278761948406726062399175269553184359236859175084438349221553915085882218661560890322526503741457647907788204833926214096369428913779871365689037671018942683561649187089844083798834324075157252488088496084629641115161544547506935703532950490109236586524242732310854674446718076810611730874295399180178401471353663
n = 98394377912970161077976095071716071520245470884522650898371541866651139965831581427336428521179335097560338145643418890363050369233502530295868251106114979969844387393758147627569985743852463470545138002189902685566590889175140517151122304528973863485700142820829052897139853465497289644064298161242772703289
gift = 112012823249741273956420414320152024086394551241563686416444057368708038459572554871491781707278127933195689073127882065060125127295041489653572915729848455155059117821290550157606860744547
enc_hint = 13605762329549698957586626266580933128225639142810971158632386694900212152297364700673906983331081843360581227221052403163762155206266035280442283924005142717129467351643173282810669982201476798388553001056498736307588260706475327062302787323877507524036357644241120006072323797778327893834792299939570334886948188364597473931268889437417695532862093912649528155151390080600081199337965649892379699786628095487656690228838497716512853509768997296826487263776776447496125752546322173589223915740715451543895861668143819159937998988611022766833424669076863898157258297885102980961819003128529680884480390557024888414518
c = 73440769815335471983607426365687905918721184275652299429416892828899873930224614597826204961136670712832234285387297735959592122505613951335959593105045789810808172640134939607018894726831927984520480432707238536268054572649912957275921796939059679116900910403261478040783178268712136617053467195749630152736

解题过程

根据题目代码可知, g i f t = ( P + Q ) > > 400 gift= (P+Q)>>400 gift=(P+Q)>>400,也就是说此时我们知道P+Q的高位。
那么我们可以联立 N = P ∗ Q N=P*Q N=PQ构建一个方程去求解 P 1 P_1 P1,此时解出来的 P 1 P_1 P1高位是和P一样的,只是低400位不一样。

RF = RealField(2048)
X = polygen(RF)
f =X*((gift<<400)-X) - N
P = int(f.roots()[1][0])

然后我们在利用coppersmith定理去恢复P
PS:其实这里左移430再右移430是可以不用写的,这么写是因为我P高位解法的习惯使然,coppersmith本来就是去求差,所以直接讲解出来的 P 1 P_1 P1带入到多项式环中求解即可。

P_high = (P<<430)>>430
PR.<x> = PolynomialRing(Zmod(N))
f1 = x + P_high
x0 =f1.small_roots(X=2^430, beta=0.4)[0]
P1 = P_high+x0

求出P之后,后面就简单了。
先简单RSA解密解出hint,之后由于hint = (p & ((1 << 350) - 1)) >> 5,可知其为p的低350位再右移了5位,也就是说解出来的hint是p的低345位并且损失了低5位
这个时候思路就非常明了哩:
直接爆破低5bit,然后利用已知p的低位泄露coppersmith还原p,最后解密即可得到flag

解题代码

#sage
import gmpy2
from Crypto.Util.number import *gift = 112012823249741273956420414320152024086394551241563686416444057368708038459572554871491781707278127933195689073127882065060125127295041489653572915729848455155059117821290550157606860744547
N = 19913283586978731272870374837854045562790864804312115658302463830117436116219931849180682454814957654994095500743161455669517742683196683945049694888375426558735311269294662060482717191409995553476857418604462748567614908456839975140435522714312533340013676955820372105156740228641356206825881138276471973278761948406726062399175269553184359236859175084438349221553915085882218661560890322526503741457647907788204833926214096369428913779871365689037671018942683561649187089844083798834324075157252488088496084629641115161544547506935703532950490109236586524242732310854674446718076810611730874295399180178401471353663
enc_hint = 13605762329549698957586626266580933128225639142810971158632386694900212152297364700673906983331081843360581227221052403163762155206266035280442283924005142717129467351643173282810669982201476798388553001056498736307588260706475327062302787323877507524036357644241120006072323797778327893834792299939570334886948188364597473931268889437417695532862093912649528155151390080600081199337965649892379699786628095487656690228838497716512853509768997296826487263776776447496125752546322173589223915740715451543895861668143819159937998988611022766833424669076863898157258297885102980961819003128529680884480390557024888414518
n = 98394377912970161077976095071716071520245470884522650898371541866651139965831581427336428521179335097560338145643418890363050369233502530295868251106114979969844387393758147627569985743852463470545138002189902685566590889175140517151122304528973863485700142820829052897139853465497289644064298161242772703289
c = 73440769815335471983607426365687905918721184275652299429416892828899873930224614597826204961136670712832234285387297735959592122505613951335959593105045789810808172640134939607018894726831927984520480432707238536268054572649912957275921796939059679116900910403261478040783178268712136617053467195749630152736
e = 65537
RF = RealField(2048)
X = polygen(RF)
f =X*((gift<<400)-X) - N
P = int(f.roots()[1][0])
P_high = (P<<430)>>430
PR.<x> = PolynomialRing(Zmod(N))
f1 = x + P_high
x0 =f1.small_roots(X=2^430, beta=0.4)[0]
P1 = P_high+x0
print(f"P = {P1}")
Q =N//int(P1)
print(f"Q = {Q}")
phi = (P1-1)*(Q-1)
d = gmpy2.invert(e,gmpy2.mpz(phi))
hint = pow(enc_hint,d,N)
print(f"hint = {hint}")
hint = hint<<5
for i in range(2**5):try:p_low = hint+iPR.<x> = PolynomialRing(Zmod(n))f = x*2^350+p_lowroots = f.monic().small_roots(X=2^162, beta=0.4)if roots:print(roots[0])p =  int(f(roots[0]))breakexcept:pass
print(f"p = {p}")
q = n//p
print(f"q = {q}")
phi = (p-1)*(q-1)
d = gmpy2.invert(e,phi)
m = pow(c,d,n)
flag = long_to_bytes(int(m))
print(flag)

flag:

flag{a39f10207ad27716f2bc5fd54063a340}

【大侠的意义是在天下阴暗处点一盏灯,照亮一小块黑暗,然后就会有人学着,再点亮一盏,如果灯多了,这世界上黑暗的地方就少了。 ----节选自三弦大天使作品《天之下》】


http://www.ppmy.cn/news/59998.html

相关文章

抖音小程序|基于天气API实现天气预报功能

文章目录 一、前言包含了功能UI展示 二、开发前的准备三、开发步骤1.app.js 配置2.pages/index.js 演示二维码源码在百度网盘下载 一、前言 参考老版iPhone自带的天气预报APP。目前只有一个界面UI, 后续会更新出更多功能; 包含了功能 - 实况预报 - 未来48小时 - 未来一周的天…

2022 Hubei Provincial Collegiate Programming Contest B. Potion(easy version)

题目链接 Output For each testcase, if Twilight Sparkle couldn’t make the specific mixture, print a single integer: −1. Otherwise, print the minimum number of operation 1 to do that. Example input 3 3 5 1 1 2 6 1 1 5 7 1 1 output 4 3 -1 题目大意 题目保证…

C++11--线程库的认识

目录 thread 线程的构造方式 相关成员函数 join与detach 线程传参 互斥量mutex mutex Locks 原子性操作库 条件变量 thread 线程的构造方式 它是不支持拷贝构造&#xff0c;赋值的&#xff0c;但是可以支持移动构造&#xff0c;移动赋值。还可以直接创建无参的对象。 …

数据结构学习记录——堆的插入(堆的结构类型定义、最大堆的创建、堆的插入:堆的插入的三种情况、哨兵元素)

目录 堆的结构类型定义 最大堆的创建 堆的插入 堆的插入的三种情况 代码实现 哨兵元素 堆的结构类型定义 #define ElementType int typedef struct HNode* Heap; /* 堆的类型定义 */ struct HNode {ElementType* Data; /* 存储元素的数组 */int Size; /* 堆中…

Golang中context包基础知识详解

什么是context.Context&#xff1f; context.Context是Golang标准库提供的接口&#xff08;context包对此接口有多种实现&#xff09;&#xff0c;该接口提供了四个抽象法&#xff1a; type Context interface {Deadline() (deadline time.Time, ok bool)Done() <-chan st…

mssql修改排序规则

修改排序规则 在 Microsoft SQL Server 中&#xff0c;可以通过以下步骤来修改排序规则&#xff1a; 打开 SQL Server Management Studio&#xff08;SSMS&#xff09;&#xff0c;连接到 SQL Server 数据库实例。在“对象资源管理器”窗格中&#xff0c;右键单击数据库&…

vim编辑器

一、vi的使用 1. vi的三种模式 一般指令模式&#xff08;command mode&#xff09; 编辑模式&#xff08;insert mode&#xff09; 命令行命令模式&#xff08;command-line mode&#xff09; 2. 一般指令模式&#xff1a;光标移动 h或左方向键&#xff1a;光标向左移动一…

从传统Java应用到现代微服务,SpringBoot入门的基础指南

目录 一. 创建SpringBoot项目1.1 使用Spring Initializr快速构建项目1.2 手动创建springboot项目 二. SpringBoot入门案例解析2.1 依赖管理特性2.2 starter场景启动器2.3 引导类自动配置 三. REST风格四. 配置文件4.1 配置文件类型4.2 YAML文件的简介与使用4.3 Value与Configur…