[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.hqwc.cn/news/704385.html

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

相关文章

(实测验证)【移远EC800M-CN 】TCP 透传

引言 本文章使用自研“超小体积TTL转4GGPS集成模块”进行实测验证&#xff1b; 1、配置移远EC800M-CN TCP 透传 串口助手发送&#xff1a; ATQIOPEN1,0,"TCP","36.137.226.30",39755,0,2 //配置服务器地址和端口号&#xff1b; 4G模组返回…

Go微服务: 接入Prometheus性能监控平台与Grafana平台

接入Prometheus 在 go-micro 生成的模板中, 我们一如既往的完成基础工作之后 进入main.go工作的代码编写&#xff0c;main.go package mainimport ("fmt""log""strconv""github.com/go-micro/plugins/v4/registry/consul"opentracing…

MaxKB创建本地知识库

上节已经可以通过MaxKB创建简单的问答系统了&#xff0c;这节开始做自己的知识库&#xff0c;实际上就是把一些本地文件上传到大模型中&#xff0c;让大模型学会这些文件内容&#xff0c;你在问他问题的时候可以通过此文件的内容来回答你&#xff0c;尤其是在针对特定场景或者特…

(实测验证)Gitee代码托管尝试(一)——克隆/下载

一、登录 Gitee&#xff08;码云&#xff09;代码托管平台&#xff1a; Gitee - 基于 Git 的代码托管和研发协作平台 新建个人账户如下&#xff1a; 二、SSH 公钥设置 1、在git安装目录打开“git-cmd.exe”; 2、通过命令 ssh-keygen 生成 SSH Key&#xff1a; ssh-keygen …

指针在函数的应用(C++)

一、传递地址 实参传递进函数体内后&#xff0c;生成的是实参的副本&#xff0c;在函数内改变副本的值并不影响实参。指针传递参数时&#xff0c;指针变量产生了副本&#xff0c;但副本与原变量指向的内存区域是同一个。改变指针副本指向的变量&#xff0c;就是改变原指针变量指…

网络安全 会飞的狗狗 网络安全狗是什么

1.概述 网站安全狗是一款集网站内容安全防护、网站资源保护及网站流量保护功能为一体的服务器工具。功能涵盖了网马/木马扫描、防SQL注入、防盗链、防CC攻击、网站流量实时监控、网站CPU监控、下载线程保护、IP黑白名单管理、网页防篡改功能等模块。能够为用户提供实时的网站安…

做简单易用的GIS资源管理软件

在室外资源管理领域&#xff0c;采用基于GIS的解决方案已成为主流趋势&#xff0c;旨在实现资源的高效利用和管理。GIS技术结合资源对象的规划、定位和监控&#xff0c;为企业提供全面的管理方案&#xff0c;从而优化资源使用、提高运营效率和降低成本。 然而&#xff0c;许多资…

ROS 手眼标定 realsense435i+ur5e

手眼标定的原理 基坐标系&#xff08;base_tree&#xff09;和相机&#xff08;camera_tree&#xff09;两个坐标系属于不同的tree&#xff0c;通过将标签贴到手上&#xff0c;相机识别出标签的position和orention&#xff0c;并通过easy_handeye标定包得到tool0(机械手)&…

Java—字节码文件解读

原文 public class ClassIntrucation {public static void main(String[] args) {int i 10;int j i;j;j;} } 查看字节码文件命令 javap -c 字节码文件例如&#xff1a; javap -c ClassIntrucation 结果 public class ClassIntrucation {public ClassIntrucation();Code:…

用c++实现快速排序、最大子段和问题

6.2.2 快速排序 【问题】快速排序(quick sort)的分治策略如下&#xff08;图6-5)。 (1)划分&#xff1a;&#xff08;选定一个记录作为轴值&#xff0c;以轴值为基准将整个序列划分为两个子序列&#xff0c;轴值的位置在划分的过程中确定&#xff0c;并且左侧子序列的所有记录…

Linux连接文件那点事

什么是连接文件 将一个文件和另一个文件建立联系&#xff0c;分为硬链接和软连接&#xff08;符号连接&#xff09;。 硬链接 Linux中&#xff0c;所有的文件都有一个inode&#xff0c;这个东西就是文件的ID号&#xff0c;硬链接的方式就是通过这个inode来产生新的文件名来建…

公共命名空间和RHP

概述 RHP的全称是&#xff1a;the little Robot that Helped me Program&#xff0c;帮我编程序的小机器人。 RHP必然存在&#xff0c;C语言的宏、C的模板&#xff0c;都是RHP&#xff1b;更复杂的例子&#xff0c;是lex和yacc&#xff0c;它们是制作程序的程序&#xff0c;也…