苦读格密码-lattice
对格的理解还是太肤浅了,这里加强一下理论学习 一、格的定义首先介绍一些基本概念 中的内积 定义欧几里得范数 为了研究整数集里的问题 假设在中有n个线性无关的向量,m>n 则就是说只考虑向量的整系数线性组合,这在平面内会生成很多离散的点,实现了分割平面 长得就像晶胞一样(Crystal) 基本平行多面体(Fundamental Parallelepiped) 给定基,我们可以定义一个基本平行多面体:这个平行多面体可以看作格的“最小重复单元”,类似于晶体的“晶胞”。 需要遍历0到1,以覆盖这个晶胞 这些向量称为格L的基,m是维数,n是格L的秩 格基可以写成一个矩阵不同的基可以生成同一个格,不过,我们可以用晶胞作为每个格的区分标准,那么我们考察这个晶胞的体积,因为行列式本身就是对空间的拉伸程度,那我们计算这个晶胞体积,其实就是格的行列式 但是如果不满秩呢? 那其实好像也能用每个线段长度来定义这个晶胞 换而言之,我们只计算n维子空间上的晶胞大小就行了,这个其实就是 比如这里行列式是,那么这个间隔就是 Kernal lattice 满足加法和整数数乘封闭,所以构成一个格 可以用...
z3的使用
z3的使用在crypto中,经常会遇到某些带有限制的方程,有一些可以用线性代数的语言翻译,但有些则不行,比如与运算或运算,没办法简单用线性代数求解,那么这时候就需要z3 一、求解带不等式的方程声明变量 12x = Int('x') solve可以解决方程 12345678910from z3 import *x = Int('x')y = Int('y')solve(x > 2, y < 10, x + 2*y == 7) 可以解决这样的方程问题 二、求解非多项式约束,例如位运算假设我们有一个方程: 12(x & 0xFF) ^ (x >> 8) == 0x37 其中 x 是一个 16 位的变量(即0 ≤ x < 65536),我们希望找到满足条件的x。 12345678910111213141516171819202122232425262728293031323334from z3 import *# 创建 16 位变量x = BitVec('x', 16) # 16-bit 变量# 创建求解器solver = Solver()...
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 = 1506243218834068252032082238773791412483030986391789392465610165559847110882815994516424010360596777884918453921451855084834302432806491792313498881086497663209610957324002970522740032692307048909496828363962679059467351140623994029...
黄河流域wp
黄河流域WP1.LatticeLWE问题 123456789101112131415161718192021222324252627def 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, N)) Z...
BYUCTF2025 crypto wp
BYUCTF2025 crypto WP1.Many Primes注意到n是很多小因子的乘积,利用欧拉函数性质计算 解密即可 123456789101112from Crypto.Util.number import *n = 8495733987884124904266199201531877591415305789106754972367198277897595752698436174873567033342679201251924809926553711531583560205788231854311278119643895384065327902995753320804544864931218387306213225592810915047009098254150200301366693993418141647358107399022172844834253354984371038354474322036412745367976190936898249308936974081506610619644406255844631283661265666643408965520...
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矩阵 可以考虑 Direct Primal Attack 考虑嵌入技术 那么(f|...
轩辕杯crypto-wp
轩辕杯crypto-wp1.简单编码显然A和B就是二进制的0和1,不过哪个是0,哪个是1不知道 用Ctrl+F直接替换,得到两种情况 发现A=1,B=0,是可以用ASCII码得到有意义的字符的 得到 LJWVCMSONJGXSTSHKUZGERCRGJMWU2DMJ5CFM2SNGJKTETLKJJWE4R2WNBGUOVTIJ5KEE3COPJTXOWTKIUZU4RCBGVHVOZDKJUZEM2SZGJEXQTSHKZUFSMSZGJHDESJUMZMHGMCOKRKXUTT2NBUE2UJFGNCCKM2E 注意到这是base32编码,解码得到 ZmQ2NjMyNGU2bDQ2YjhlODVjM2U2MjJlNGVhMGVhOTBlNzgwZjE3NDA5OWdjM2FjY2IxNGVhY2Y2N2I4fXs0NTUzNzhhMQ%3D%3D 看到后面%,疑似url编码 ZmQ2NjMyNGU2bDQ2YjhlODVjM2U2MjJlNGVhMGVhOTBlNzgwZjE3NDA5OWdjM2FjY2IxNGVhY2Y2N2I4fXs0NTUzNzhhMQ== 看到==,...
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 = (8*(N+3)-x-y)/(2*(N+3)*(4-x)) c = ...
knapack问题
一、总论背包密码,利用的是子集和问题的困难性 给定一个正整数集合 以及整数 求子集的和使得 显然直接求解的时间复杂度是 即使使用MIMT攻击,也只能降到 这道题中n=160,无法求解 但如果定义在超级递增序列上,也就是满足 的序列,那么有 左边是一个跌进,求和得到 于是有 那这个性质就可以帮助解决背包问题了 如果 说明里肯定有否则前面的和肯定小于然后扣掉,继续往下 小于自然就是没有了 算法(贪心算法) 1234for i in range(n, 0, -1): if S >= r[i]: S -= r[i] print(r[i]) 但显然,问题不会这么简单的,我们可能得到的是混淆版本的背包问题,这就需要用到格了 二、Merkle–Hellman加密私钥就是前面提到的超递增序列 但是为了看起来不那么明显,我们需要进行混淆 我们考虑生成一个模数m,满足 然后一个与m互质的乘数w,那么 这就实现了加密 公钥是构成的背包B以及m 假设Bob要加密x,那么 那其实我们只要知道w的逆元自然就破解了 注意到m显然大于所有之和,所以直...
webnote
为了校赛CTF,学习一下web 一、基础知识+黑话解释基础知识: 前端和后端通过协议来进行交流,而后端连接着数据库 后端就是部署在服务器上面的一个程序 什么是数据库?存放数据的地方 什么是协议?规定好的通讯交流方式 URL 统一资源定位符,唯一定位网站的标识符 MAC地址 介质访问控制符 Media Access Control,可以理解为硬件的地址 路由器可以将某个端口映射到内网的端口 域名域名是用于标识互联网上计算机或服务的字符型名称,例如example.com。它通过DNS(域名系统)解析为IP地址,使用户无需记忆复杂的数字地址即可访问网站。域名的核心作用是提供品牌识别和易于记忆的访问入口。 URLURL是完整的资源定位符,包含访问资源所需的所有信息,例如协议类型(如HTTP/HTTPS)、域名、端口号、路径及查询参数。例如:https://www.example.com/path/page.html?id=123。URL的目的是精确指向互联网上的某个具体资源,如网页、图片或API接口。域名是URL的子集 DNS服务器可以把域名解析成IP image-202504121...