H&NCTF2025
H&NCTF2025 Crypto
Crypto
lcgp
常规的LCG问题,
观察函数generate
123def generate(self): self.seed = (self.a * self.seed + self.b) % self.m # %代表取余运算 return self.seed
输入seed,获得一个新的seed 接着循环了5次,产生了5次种子
换而言之,我们需要利用这5个种子,求出一开始的种子
不妨设,一开始的seed为x1,然后我们写成数列的形式 已知求 接着来看算法的关键
这里面a,b,m都是未知的,b好处理,因为在常数的位置,两个式子相减就能消掉
考虑
这时候,我们以作为一个新数列,那么这时候只剩下两个未知数了
设
那么
于是构造了一个等比数列
$$ ...
苦读格密码-lattice
对格的理解还是太肤浅了,这里加强一下理论学习
一、格的定义
首先介绍一些基本概念 中的内积 定义欧几里得范数 为了研究整数集里的问题
假设在中有n个线性无关的向量,m>n
则
就是说只考虑向量的整系数线性组合,这在平面内会生成很多离散的点,实现了分割平面
长得就像晶胞一样(Crystal)
基本平行多面体(Fundamental Parallelepiped)
给定基,我们可以定义一个基本平行多面体:
这个平行多面体可以看作格的“最小重复单元”,类似于晶体的“晶胞”。
需要遍历0到1,以覆盖这个晶胞
这些向量称为格L的基,m是维数,n是格L的秩
格基可以写成一个矩阵
不同的基可以生成同一个格,不过,我们可以用晶胞作为每个格的区分标准,那么我们考察这个晶胞的体积,因为行列式本身就是对空间的拉伸程度,那我们计算这个晶胞体积,其实就是格的行列式
但是如果不满秩呢?
那其实好像也能用每个线段长度来定义这个晶胞
换而言之,我们只计算n维子空间上的晶胞大小就行了,这个其实就是 比如这里行列式是,那么这个间隔就是
Kernal...
z3的使用
z3的使用
在crypto中,经常会遇到某些带有限制的方程,有一些可以用线性代数的语言翻译,但有些则不行,比如与运算或运算,没办法简单用线性代数求解,那么这时候就需要z3
一、求解带不等式的方程
声明变量
1x = Int('x')
solve可以解决方程
12345from z3 import *x = Int('x')y = Int('y')solve(x > 2, y < 10, x + 2*y == 7)
可以解决这样的方程问题
二、求解非多项式约束,例如位运算
假设我们有一个方程:
1(x & 0xFF) ^ (x >> 8) == 0x37
其中 x 是一个 16 位的变量(即
0 ≤ x < 65536),我们希望找到满足条件的
x。
1234567891011121314151617from z3 import *# 创建 16 位变量x = BitVec('x', 16) # 16-bit 变量#...
Litctf-crypto wp
Litctf-wp1.basic12345678910from Crypto.Util.number import *from enc import flag m = bytes_to_long(flag)n = getPrime(1024)e = 65537c = pow(m,e,n)print(f"n = {n}")print(f"e = {e}")print(f"c = {c}") 签到题 \phi(n) = n-1rsa解密即可 1234567from Crypto.Util.number import *n =...
黄河流域wp
黄河流域WP1.LatticeLWE问题 123456789101112131415161718192021222324252627282930def gen(q, n, N, sigma): t = np.random.randint(0, high=q // 2, size=n) s = np.concatenate([np.ones(1, dtype=np.int32), t]) A = np.random.randint(0, high=q // 2, size=(N, n)) e = np.round(np.random.randn(N) * sigma**2).astype(np.int32) % q b = ((np.dot(A, t) + e).reshape(-1, 1)) % q P = np.hstack([b, -A]) return P, sdef enc(P, M, q): N = P.shape[0] n = len(M) r = np.random.randint(0, 2, (n,...
BYUCTF2025 crypto wp
BYUCTF2025 crypto WP
1.Many Primes
注意到n是很多小因子的乘积,利用欧拉函数性质计算 解密即可
123456789101112from Crypto.Util.number import *n =...
actf(爆零)
1.eazy_log
首先加法
2.AAALLL
使用AES加密,需要求出key
1key = md5(str(f.list()).encode()).digest()
也就是求出f的系数
而f满足
1f = sample_ternery_poly(Q)
首先定义了一个多项式 这里n=450,无法因式分解,但是有450个根
12roots = [i[0] for i in g.roots()]print(len(roots))
为什么?
注意到这里 原根的概念、性质及其存在性
- 知乎
引理3:如果 ,那么
恰好有 d
个根。
然后我们从中选出225个根
然后构造了一个商环 也就是进行模运算,将 小于n的单项式不会有变化
所以f就是在Q上选取了一个449次的多项式,他的系数是-1,0,1由于是有限域p上的,所以-1就是p-1
所以我们的关键就是恢复f的系数
我们已知225个根,假设是r 而我们知道 于是有 那么
那么这就是一个格密码的问题了,注意到这个矩阵是Vandermonde矩阵
可以考虑...
轩辕杯crypto-wp
...
hashctf2025
Crypto
一、simple_equation
定个小目标,希望不久的将来就能彻底搞懂这个推导过程
经典钓鱼题,就是那个香蕉苹果的题目 AMI_43_from29to41.pdf
此事于此论文亦有记载
注意到三个分式都是齐次的
所以可以考虑把关系映射到二维空间
首先去分母得到 然后根据论文里的(暂时还不知道怎么做到的)
可以映射到二维空间的椭圆曲线
我们知道这个椭圆曲线上的一个点,然后不断倍乘,直到映射回去的a,b,c是正整数就行了
映射关系
12345678910111213141516171819202122232425262728293031ee = EllipticCurve([0, 4*10^2+12*10-3, 0, 32*(10+3), 0])print(ee)print(ee.gens())P = ee(-416,4160) def orig(P,N): x = P[0] y = P[1] a = (8*(N+3)-x+y)/(2*(N+3)*(4-x)) b =...
sqli
一、sqlmap使用
扫注入点
1sqlmap -u http://localhost/sqli/Less-1/?id=1
显示所有数据库
1sqlmap -u http://localhost/sqli/Less-1/?id=1 -dbs