NSSCTF 流密码工坊

LCG 流密码介绍 [公式] LCG代码实现 Python 实现 1 2 3 4 5 6 7 8 9 10 class LCG: def __init__(self, seed, a, b, m): self.seed = seed # 初始种子 self.a = a # 乘数 self.b = b # 增量 self.m = m # 模数 def generate(self): self.seed = (self.a * self.seed + self.b) % self.m return self.seed 题面 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 from Crypto.Util.number import * flag = b'NSSCTF{******}' class LCG: def __init__(self, seed, a, b, m): self.seed = seed # 初始种子 self.a = a # 乘数 self.b = b # 增量 self.m = m # 模数 def generate(self): self.seed = (self.a * self.seed + self.b) % self.m return self.seed lcg = LCG(bytes_to_long(flag), getPrime(256), getPrime(256), getPrime(256)) for i in range(getPrime(16)): lcg.generate() print(f'a = {lcg.a}') print(f'b = {lcg.b}') print(f'm = {lcg.m}') print(lcg.generate()) ''' a = 113439939100914101419354202285461590291215238896870692949311811932229780896397 b = 72690056717043801599061138120661051737492950240498432137862769084012701248181 m = 72097313349570386649549374079845053721904511050364850556329251464748004927777 9772191239287471628073298955242262680551177666345371468122081567252276480156 ''' 本题给出了LCG的各个参数,然后给出了一次密文,而初始种子便是我们的flag 现在我们拥有 $X_{n+1}$ , $a$ , $b$ , $m$ , 我们进行如下操作 对第一个式子(LCG递推式) [公式] 进行移项后如下 [公式] 这样我们便得到了一个从下一项逆向递推上一项的式子。 那么在题目中我们要逆向多少项呢?我们并不知道,因为中间迭代的次数是一个随机数,但是我们不用关心,因为我们知道flag的格式,所以只需要不断的逆向,直到找到符合格式的flag为止。 exp 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 from Crypto.Util.number import * a = 113439939100914101419354202285461590291215238896870692949311811932229780896397 b = 72690056717043801599061138120661051737492950240498432137862769084012701248181 m = 72097313349570386649549374079845053721904511050364850556329251464748004927777 x = 9772191239287471628073298955242262680551177666345371468122081567252276480156 inva = inverse(a, m) for i in range(2**16): x = (x-b)*inva % m flag = long_to_bytes(x) if b'NSSCTF' in flag: print(flag) 从这里也可以看出,一旦LCG的参数遭到了泄露,我们便可以向前恢复或者向后预测出其他的随机数(或者专业点叫做流密钥)。
Read more

LitCTF2023

小小小 Background 源码星球上有一种有趣的游戏「小,小小小」。 / Description 给你 $n$ 张卡片,第 $i$ 张卡片上写着 $a_i$。 / 定义一个包含 $n$ 张卡片的卡片组分值为: / [公式] 其中 $a_{n+1} = a_1$。
Read more

CryptoHack Wp

1.2 XOR 挑战 1.2.4 XOR -> You either know, XOR you don’t 发现之前做了点了 隐藏一下已经解决的 1 2 3 4 5 6 7 8 9 10 from pwn import xor from Crypto.Util.number import long_to_bytes as l2b c = "0e0b213f26041e480b26217f27342e175d0e070a3c5b103e2526217f27342e175d0e077e263451150104" c = l2b(int(c, 16)) # hex to int to bytes # 已知flag 前几位为crypto{ 于是与这几位结果对应密文xor即可得出key flag_begin_format = b"crypto{" flag_end_format = b"}" key = xor(c[:7], flag_begin_format) + xor(c[-1:], flag_end_format) print(xor(c, key))
Read more

侧信道和嵌入式访问控制

侧信道 / flag{The_rotten_measurement_channel}

RSA中的个人奇思妙想

公钥加密就私钥解密 私钥加密就公钥解密
Read more

证书链

证书链是一系列数字证书的集合,用于验证和建立信任关系。在公钥基础设施(PKI)中,证书链用于验证服务器证书的有效性和可信任性。 证书链由多个证书组成,每个证书都被签发者(颁发者)签名。链的顶部是服务器证书,也称为终端证书或服务器端证书。该证书包含了公钥和与之相关的信息,如域名、组织名称等。 证书链的底部是根证书,也称为根CA证书或根证书颁发机构(Root CA)。根证书是最高级别的信任锚点,它的公钥用于验证链中的其他证书。 中间证书也被包含在证书链中,它们是由根证书颁发机构签发的,并用于连接终端证书和根证书。中间证书的作用是构建信任链,确保终端证书的有效性。 验证证书链的过程是逐级验证每个证书的签名,直到达到根证书。如果每个证书的签名都有效,并且根证书是受信任的,那么整个证书链就被视为有效和可信任的。 通过验证证书链,客户端可以确保与服务器之间的通信是安全的,并且可以信任服务器的身份。这对于建立安全的网络连接和进行加密通信至关重要,尤其在涉及敏感信息的场景下,如在线银行、电子商务等。
Read more

Diffie-Hellman

CMU 18-631 S23 U2L2 感谢:Generate
Read more

VNctf2023 Crypto方向赛题复现

挖一个坑

Coppersmith -- 相关消息攻击

NUS_CS2107-CTF 感谢:hash_hash
Read more

LLL格基约化算法

LLL (Lenstra–Lenstra–Lovász) 算法是一种用于将给定的格基 (lattice basis) 转换为更为紧凑的格基的算法。格基是在一个向量空间内的整数线性组合中生成整个格子的向量集合。
Read more