[ciscn 2022 东北赛区]math

1.题目

import gmpy2
from Crypto.Util.number import *
from flag import flag
assert flag.startswith(b"flag{")
assert flag.endswith(b"}")
message=bytes_to_long(flag)
def keygen(nbit, dbit):if 2*dbit < nbit:while True:a1 = getRandomNBitInteger(dbit)b1 = getRandomNBitInteger(nbit//2-dbit)n1 = a1*b1+1if isPrime(n1):breakwhile True:a2 = getRandomNBitInteger(dbit)b2 = getRandomNBitInteger(nbit//2-dbit)n2=a2*b2+1n3=a1*b2+1if isPrime(n2) and isPrime(n3):breakwhile True:a3=getRandomNBitInteger(dbit)if gmpy2.gcd(a3,a1*b1*a2*b2)==1:v1=(n1-1)*(n2-1) # phi1k=(a3*inverse(a3,v1)-1)//v1  # k * phi1=k * v1 = ed-1v2=k*b1+1if isPrime(v2):return a3,n1*n2,n3*v2
def encrypt(msg, pubkey):return pow(msg, pubkey[0], pubkey[1])nbit = 1024
dbit = 256
e, n1, n2=keygen(nbit, dbit)
print('e =', e)
print('n1 =', n1)
print('n2 =', n2)
c1 = encrypt(message, [e, n1])
c2 = encrypt(message, [e, n2])
print('enc1 =', c1)
print('enc2 =', c2)
# e = 86905291018330218127760596324522274547253465551209634052618098249596388694529
# n1 = 112187114035595515717020336420063560192608507634951355884730277020103272516595827630685773552014888608894587055283796519554267693654102295681730016199369580577243573496236556117934113361938190726830349853086562389955289707685145472794173966128519654167325961312446648312096211985486925702789773780669802574893
# n2 = 95727255683184071257205119413595957528984743590073248708202176413951084648626277198841459757379712896901385049813671642628441940941434989886894512089336243796745883128585743868974053010151180059532129088434348142499209024860189145032192068409977856355513219728891104598071910465809354419035148873624856313067
# enc1 = 71281698683006229705169274763783817580572445422844810406739630520060179171191882439102256990860101502686218994669784245358102850927955191225903171777969259480990566718683951421349181856119965365618782630111357309280954558872160237158905739584091706635219142133906953305905313538806862536551652537126291478865
# enc2 = 7333744583943012697651917897083326988621572932105018877567461023651527927346658805965099102481100945100738540533077677296823678241143375320240933128613487693799458418017975152399878829426141218077564669468040331339428477336144493624090728897185260894290517440392720900787100373142671471448913212103518035775

2.分析

注意各个数据的生成:

n1 = a1*b1 + 1

n2 = a2*b2 + 1

n3 = a1*b2 + 1

N1 = n1*n2

N2 = n3*v2

v1 = phi(n1*n2)=phi(N1)

k*v1 = ed - 1

v2 = k*b1+1

e = a3

bit_length 1024: v1, d,N1,N2

bit_length 512:n1,n2,n3

bit_length256:a1,b1,a2,b2,a3,k

由于N1,N2已经给出,我们仔细观察这两个数怎么使用,

注意到:

N1 =  (a1*b1 + 1)*(a2*b2 + 1)

N2 =  (a1*b2 + 1) * (k*b1 + 1)

所以\frac{N_1}{N_2} \approx \frac{a_2}{k}

可以考虑使用连分数获取k,a2

接下来,注意到:

v1 = a1*b1*a2*b2 \rightarrow v1 \equiv 0 \ mod \ a2

k * v1 = ed - 1 \equiv -1 \ mod \ e \rightarrow v1 \equiv - k^{-1} \ mod \ e

然后有了模数和余数后我们就可以使用CRT求解v1了

但是这一题中观察e(=a3)、a2的生成方式,我们知道e和a3可能是不互素的,所以CRT得到的结果应该是模LCM(e,a2)下的结果,而可能不是模e*a2下的结果,所以我们需要进行一定量的破解

记我们得到的结果是v1',则v1'与v1之间存在以下关系:
v1 = lcm(a3, a2)*t + v1'

v1 = N1 -(n1 + n2) + 1

推出:

v1 \leqslant N1 // lcm(a2,a3) * lcm(a2,a3) + v1'

所以我们从上式右边向下爆破即可

3.解题

1.获取k,a2

from Crypto.Util.number import *
from sympy.ntheory.modular import crtdef continuedFra(x, y):cF = []while y:cF += [x // y]x, y = y, x % yreturn cFdef Simplify(ctnf):numerator = 0denominator = 1for x in ctnf[::-1]:numerator, denominator = denominator, x * denominator + numeratorreturn (numerator, denominator)def getit(c):cf = []for i in range(1, len(c)):cf.append(Simplify(c[:i]))return cfN1 = 112187114035595515717020336420063560192608507634951355884730277020103272516595827630685773552014888608894587055283796519554267693654102295681730016199369580577243573496236556117934113361938190726830349853086562389955289707685145472794173966128519654167325961312446648312096211985486925702789773780669802574893
N2 = 95727255683184071257205119413595957528984743590073248708202176413951084648626277198841459757379712896901385049813671642628441940941434989886894512089336243796745883128585743868974053010151180059532129088434348142499209024860189145032192068409977856355513219728891104598071910465809354419035148873624856313067cf = continuedFra(N1, N2)
#N1 / N2 ~ a2 / k#k,a在cf中,需要进行特定判断(比如bit_length)可以得到

2.对可能的k,a2组合进行爆破(代码需承接上面)

for (k,a2) in getit(cf):if(len(bin(a2)[2:]) == 256):modlist = [e,a2]clist = [-inverse(k,e),0]phi_ = crt(modlist,clist)[0]mod = e*a2 // GCD(e,a2)right = phi_ + N1 // mod * modfor i in range(12):#从右往左爆破一定数量phi = right - i*modtry:d = inverse(e,phi)m = pow(enc1,d,N1)flag = long_to_bytes(m).decode()#decode()过滤多数字符print(flag)except:pass
#flag{b5073f3d774c460ae2b714010cc69435}

4.参考

题解1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/12935.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编辑器目录树的设计,一点也不简单

朋友们好&#xff0c;我是优秀的大鹏 今天花了很长时间思考一个网页文档编辑器&#xff0c;云端目录树要怎么设计 这个看似简单的需求&#xff0c;技术上和产品上的思考却非常复杂 下面以几种编辑器为例&#xff0c;讲一下各种编辑器在技术上和产品的思考 1、以Vscode为代表的本…

【神经网络与深度学习】Transformer原理

transformer ENCODER 输入部分 对拆分后的语句x [batch_size, seq_len]进行以下操作 Embedding 将离散的输入&#xff08;如单词索引或其他类别特征&#xff09;转换为稠密的实数向量&#xff0c;以便可以在神经网络中使用。位置编码 与RNN相比&#xff0c;RNN是一个字一个字…

Django Rest Framework 全局异常处理

在Django Rest Framework&#xff08;DRF&#xff09;中&#xff0c;全局异常处理是一种重要的机制&#xff0c;它可以帮助我们更好地管理API中的异常情况&#xff0c;并返回统一的错误响应。本文将详细介绍两种全局异常处理的方法&#xff1a;使用中间件&#xff08;Middlewar…

机器学习(3)

目录 3-1线性回归 3-2最小二乘解 3-3多元线性回归 3-4广义线性模型 3-5对率回归 3-6对率回归求解 3-7线性判别分析 3-8LDA的多类推广 3-9多分类学习基本思路 3-10类别不平衡 3-1线性回归 线性模型为什么重要&#xff1f; 人类在考虑问题时&#xff0c;通常…

先有JVM还是先有垃圾回收器?很多人弄混淆了

是先有垃圾回收器再有JVM呢&#xff0c;还是先有JVM再有垃圾回收器呢&#xff1f;或者是先有垃圾回收再有JVM呢&#xff1f;历史上还真是垃圾回收更早面世&#xff0c;垃圾回收最早起源于1960年诞生的LISP语言&#xff0c;Java只是支持垃圾回收的其中一种。下面我们就来刨析刨析…

抖店商品详情API接口(产品参数|详情图)

抖店商品详情API接口(产品参数|详情图) 参数仅供参考&#xff1a; {"code": 0,"msg": "调用成功","time": "1715763239","data": {"properties": [{"format": [{"message": [{&q…

C语言简要(一)

总得让她开心吧 helloworld #include <stdio.h>int main() {printf("hello world!\n");return 0; } 程序框架 #include <stdio.h> int main {return 0; }输出 printf("hello world!\n"); "里面的内容叫做“字符串”&#xff0c;prin…

BUUCTF靶场[MISC]wireshark、被嗅探的流量、神秘龙卷风、另一个世界

[misc]wireshark 考点&#xff1a;流量、追踪流 工具&#xff1a;wireshark 先看题目&#xff0c;管理员密码 将下载的文件用wireshark打开&#xff0c;查找flag 点击追踪tcp流&#xff0c;开始挨个查看flag [misc]被嗅探的流量 考点&#xff1a;流量、追踪流 工具&#xf…

武汉星起航:亚马逊构建综合性商业生态,卖家买家共享全球化红利

在当今全球化日益加速的时代&#xff0c;亚马逊不仅以其卓越的电商平台服务全球消费者&#xff0c;更通过一系列前沿服务打造了一个综合性的商业生态系统。在这个生态系统中&#xff0c;卖家能够轻松拓展全球业务&#xff0c;买家则享受到了前所未有的购物体验。亚马逊以其独特…

FreeRTOS【6】线程优先级

1.开发背景 基于上一篇指引&#xff0c;已经了解了线程的阻塞&#xff0c;这个篇章主要介绍线程优先级的影响 2.开发需求 设计实验验证高优先级会抢占低优先级线程 CPU 3.开发环境 window10 MDK STM32F429 FreeRTOS10.3.1 4.实现步骤 1&#xff09;创建测试线程&#xff…

测试之路 - 精准而优雅

引子 这几年业内一直在做精准测试&#xff0c;大都使用工具 diff 代码改动、分析代码覆盖率这些平台集成的能力。 业务测试中&#xff0c;我们在技术设计和代码实现的基础上也做了一些精减和精准的测试实践&#xff0c;通过深入测试有针对的设计 case&#xff0c;发现隐藏问题…

抖音小程序使用Vant

安装 Vant 有针对小程序的版本&#xff0c;通过npm安装&#xff1a; npm i vant/weapp -S --production构建 npm 安装 Vant Weapp 后需要构建 NPM&#xff0c;在菜单的【工具】选项中选择【构建 NPM】&#xff1a; 使用组件 抖音小程序和微信小程序还是有一些差别的&#x…

怎么把3d模型导出cad立面---模大狮模型网

在设计工作中&#xff0c;将3D模型导出到CAD软件并生成立面图是一项常见但关键的任务。这不仅有助于更好地展示设计方案&#xff0c;还能方便后续的工程制图和施工。本文将介绍如何通过3ds Max软件将3D模型导出到CAD软件&#xff0c;并生成高质量的立面图&#xff0c;为您提供实…

现货正泰漏电小型断路器NXB-32LE-C16 30MA1P+N原装正品NXB-40L

品牌&#xff1a;CHNT/正泰 型号&#xff1a;NXBLE 额定电流&#xff1a;25A,16A,20A,40A,32A 漏电保护器类型&#xff1a;2P 产地&#xff1a;中国大陆 电压&#xff1a;1000V及以下 极数&#xff1a;3P,4p,2P,1PN 电源方式&#xff1a;交流电 3C证书编号&#xff1a;…

大模型时代下的先行者:景联文科技引领数据标注新时代

在大模型时代&#xff0c;数据标注不再是简单的分类标注&#xff0c;而是一项融合了技术革新、专业技能、法律合规和精细化管理的综合性任务&#xff0c;对推动AI技术的发展和落地应用具有重要意义。 景联文科技作为AI基础行业的数据供应商&#xff0c;可协助人工智能企业解决整…

easyx快速入门1

1.基本说明 EasyX 是针对 C 的图形库&#xff0c;可以帮助 C/C 初学者快速上手图形和游戏编程。 比如&#xff0c;可以基于 EasyX 图形库很快的用几何图形画一个房子&#xff0c;或者一辆移动的小车&#xff0c;可以编写俄罗斯方块、贪吃蛇、黑白棋等小游戏&#xff0c;可以练…

fl studio试用版文件保存无法打开??一个方法教你免费打开!

前言 当下&#xff0c;各款编曲软件五花八门&#xff0c;而这其中最有声誉的必为FL Studio莫属 这个软件呢国人习惯叫他水果&#xff0c;拥有强大的录音、编曲、混音等功能&#xff0c;所以广受音乐圈欢迎。如今&#xff0c;大部分水果一旦有编曲所需&#xff0c;一般都要使用…

CSS 根据子元素选择父元素,并设置父元素的样式

场景举例&#xff1a;当子元素有增加了一个class时&#xff0c;需要影响其父元素的样式 可以使用":has"伪类来实现选择父元素的效果 <style>.parent:has(.child){background-color: #eee;}p{width:100px;border:1px solid #000;} </style> <body>…

人机协同中的比较、调整与反转

人机协同是指人与机器之间的合作关系&#xff0c;通过共同努力实现特定任务的目标。在人机协同中&#xff0c;存在着比较与调整的过程&#xff0c;这是为了实现更好的合作效果和任务完成质量。 比较是指人与机器在任务执行过程中对彼此的表现进行评估和比较。这可以通过对机器的…

vue+ts+vite+pinia+less+echarts 前端可视化 实战项目

1.初始化前端 输入 npm init vuelatest 命令 然后 选择需要的插件2.构建完成后 在终端切换到vue-project文件夹下 npm install 下载依赖 3.下载 less样式 npm install less less-loader -D 4.下载axios npm install axios 5.下载echarts npm install echarts -S 6.引入中国…