2024SHCTF_week3_Crypto

Lattice

题目:

import gmpy2
from Crypto.Util.number import *
from enc import flagm = bytes_to_long(flag)
n = getPrime(1024)
x = getPrime(200)
hint = (x*gmpy2.invert(m,n)) % n
print(f'n = {n}')
print(f'hint = {hint}')
'''
n = 135468605513880715606160882767765787154992546140468650057512573698684612475952478442814762328886660927143257644564134230892428444605363739481966015067533502387771994796933314650597759164542382096028864516989227078865314961731612554274030804378847341544941485447330710625751160113655721360522825842304325648661
hint = 4535444892439469356191795531860980185017935336250370459110841353738315673311973758532357439742440370098258890761750332474316301902006965178488232784675254754714945846956685367697549284904368943678089682352903895702618452358063454221008706189296038769220252217025015109037299722951003889830047605895164204665
'''

最标准的格
做之前最好先判断是否满足hermite定理
脚本:

#sage
import gmpy2
from Crypto.Util.number import *n = 135468605513880715606160882767765787154992546140468650057512573698684612475952478442814762328886660927143257644564134230892428444605363739481966015067533502387771994796933314650597759164542382096028864516989227078865314961731612554274030804378847341544941485447330710625751160113655721360522825842304325648661
hint = 4535444892439469356191795531860980185017935336250370459110841353738315673311973758532357439742440370098258890761750332474316301902006965178488232784675254754714945846956685367697549284904368943678089682352903895702618452358063454221008706189296038769220252217025015109037299722951003889830047605895164204665# hint*m=x%n
# hint*m=x+kn
# x=hint*m-kn# [m,-k][1,hint]=[m,x]
#       [0,n]
m=getPrime(37*8)
x = getPrime(200)
length1=gmpy2.iroot(2*n,2)[0]
length2=gmpy2.iroot(x**2+m**2,2)[0]
print(length1.bit_length())
print(length2.bit_length())Ge=Matrix(ZZ,[[1,hint],[0,n]])
m=abs(Ge.LLL()[0][0])
print(long_to_bytes(int(m)))

这里的m位数也是根据常识预估一下

babylcg

题目:

from Crypto.Util.number import *
from enc import flagseed = bytes_to_long(flag)a = getPrime(400)
b = getPrime(400)
p = getPrime(400)
c = []
for i in range(3):seed = (seed*a+b)%pc.append(seed>>80)
print(f'a = {a}')
print(f'b = {b}')
print(f'p = {p}')
print(f'c = {c}')'''
a = 2480723693416197023777639119379107915577379442319446556514537465902730221165988032585937040968036882125810398538496323351
b = 1904193709124547126225055171380429984044969427702757019616077686519603583212249311116383727431445401398594522230612229733
p = 1532358535804235132496312416063170109053232217889240979567714057566239469579822887828122819499504563106464882747447051359
c = [813530482014456574209632986607111359200629085246367954186877618366451174001463654876753005264098, 1054295430131833360658465071066491055652904289373961069213308535490435549697560050854110548843919, 374976866832751055109605198170602358027434683548463528601734580123896818157824411065383601884240]
'''

非常规lcg,因为这里的see>>80,高位泄露了

c[0]=813530482014456574209632986607111359200629085246367954186877618366451174001463654876753005264098
print(c[0].bit_length())
#319>>80

这里用c0,c1套一下

H1+L1=((H0+L0)*a+b)%p
#H1,L1是c1的高位和低位,c0同理

构建多项式环:

f=(H0+L0)*a+b)-(H1+L1)
其中L0和L1未知,令其为x和y
即f=(H0+x)*a+b)-(H1+y)
这样即可得到x,即得到c0
而从根据a的逆元反推seed

这里最难的点感觉就是求小根那个函数
这里用的其他师傅的脚本,没实力啊~

import itertools
def small_roots(f, bounds, m=1, d=None):if not d:d = f.degree()R = f.base_ring()N = R.cardinality()f /= f.coefficients().pop(0)f = f.change_ring(ZZ)G = Sequence([], f.parent())for i in range(m+1):base = N^(m-i) * f^ifor shifts in itertools.product(range(d), repeat=f.nvariables()):g = base * prod(map(power, f.variables(), shifts))G.append(g)B, monomials = G.coefficient_matrix()monomials = vector(monomials)factors = [monomial(*bounds) for monomial in monomials]for i, factor in enumerate(factors):B.rescale_col(i, factor)B = B.dense_matrix().LLL()B = B.change_ring(QQ)for i, factor in enumerate(factors):B.rescale_col(i, 1/factor)H = Sequence([], f.parent().change_ring(QQ))for h in filter(None, B*monomials):H.append(h)I = H.ideal()if I.dimension() == -1:H.pop()elif I.dimension() == 0:roots = []for root in I.variety(ring=ZZ):root = tuple(R(root[var]) for var in f.variables())roots.append(root)return rootsreturn []
# sage
a = 2480723693416197023777639119379107915577379442319446556514537465902730221165988032585937040968036882125810398538496323351
b = 1904193709124547126225055171380429984044969427702757019616077686519603583212249311116383727431445401398594522230612229733
p = 1532358535804235132496312416063170109053232217889240979567714057566239469579822887828122819499504563106464882747447051359
c = [813530482014456574209632986607111359200629085246367954186877618366451174001463654876753005264098,1054295430131833360658465071066491055652904289373961069213308535490435549697560050854110548843919,374976866832751055109605198170602358027434683548463528601734580123896818157824411065383601884240,
]PR.<x,y> = PolynomialRing(Zmod(p))
f = ((c[0]<<80)+ x) * a + b - ((c[1]<<80) + y)
roots = small_roots(f,(2^80, 2^80), m=4, d=4)
s1 = (c[0]<<80) + roots[0][0]
m = (s1 - b) * inverse_mod(a, p) % p
print(bytes.fromhex(hex(m)[2:]))

大学×高中√

题目:

from Crypto.Util.number import *
from enc import flagm = bytes_to_long(flag)
assert len(flag)==47
leak = cos(m).n(1000)
print(leak)
# 0.0998850707771875936255320441622758414273045504083276270807057373186889944319840434839754884311751169692981949171665523641780707944615961482956134641228858117430417240690757611709757603218395869292050704312456085723639395453639137813691195138264605914554001589394663177610703870989537946983548789434829

这道题思路也是构造格的形式

leak = cos(m).n(1000)
可以写成
m-arcos(leak)-2k π \pi π=0
其中arcos(leak)求的是一个周期(2 π \pi π)内的具体值
这样我们就构造出来了一个三维格

令x=arccos(leak)
如下所示

[ m − 1 2 ∗ k ] [ 1 0 1 0 1 x 0 0 π ] ⇒ [ m − 1 0 ] \begin{bmatrix} m&-1&2*k\\ \end{bmatrix} \begin{bmatrix} 1&0&1\\ 0&1&x\\ 0&0&\pi\\ \end{bmatrix} \Rightarrow \begin{bmatrix} m&-1&0\\ \end{bmatrix} [m12k] 1000101xπ [m10]

经过计算发现不满足hermite定理

#Hermite定理判断
#初次判断长度
#iroot函数参数只能是整数,这里用3代替pi,其实大小而言根本不影响
length1=gmpy2.iroot(3,2)[0]*gmpy2.iroot(3,3)[0]
print(length1.bit_length())//1length2=gmpy2.iroot(m**2+1,2)[0]
print(length2.bit_length())//377

我们只能给中间矩阵添加一些值
使目标矩阵的值小于行列式的值
正确的矩阵构造如下
[ m − 1 2 ∗ k ] [ 1 0 t ∗ 1 0 a t ∗ x 0 0 t ∗ π ] ⇒ [ m − a 0 ] \begin{bmatrix} m&-1&2*k\\ \end{bmatrix} \begin{bmatrix} 1&0&t*1\\ 0&a&t*x\\ 0&0&t*\pi\\ \end{bmatrix} \Rightarrow \begin{bmatrix} m&-a&0\\ \end{bmatrix} [m12k] 1000a0t1txtπ [ma0]

因为这里的m比特长度是478,所以将将a的长度也设置位478(如果不这样设置会导致目标向量各个维度长度不均衡,不容易规约出来结果),然后找到合适的t

下面是两个错误构造的情况:

一: [ m − 1 2 ∗ k ] [ 1 0 t ∗ 1 0 1 t ∗ x 0 0 t ∗ π ] ⇒ [ m − a 0 ] \begin{bmatrix} m&-1&2*k\\ \end{bmatrix} \begin{bmatrix} 1&0&t*1\\ 0&1&t*x\\ 0&0&t*\pi\\ \end{bmatrix} \Rightarrow \begin{bmatrix} m&-a&0\\ \end{bmatrix} [m12k] 100010t1txtπ [ma0]

*这就是我上面说的目标向量各个维度长度不均衡*

二:
[ t m − 2 ∗ k ] [ t 0 − x 0 1 1 0 0 π ] ⇒ [ t m 0 ] \begin{bmatrix} t&m&-2*k\\ \end{bmatrix} \begin{bmatrix} t&0&-x\\ 0&1&1\\ 0&0&\pi\\ \end{bmatrix} \Rightarrow \begin{bmatrix} t&m&0\\ \end{bmatrix} [tm2k] t00010x1π [tm0]

*这样构造虽然行列式的值变大了,但目标矩阵的值也变大*
*依然不满足*

下面是脚本代码

import gmpy2
from Crypto.Util.number import *#求出pi的小数点后1000位
RF = RealField(1000)
pi = RF(pi)m=2**(47*8)
leak=0.0998850707771875936255320441622758414273045504083276270807057373186889944319840434839754884311751169692981949171665523641780707944615961482956134641228858117430417240690757611709757603218395869292050704312456085723639395453639137813691195138264605914554001589394663177610703870989537946983548789434829
x=arccos(leak)#Hermite定理判断
#初次判断长度
#iroot函数参数只能是整数,这里用3代替pi,其实大小而言根本不影响
length1=gmpy2.iroot(3,2)[0]*gmpy2.iroot(3,3)[0]
print(length1.bit_length())length2=gmpy2.iroot(m**2+1,2)[0]
print(length2.bit_length())#添加常数再判断
#这样添加是为了让我们的目标向量数值变得均衡[m,a,0]
t=2**756
a=2**(47*8)
length1=gmpy2.iroot(3,2)[0]*gmpy2.iroot(t*3*a,3)[0]
print(length1.bit_length())length2=gmpy2.iroot(m**2+1+a**2,2)[0]
print(length2.bit_length())#m-arcos(leak)-2kpi=0
#格的形式
#            [1,0,t*1 ]
# [m,-1,-2*k][0,a,t*x ]=[m,-a,0]
#            [0,0,t*pi]#这种构造随着行列式的增大,目标向量也变大,而且目标向量始终大于行列式
#所以不行
#            [t,0,-x]
# [t,m,-2*k] [0,1,1 ]=[t,m,0]
#            [0,0,pi]#构造
Ge=Matrix(QQ,[[1,0,t],[0,a,t*x],[0,0,t*pi]])
m=Ge.LLL()[0][0]
m=abs(m)
print(long_to_bytes(int(m)))

Shamir

题目:

from Crypto.Util.number import getPrime,bytes_to_long
import random
from os import getenvBANNER = """__          __  _                            _______       _____ _                     _      \ \        / / | |                          |__   __|     / ____| |                   (_)     \ \  /\  / /__| | ___ ___  _ __ ___   ___     | | ___   | (___ | |__   __ _ _ __ ___  _ _ __ \ \/  \/ / _ \ |/ __/ _ \| '_ ` _ \ / _ \    | |/ _ \   \___ \| '_ \ / _` | '_ ` _ \| | '__|\  /\  /  __/ | (_| (_) | | | | | |  __/    | | (_) |  ____) | | | | (_| | | | | | | | |   \/  \/ \___|_|\___\___/|_| |_| |_|\___|    |_|\___/  |_____/|_| |_|\__,_|_| |_| |_|_|_|   
"""
print(BANNER)flag = getenv("GZCTF_FLAG","GZCTF_NOT_DEFINE")
m = bytes_to_long(flag.encode())
n = getPrime(1024)
coefficients = [m] + [random.randrange(1,n-1) for i in range(100)]   
print(f"n = {n}")def f(x):sum = 0for i in range(len(coefficients)):sum += coefficients[i]*pow(x,i,n) % nsum %= nreturn sumwhile 1:x = int(input("Please Input x: "))if x == 0:print("Not Allowed!!!")exit()res = (x,f(x))print(res)

这里coefficients = [m] + [random.randrange(1,n-1) for i in range(100)] 是为了生成

f ( x ) = m + a 1 x + a 2 x 2 + ⋯ + a k − 1 x k − 1 f(x) = m + a_1 x + a_2 x^2 + \cdots + a_{k-1} x^{k-1} f(x)=m+a1x+a2x2++ak1xk1

其中包含100个系数 a 1 , a 2 . . . a n a_1,a_2...a_n a1,a2...an
f(x)是为了计算当输入x后的值

本人小菜,所以直接来分析脚本

from pwn import *
from Crypto.Util.number import *ip_address = ""
port = 
sh = remote(ip,port)
sh.recvuntil(b"n = ")
n = int(sh.recvline().decode())
PT = []
for i in range(101):sh.sendlineafter(b"Please Input x:",str(i+1).encode())res = eval(sh.recvline().decode())PT.append(res)R.<x> = PolynomialRing(Zmod(n))
recover_f = R.lagrange_polynomial(PT)
m = recover_f(0)
flag = long_to_bytes(int(m))
print(flag)

首先是先远程连接,然后等到服务器输出‘n=’时停止
接收n的值
然后循环101次,从1开始,依次得到f(x),因为源码禁止从0开始(从0开始可以直接得到m)
下面采用拉格朗日插值法:

PT = [(1, f(1)), (2, f(2)), (3, f(3)), …, 101, f(101))]
R.lagrange_polynomial(PT) 返回一个多项式,该多项式在给定的点对 PT后可以恢复f(x)
(这里不讨论拉格朗日插值法实现的原理,感兴趣可以自行查找资料)
下面我们就可以令x=0来计算
m = recover_f(0)

Approximate_n

baby_lock

这两道题目有空再分析

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

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

相关文章

如何利用谷歌浏览器提高网络安全

在当今数字化时代&#xff0c;网络安全已成为我们不可忽视的重要议题。作为全球最受欢迎的网络浏览器之一&#xff0c;谷歌浏览器不仅提供了快速、便捷的浏览体验&#xff0c;还内置了多种安全功能来保护用户的在线安全。本文将详细介绍如何通过谷歌浏览器提高您的网络安全&…

Python实现随机分布式延迟PSO优化算法(RODDPSO)优化CNN回归模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 近年来&#xff0c;深度学习技术在计算机视觉、语音识别、自然语言处理等领域取得了显著的成功。卷…

【电路笔记 信号】极点的物理意义

图像总结 极点的具体位置为我们提供了关于系统行为的重要信息&#xff0c;有助于分析系统的频率响应、时间响应和稳定性&#xff1a; 极点的虚部决定了系统的振荡频率&#xff0c;即系统的自然频率。极点的实部决定了系统的稳定性和阻尼特性。负实部表示稳定的衰减响应&#x…

cocoscreator-doc-TS-脚本开发-使用 TypeScript 脚本

//申明类型property(cc.Label) //类型 编辑器展示label:cc.Label null; // 声明变量 默认值property({visible:false})test:string hello;property({type:cc.Integer})int1 1;//声明数组property([cc.Node])public myNodes:cc.Node[] [];//声明 getsetproperty_width …

目录背景缺少vscode右键打开选项

目录背景缺少vscode右键打开选项 1.打开右键管理 下载地址&#xff1a;https://wwyz.lanzoul.com/iZy9G2fl28uj 2.开始搜索框搜索vscode&#xff0c; 找到其源目录 3.目录背景里面&#xff0c; 加入vscode.exe 3.然后在目录背景下&#xff0c; 右键&#xff0c; code就可以打…

Redis的特性

Redis的基本特性 1.速度快 &#xff08;1&#xff09;redis的所有数据都是存储在内存中的&#xff0c;这是redis速度快的主要原因。 &#xff08;2&#xff09;redis使用C语言来实现的&#xff0c;C语言实现的程序和系统更接近&#xff0c;因此速度比较快。 &#xff08;3&am…

如何使用PCL处理ROS Bag文件中的点云数据并重新保存 ubuntu20.04

如何使用PCL处理ROS Bag文件中的点云数据并重新保存 要精确地处理ROS bag中的点云数据并使用PCL进行处理&#xff0c;再将处理后的数据保存回新的ROS bag文件&#xff0c;以下方案提供了详细、专业和严谨的步骤。 步骤 1: 环境设置 确保安装了ROS和PCL&#xff0c;并配置好环…

服务器Docker OOM RSS高问题排查思路

优质博文&#xff1a;IT-BLOG-CN 防走弯路为防止走弯路&#xff0c;强烈建议先仔细阅读以下加粗内容&#xff1a; 如果你的应用是因为公司最近降成本调小实例物理内存才出现docker oom&#xff0c;而之前从来没有出现过&#xff0c;那么大概率是堆内存太大导致&#xff0c;这种…

Hadoop的汽车销量数据分析系统

摘要 随着大数据技术的快速发展&#xff0c;基于大数据的分析应用日益普及。本论文针对汽车行业&#xff0c;本论文设计并实现了一个基于Hadoop的汽车销量数据分析系统&#xff0c;旨在提供汽车行业的决策支持和市场洞察。系统首先通过网络爬虫和API等方式采集汽车销量数据&am…

在应用启动时,使用 UniApp 提供的 API 检查和请求权限。

在使用 UniApp 开发 App 时&#xff0c;如果你需要在应用启动时提示用户获取本地媒体权限&#xff0c;可以按照以下步骤操作&#xff1a; 1. 明确需要的权限 要访问本地媒体&#xff08;如相机、麦克风或文件存储&#xff09;&#xff0c;需要申请以下权限&#xff1a; Andr…

掌握Git分布式版本控制工具:从基础到实践

一、引言 在软件开发过程中&#xff0c;版本控制是不可或缺的一环。Git作为一种分布式版本控制工具&#xff0c;以其高效、灵活的特点&#xff0c;受到了广大开发者的青睐。本文将详细介绍Git的基本概念、工作流程、常用命令&#xff0c;以及在IntelliJ IDEA中的操作方法。 二、…

【Python】FastAPI:Token认证

FastAPI&#xff1a;Token认证 本教程通过 FastAPI 实现用户登录和基于 JWT&#xff08;JSON Web Token&#xff09; 的认证与授权&#xff0c;适合初学者到进阶用户。教程特别关注 Depends、OAuth2PasswordBearer 等非基础操作的详细讲解&#xff0c;帮助你全面掌握相关技术。…

第7章硬件测试-7.3 功能测试

7.3 功能测试 7.3.1 整机规格测试7.3.2 整机试装测试7.3.3 DFX测试 功能测试包括整机规格、整机试装和整机功能测试&#xff0c;是整机结构和业务相关的测试。 7.3.1 整机规格测试 整机规格测试包括尺寸、重量、温度、功耗等数据。这些测试数据与设计规格进行比对和校验&…

芯片之殇——“零日漏洞”(文后附高通64款存在漏洞的芯片型号)

芯片之殇——“零日漏洞”(文后附高通64款存在漏洞的芯片型号) 本期是平台君和您分享的第113期内容 前一段时间,高通公司(Qualcomm)发布安全警告称,提供的60多款芯片潜在严重的“零日漏洞”,芯片安全再一次暴露在大众视野。 那什么是“零日漏洞”?平台君从网上找了一段…

「Mac玩转仓颉内测版23」基础篇3 - 深入理解整数类型

本篇将详细讲解Cangjie中的整数类型&#xff0c;探讨整数的定义、操作、表示范围、进制表示、类型转换及应用场景&#xff0c;帮助开发者在Cangjie中灵活运用整数类型构建程序逻辑。 关键词 有符号整数与无符号整数表示范围与溢出进制表示类型转换字面量与操作 一、整数类型概…

如何恢復電腦IP地址的手動設置?

手動設置IP地址後&#xff0c;可能會遇到一些網路連接問題&#xff0c;或者需要恢復到之前的自動獲取狀態。這篇文章將詳細介紹如何恢復電腦的IP地址設置。 為什麼需要恢復IP地址設置&#xff1f; 網路連接問題&#xff1a;手動設置IP地址後&#xff0c;可能會導致與路由器或…

Python-简单病毒程序合集(一)

前言&#xff1a;简单又有趣的Python恶搞代码&#xff0c;往往能给我们枯燥无味的生活带来一点乐趣&#xff0c;激发我们对编程的最原始的热爱。那么话不多说&#xff0c;我们直接开始今天的编程之路。 编程思路&#xff1a;本次我们将会用到os,paltform,threading,ctypes,sys,…

跟我学C++中级篇——Design Patterns的通俗说法

一、设计模式 Design patterns&#xff0c;软件设计模式&#xff0c;它是什么&#xff1f;很多初学者会被这种高大上的东西给唬住。其实&#xff0c;所有的书籍上都说得很清楚&#xff0c;只是它们把这种说法说得很高大上而已。举个简单例子&#xff0c;在抖音上经常可以看到介…

Linux16 多路复用(二)

多路复用&#xff08;二&#xff09; 1. 多路复用 - poll功能函数原型关于 pollfd 结构体类型poll 代码框架一些示例代码poll相较于select优点poll的缺点 2. 多路复用 - epoll关于epoll的三个系统调用创建 - epoll_create控制 - epoll_ctl函数原型关于 epoll_event 结构体 等待…

数字化那点事:一文读懂物联网

一、物联网是什么&#xff1f; 物联网&#xff08;Internet of Things&#xff0c;简称IoT&#xff09;是指通过网络将各种物理设备连接起来&#xff0c;使它们可以互相通信并进行数据交换的技术系统。通过在物理对象中嵌入传感器、处理器、通信模块等硬件&#xff0c;IoT将“…