RSA选择密文攻击
RSA parity oracle
一、举例
即RSA奇偶性预言(oracle意为神谕)
这说的是,服务器可以解密任何密文,并至少返回密文的最低位(判断奇偶性),除了某个不可知的密文
那我们可以通过构造密文,进行二分查找,只需要次搜索就能恢复密文
假设 我们构造 那么有
我们把这个发给服务器,服务器就会返回解密结果,注意到2m一定是偶数
且由于 那么有两种情况 为奇数,那么这就说明,即
为偶数,这说明
那么有这两种情况这两种情况分别得到范围 ,, 无论哪种情况都可以把m的范围缩小一半,然后我们继续操作 这时候我们发现没有那么显然了,有2种情况, 前者的话,注意这里要-3N,因为必须要减去奇数个N,而1个N不够
为奇数,那么这就说明,即
为偶数,这说明
分别把范围缩小到 , 我们发现有一个情况直接出了m=N//2
即使其他情况,每次构造都能使得范围变为原来的1/2,这就是经典的二分搜索
那么时间复杂度是
二、数学归纳法
使用数学归纳法进行证明每次都能缩短1/2的区间
n=1的时候是显然的
假设第i次发送,那么有 且 于是有 ...
无标题
CSP研究综述
image-20250901214517993
着重听了Feng Hao教授的课程,Chenglu
Jin教授的有点偏硬件,没怎么听懂
由于我平常会做一些ctf中crypto的问题,所以研究比较偏向于“实现”
了解的比较多的会详细,了解的比较少的就略过了
4种普遍的攻击方式
1.Ciphertext-only attack
2.Known-plaintext attack
3.Chosen-plaintext attack
4.Chosen-ciphertext attack
1.古典密码
1.凯撒密码
加解密使用同一个算法,加密是确定性的,同一个明文用相同的密钥加密完后得到的密文是相同的
\[
E(m) = m + k \mod 26 \\
D(c) = c - k \mod 26
\]
那就可以使用词频攻击,不过凯撒密码的密钥空间非常小,也就是26,通常直接遍历密钥,寻找有意义的明文字符串就行
Python实现
1234567891011121314151617181920import randomdef...
新生赛wp
1.ezfactor
N为1024bit,几乎不可能直接分解,一定有其他信息泄露或者参数生成不当
1q = next_prime(p)
注意到q是p的下一个素数,所以q十分接近p
根据这个有很多思路,
解法1.直接枚举素数
我们发现q>p
那么 \[
p^2 < N <q^2 \\
p < \sqrt{N} < q
\]
p,q既然是相邻素数,那么,中间隔得数应该是比较少的,于是我们直接枚举\(\sqrt{N}\)之后的素数就行了
exp:
123456789101112131415from Crypto.Util.number import *import...
Lilctf2025
Crypto
1.ez_math
12345678910111213141516171819202122from sage.all import *from Crypto.Util.number import *flag = b'LILCTF{test_flag}'[7:-1]lambda1 = bytes_to_long(flag[:len(flag)//2])lambda2 = bytes_to_long(flag[len(flag)//2:])p = getPrime(512)def mul(vector, c): return [vector[0]*c, vector[1]*c]v1 = [getPrime(128), getPrime(128)]v2 = [getPrime(128), getPrime(128)]A = matrix(GF(p), [v1, v2])B = matrix(GF(p), [mul(v1,lambda1), mul(v2,lambda2)])C = A.inverse() *...
无标题
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 \[
seed = a\cdot seed + b \pmod{m}
\] 接着循环了5次,产生了5次种子
换而言之,我们需要利用这5个种子,求出一开始的种子
不妨设,一开始的seed为x1,然后我们写成数列的形式 \[
已知x_2,x_3,...x_{5},x_{n+1}=ax_n+b\mod m,求x_1
\] 接着来看算法的关键
\[
x_{n+1}=ax_n + b \mod m
\]
这里面a,b,m都是未知的,b好处理,因为在常数的位置,两个式子相减就能消掉
考虑
\[
x_{n+2}-x_{n+1}=a(x_{n+1}-x_{n}) \mod...
无标题
SQL注入
在ctf中,我们通常通过get请求和post请求,提交参数,然后服务器后端拼接sql代码,进行查询数据
1$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
比如说这里就是通过get请求提交username
我们后面都以这个为例
1$sql = "SELECT * FROM users WHERE id = $id";
根据sql语句的不同,可以分为字符型和数字型
数字型
1$sql = "SELECT * FROM users WHERE id = $id";
这种就是数字型
我们可以在后面加引号来测试
然后看爆错信息
字符型
1$sql = "SELECT * FROM users WHERE id = '$id'";
You have an error in your SQL...
SWPU-NSSCTF2025
2025 SWPU-NSSCTF
秋季招新入门训练赛
Crypto
1.拟态签到题
ZmxhZ3tHYXFZN0t0RXRyVklYMVE1b1A1aUVCUkNZWEVBeThyVH0=
base64没什么好说的
flag{GaqY7KtEtrVIX1Q5oP5iEBRCYXEAy8rT}
2.base??
dict:{0: 'J', 1: 'K', 2: 'L', 3: 'M', 4: 'N', 5: 'O', 6: 'x', 7: 'y',
8: 'U', 9: 'V', 10: 'z', 11: 'A', 12: 'B', 13: 'C', 14: 'D', 15: 'E',
16: 'F', 17: 'G', 18: 'H', 19: '7', 20: '8', 21: '9', 22: 'P', 23: 'Q',
24: 'I', 25: 'a', 26: 'b', 27: 'c', 28: 'd', 29: 'e', 30: 'f', 31: 'g',
32: 'h', 33: 'i', 34: 'j', 35: 'k', 36: 'l',...
无标题
LWE学习
1.Background
二十年来,格约化算法在破解密码系统方面的成功,确立了格约化作为公钥密码分析中最流行工具的地位。事实上,格在密码学中的应用长期以来主要是“负面的”。有趣的是,在许多实验中,LLL
及其他格约化算法的实际表现远好于最坏情况分析所保证的效果,这导致人们普遍认为“格约化在实践中是容易的”。
然而,对于 带噪声学习问题(Learning With Errors,
LWE),格约化算法的能力是有限的。当格的维度或误差足够大,或者给出的基被人为放大/混淆时,基约化将无法再找到格中的最短向量。这正是
LWE 被认为是一个“困难”问题、适合作为密码学基础的直观原因。
好的,我来翻译成中文(保持学术化、流畅的表述):
2.Introduction
带噪声学习问题(Learning With Errors, LWE)
指的是这样一个计算问题:我们希望学习一个定义在某个环上的线性函数 \(f(A)\),但是只能获得该函数的带噪声样本。这些样本通常形如:
\((A,\;\langle A, S \rangle...
LWE学习
LWE学习
1.Background
二十年来,格约化算法在破解密码系统方面的成功,确立了格约化作为公钥密码分析中最流行工具的地位。事实上,格在密码学中的应用长期以来主要是“负面的”。有趣的是,在许多实验中,LLL
及其他格约化算法的实际表现远好于最坏情况分析所保证的效果,这导致人们普遍认为“格约化在实践中是容易的”。
然而,对于 带噪声学习问题(Learning With Errors,
LWE),格约化算法的能力是有限的。当格的维度或误差足够大,或者给出的基被人为放大/混淆时,基约化将无法再找到格中的最短向量。这正是
LWE 被认为是一个“困难”问题、适合作为密码学基础的直观原因。
好的,我来翻译成中文(保持学术化、流畅的表述):
2.Introduction
带噪声学习问题(Learning With Errors, LWE)
指的是这样一个计算问题:我们希望学习一个定义在某个环上的线性函数 ,但是只能获得该函数的带噪声样本。这些样本通常形如:
其中:
是定义该线性函数的秘密元素;
是从某个已知分布中抽取的小噪声项;
...