2023 陕西省大学生网络安全技能大赛 --- 高职组 Crypto ezmath

news2024/11/27 2:38:19

文章目录

      • 题目
      • 解题过程

题目

from Crypto.Util.number import *
from secret import y,a,b
flag=b'flag{}'
l = len(flag)
m1, m2 = flag[: l // 2], flag[l // 2:]
 
x = bytes_to_long(m1)
c = bytes_to_long(m2)
 
 
assert (x**2+1)*(y**2+1)-2*(x+y)*(x*y+1)==gift-4*x*y
 
'''
4*b**6-2*a**3+3*a*c = 5530346600323339885232820545798418499625132786869393636420197124606005490080520377416491241780814130580634432917029242402389788321303783584093278303358433856193188224687198306898483386282930376793701825481151610363517100498626293248
b**5+6*c**3+2*a*b*c = 2954615125181706551778975245956905163867066802909029011696374372323491135608656194836008189370779030694961333309906927038863656553775849501064217981385517049591593537202663734020724898058374757
3*a**3-3*a*c-3*b**6 = -5530346600323339885232820545798418499625132786869393636420197035566805062067013375355549877479840082835466426039196029766850808080041755202912921908993556467660683726675045317331817898077228454499973287809035537190311008571468738911
gift=18150211062729351455633481905222609221074385988870569666008228964942099019268333450225373082700058568213818917267125668494844006433076192398714708653476096
'''


解题过程

已知
( x 2 + 1 ) ( y 2 + 1 ) − 2 ( x + y ) ∗ ( x ∗ y + 1 ) = g i f t − 4 x y (x^2+1)(y^2+1)-2(x+y)*(x*y+1)=gift-4xy (x2+1)(y2+1)2(x+y)(xy+1)=gift4xy
⇒ g i f t = ( x 2 + 1 ) ( y 2 + 1 ) − 2 ( x + y ) ∗ ( x ∗ y + 1 ) + 4 x y \Rightarrow gift = (x^2+1)(y^2+1)-2(x+y)*(x*y+1)+4xy gift=(x2+1)(y2+1)2(x+y)(xy+1)+4xy
⇒ g i f t = x 2 y 2 + x 2 + y 2 + 1 − 2 ( x 2 y + x y 2 + x + y ) + 4 x y \Rightarrow gift = x^2y^2+x^2+y^2+1-2(x^2y+xy^2+x+y)+4xy gift=x2y2+x2+y2+12(x2y+xy2+x+y)+4xy
⇒ g i f t = x 2 y 2 + x 2 + y 2 − 2 x 2 y − 2 x y 2 − 2 x − 2 y + 4 x y + 1 \Rightarrow gift = x^2y^2+x^2+y^2-2x^2y-2xy^2-2x-2y+4xy+1 gift=x2y2+x2+y22x2y2xy22x2y+4xy+1
⇒ g i f t = x 2 ( y 2 − 2 y + 1 ) − 2 x ( y 2 − 2 y + 1 ) + ( y 2 − 2 y + 1 ) \Rightarrow gift = x^2(y^2-2y+1)-2x(y^2-2y+1)+(y^2-2y+1) gift=x2(y22y+1)2x(y22y+1)+(y22y+1)
⇒ g i f t = x 2 ( y − 1 ) 2 − 2 x ( y − 1 ) 2 + ( y − 1 ) 2 \Rightarrow gift = x^2(y-1)^2-2x(y-1)^2+(y-1)^2 gift=x2(y1)22x(y1)2+(y1)2
⇒ g i f t = ( x 2 − 2 x + 1 ) ( y − 1 ) 2 \Rightarrow gift = (x^2-2x+1)(y-1)^2 gift=(x22x+1)(y1)2
⇒ g i f t = ( x − 1 ) 2 ( y − 1 ) 2 \Rightarrow gift = (x-1)^2(y-1)^2 gift=(x1)2(y1)2

开根号得到 g i f t = ( x − 1 ) ( y − 1 ) \sqrt{gift} = (x-1)(y-1) gift =(x1)(y1)
对于fac = x*y这类情况,我们可以先分解fac,再求它的所有因子,然后遍历符合条件的因子即可

gift=18150211062729351455633481905222609221074385988870569666008228964942099019268333450225373082700058568213818917267125668494844006433076192398714708653476096
x_y = gmpy2.iroot(gift,2)[0]
fac = factor(x_y)
ff = sum([[i] * t for i, t in fac], [])
l = len(ff)
for i in range(1, 1 << l):
    aim = bin(i)[2:].rjust(l, '0')
    tmp = 1
    for k, j in enumerate(aim):
        if int(j) != 0:
            tmp *= ff[k] * int(j)
    x = tmp+1
    flag1 = long_to_bytes(x)
    if b'flag' in flag1:
        print(flag1)
        break

后来发现sage有现成的函数divisors可以直接求所有的因子,真是太方便辣
在这里插入图片描述
在这里插入图片描述

gift=18150211062729351455633481905222609221074385988870569666008228964942099019268333450225373082700058568213818917267125668494844006433076192398714708653476096
x_y = gmpy2.iroot(gift,2)[0]
div = divisors(x_y)
for i in div:
    flag1 = long_to_bytes(int(i+1))
    if b'flag' in flag1:
        print(flag1)
        break

得到第一部分flag

flag{e837f64d-a556-41

接下来给了三个等式,每一个等式也包含了a,b,c 3个变量,其中c是flag2,为我们所求
这里给两种思路
1.利用sympy库构造方程组去解出a、b、c

from sympy import *

a,b,c = symbols("a b c")
eq = [4*b**6-2*a**3+3*a*c-5530346600323339885232820545798418499625132786869393636420197124606005490080520377416491241780814130580634432917029242402389788321303783584093278303358433856193188224687198306898483386282930376793701825481151610363517100498626293248,b**5+6*c**3+2*a*b*c-2954615125181706551778975245956905163867066802909029011696374372323491135608656194836008189370779030694961333309906927038863656553775849501064217981385517049591593537202663734020724898058374757,3*a**3-3*a*c-3*b**6+5530346600323339885232820545798418499625132786869393636420197035566805062067013375355549877479840082835466426039196029766850808080041755202912921908993556467660683726675045317331817898077228454499973287809035537190311008571468738911]
result = list(nonlinsolve(eq, [a,b,c]))
print(result)

这种方式的话,方程解是能解,但是计算过程相当的慢,大概要40分钟左右。
在这里插入图片描述

result = [(-97319611529501810510904538298668204056042623868316550440771307534558768612892, 311960913464334198969500852124413736815, 78042915855360415267901257437397052556186367517053)]

计算出 c = 78042915855360415267901257437397052556186367517053

2.使用resultant消元法,通过消元把多项式方程组转化为一个变量只有c的形式,然后再构造一个新的一元多项式,最后解方程即可得到c。
PS:la佬tql辣,orz!!!

#sage
R.<a,b,c> = PolynomialRing(ZZ)
f1 = 4*b**6-2*a**3+3*a*c-5530346600323339885232820545798418499625132786869393636420197124606005490080520377416491241780814130580634432917029242402389788321303783584093278303358433856193188224687198306898483386282930376793701825481151610363517100498626293248
f2 = b**5+6*c**3+2*a*b*c-2954615125181706551778975245956905163867066802909029011696374372323491135608656194836008189370779030694961333309906927038863656553775849501064217981385517049591593537202663734020724898058374757
f3 = 3*a**3-3*a*c-3*b**6+5530346600323339885232820545798418499625132786869393636420197035566805062067013375355549877479840082835466426039196029766850808080041755202912921908993556467660683726675045317331817898077228454499973287809035537190311008571468738911

def resultant(f1, f2, var):
    return Matrix.determinant(f1.sylvester_matrix(f2, var))
 
 
h1 = resultant(f1, f2, a) #b,c
h2 = resultant(f1, f3, a) #b,c
h3 = resultant(h1, h2, b) #c
m2 = h3.univariate_polynomial().roots()[0][0]
flag2 = long_to_bytes(int(m2))
print(flag2)

得到flag2

5f-af01-c883e3c8d9ca}

完整解题代码:

#sage
from Crypto.Util.number import *
import gmpy2
from sage.matrix.matrix2 import Matrix 

gift=18150211062729351455633481905222609221074385988870569666008228964942099019268333450225373082700058568213818917267125668494844006433076192398714708653476096
x_y = gmpy2.iroot(gift,2)[0]
div = divisors(x_y)
for i in div:
    flag1 = long_to_bytes(int(i+1))
    if b'flag' in flag1:
        break

R.<a,b,c> = PolynomialRing(ZZ)
f1 = 4*b**6-2*a**3+3*a*c-5530346600323339885232820545798418499625132786869393636420197124606005490080520377416491241780814130580634432917029242402389788321303783584093278303358433856193188224687198306898483386282930376793701825481151610363517100498626293248
f2 = b**5+6*c**3+2*a*b*c-2954615125181706551778975245956905163867066802909029011696374372323491135608656194836008189370779030694961333309906927038863656553775849501064217981385517049591593537202663734020724898058374757
f3 = 3*a**3-3*a*c-3*b**6+5530346600323339885232820545798418499625132786869393636420197035566805062067013375355549877479840082835466426039196029766850808080041755202912921908993556467660683726675045317331817898077228454499973287809035537190311008571468738911

def resultant(f1, f2, var):
    return Matrix.determinant(f1.sylvester_matrix(f2, var))
 
h1 = resultant(f1, f2, a) #b,c
h2 = resultant(f1, f3, a) #b,c
h3 = resultant(h1, h2, b) #c
m2 = h3.univariate_polynomial().roots()[0][0]
flag2 = long_to_bytes(int(m2))
print(flag1+flag2)

flag:

flag{e837f64d-a556-415f-af01-c883e3c8d9ca}

【天底下单相思的痴情,好像都是那么一文不值,可若是值钱,又何必单相思呢。】

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

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

相关文章

JavaScript案例分享:让前端开发者抓狂的按钮

前言 我分享一个前端案例&#xff0c;代码来源我不确定&#xff0c;可能是我某个编程技术交流群的群友分享的。由于我设置了自动下载文件&#xff0c;今天在查看微信文件时偶然发现了这个案例&#xff0c;查看下载日期是6月7日&#xff0c;所以无法确定到底是哪个群友分享的。但…

618,你会入手哪些书?【文末送书】

好书分享 前沿技术人工智能半导体新一代通信与信息技术网络空间安全参与规则 一年一度的618又到啦&#xff01;今年的618就不要乱买啦&#xff0c;衣服买多了会被淘汰&#xff0c;电子产品买多了会过时&#xff0c;零食买多了会增肥&#xff0c;最后怎么看都不划算。可是如果你…

超强整理,性能测试-常用服务器性能指标分析总结,一篇概全...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 压测过程中&#…

Hive SQL DML

Hive SQL DML 本节所需数据集 数据集 提取码&#xff1a;rkun ⛵加载数据 Load 加载&#xff0c;装载将数据文件移动到与Hive表对应位置&#xff0c;移动时是纯复制&#xff0c;移动操作。纯复制移动指数据load加载到表中&#xff0c;hive不会对表中数据内容进行任何变换&…

Cache技术在星辰处理器中的应用

Cache技术在星辰处理器中的应用-修复MicroPython在MM32F5上启动慢的问题 文章目录 Cache技术在星辰处理器中的应用-修复MicroPython在MM32F5上启动慢的问题引言Cache的工作原理需要关闭DCache的情况鱼和熊掌都想要使用内存保护单元MPU使用内存隔离/同步指令 总结参考文献 引言 …

catkin cmake官方教程解读以及资料补充

这里写目录标题 cmakei下载cmake 官方教程教程1step1最低版本 报错报错2 vscode 路径没有配置好setting.json通过该方式打开的似乎是一个全局的文件&#xff0c;可以为本工作文件夹下设置一个本地的吗 报错3配置cmake工具链准确的流程报错4 cpp中main函数返回值问题结果 官方教…

虚拟机centos7无法正常启动:Generating“/run/initramfs/rdsosreport.txt“

一、问题描述 1.出现问题的原因 Centos 7 断电导致 &#xff0c;最近电脑老是自己蓝屏&#xff0c;然后重启电脑&#xff0c;一个月里断断续续可能有个3次左右&#xff0c;突然发现启动就这个问题&#xff0c;估计是虚拟机异常物理断电导致的系统磁盘出错了 2.具体的报错信息…

打开冒险岛提示丢失vcruntime140.dll的解决方法

今天准备打开冒险岛软件的时候&#xff0c;当打开我自己的冒险岛软件后&#xff0c;弹出了一个对话框&#xff0c;内容是&#xff1a;由于找不到vcruntime140_1.dll&#xff0c;无法继续执行代码。重新安装程序可能会解决此问题。 我很纳闷&#xff0c;前几天还好好着呢。于是…

【ARIMA-WOA-LSTM】合差分自回归移动平均方法-鲸鱼优化-长短期记忆神经网络研究(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

vue新手入门实践教程

介绍vue运行环境的搭建、vue项目的初步构建与运行、使用element-ui组件构建页面内容、使用页面模块与路由设置等。基于此教程&#xff0c;可以初步实现一个静态网页&#xff0c;并对vue项目由一定理解。 1、基本环境安装 vue项目的编译运行依赖nodejs环境&#xff0c;故需要下…

使用rasterio计算tif文件中两点之间的物理实际距离

假设有一张含有地理坐标信息的tif格式的图片及其对应的jpg或者png格式的普通图片 如下图所示&#xff1a; 其中第一张为tif格式的地理信息图&#xff0c;第二张为按照一定比例下采样之后转换得到的普通jpg图片 如何计算jpg图片中任意两点之间的实际距离呢&#xff1f; 比如&a…

终于等到你:期待已久的CAD .NET 15 Crack

期待已久的CAD .NET 15 现已推出&#xff01;新包包括一个.NET 6 框架构建。目前&#xff0c;它仅与 Windows 兼容&#xff0c;但我们计划在未来的版本中添加对 Linux 的支持。 我们还进行了一系列更改以增强库的稳定性并改进其导入和导出功能。他们来了&#xff1a; 改进了 DW…

Scala--03

第6章 面向对象 Scala 的面向对象思想和Java 的面向对象思想和概念是一致的。 Scala 中语法和 Java 不同&#xff0c;补充了更多的功能。 6.1类和对象详解 6.1.1组成结构 构造函数: 在创建对象的时候给属性赋值 成员变量: 成员方法(函数) 局部变量 代码块 6.1.2构造器…

详解c++---map的介绍

目录标题 map容器的介绍pair的介绍map的构造函数insert函数make_pair函数find函数map的[ ]重载multimap map容器的介绍 通过之前的学习想必大家对set容器的理解应该非常的深刻了&#xff0c;我们知道他的底层是一个k结构的搜索二叉树&#xff0c;可以对数据进行去重并排序&…

Redis实现分布式锁详解

Redis实现分布式锁详解 一 分布式锁简介二 Redis实现分布式锁核心思路三 Redis实现分布式锁实践3.1 锁的基本接口3.2 加锁解锁逻辑3.3 修改业务逻辑3.4 单元测试观察结果 四 Redis分布式锁误删情况4.1.Redis分布式锁误删情况逻辑说明&#xff1a;4.2 解决Redis分布式锁误删问题…

当心健身跑步应用悄悄泄露用户住址

据BleepingComputer 6月11日消息&#xff0c;美国北卡罗来纳州立大学罗利分校的研究人员发现 Strava 应用程序的热图功能存在隐私风险&#xff0c;可能导致攻击者识别出用户的家庭住址。 Strava 是一款流行的跑步伴侣和健身追踪应用程序&#xff0c;在全球拥有超过 1 亿用户&a…

2个月“我“从功能测试进阶到自动化测试,offer收到麻了...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 自动化测试是将人…

C++【STL】之vector模拟实现

C vector类模拟实现 上一篇讲解了vector的使用&#xff0c;这一篇接着介绍vector的模拟实现&#xff0c;这里依然是讲解常用接口的模拟实现&#xff0c;话不多说&#xff0c;正文开始&#xff01; 文章目录&#xff1a; C vector类模拟实现1. 成员变量2. 默认成员函数2.1 构造…

使用lcov生成覆盖率报告

使用lcov生成覆盖率报告 1- 需要准备的东西1.1 工具lcov1.2 需要用到中间脚本 gcno gcda1.3 源文件 2- 生成覆盖率报告2.1 step1: 编译阶段2.2 step2: 数据收集与提取阶段2.3 step3: 报告形成阶段2.4 step4: lcov生成覆盖率报告结果info文件2.5 step5: genhtml 命令生成网页版的…

给定一个字符串比如“abcdef”,要求写个函数变成“defabc”,位数是可变的。

首先可以使用字符串切片的方法来实现这个需求。 具体做法是&#xff1a;① 定义一个整数变量 n 表示要切割的位置&#xff0c;本实例中为 3 。 ② 将字符串按照 n 分割成两个字串&#xff0c;即 “abc” 和 “def”。 ③ 将两个字符串颠倒顺序&#xff0c;即 “cba” 和 “fed…