Oracle在密码学里通常指一个能提供特定信息的黑盒系统
而ECB这一工作模式最大的不安全性来自于这一特性——相同的明文块能够产生相同的密文块
当ECB遇到了Oracle,我们就能够通过爆破,逐步的获取每一位明文的信息。具体解题步骤如下:
分析题目代码
加密程序很简单明了,将plaintext与FLAG拼接在一起,然后进行ECB加密
这里plaintext是我们自己输入的,FLAG是固定的。
从这一点至少可以分析出,我们尝试不同长度的plaintext根据ECB加密生成的密文长度,来判断flag的长度
发现输入plaintext长度为1~6字节时,加密结果为32字节
输入plaintext长度为7字节时,加密结果为48字节
由此可知:
12len(FLAG)+6 = 32len(FLAG) = 26
真的是这样吗?
翻车记录:翻车记录之pad填充 | AiY0u的博客
所以其实我们还要再减去1,真实的FLAG长度为25
我们已知了FLAG的开头为crypto{,结尾为}
那么需要爆破16个字符,直接爆破计算量是很大的
我们需要利用开头所说的ECB的安全问题,假设我们输入的plaint ...
工作模式(Mode of Operation)的概念
在密码学中,工作模式(Mode of Operation) 是指块加密算法(如 AES、DES 等)处理任意长度明文的一套规则和流程。
块加密算法本身只能加密固定长度的明文块(例如 AES 处理 128 位块,DES 处理 64 位块),而实际需要加密的数据(如文件、消息)往往是任意长度的。工作模式的作用就是定义如何将这些 “固定长度块加密” 的基本操作扩展到 “任意长度数据加密”,同时解决安全性、效率、完整性等问题。
ECB**(Electronic Codebook)**:电子密码本模式
ECB是一种安全性不高的工作模式,仅适用于教学场合
它的加密流程为
也就是说把明文拆分成若干个明文块,再用相同的key对每个明文块执行块加密算法
显然,使用相同的密钥就代表着,如果拆出了两个相同的明文块,那么这两个明文块对应的密文块是完全相等的,攻击者可通过分析密文结构推断明文规律。
ECB加密ctf例题
Cryptohack ECB-Oracle | AiY0u的博客
CBC**(Cipher Block Chaining)**:密码分组链接 ...
a
a
抽象代数(近世代数)中存在群、环、域的概念。在各种算法或者题解中可能涉及这些基础概念。
群(Group)
群的概念
设非空集合G,并且在G上存在一种二元计算,把运算符号记为**“∙”**
如果该计算满足下列性质,我们就认为**(G,∙)**是一个群
结合律:(a∙b)∙c = a∙(b∙c)
单位元:存在e∈G,使得a∙e = e∙a = a,把e称为G的单位元,或者称为幺元
逆元:对于所有的a∈G,都有对应的b∈G,使得a∙b = b∙a = e,把b称为a的逆元
封闭性:a∈G,b∈G,那么二元运算a∙b∈G
由这几条性质我们可以找到很多群的例子
比如在所有整数构成的集合Z上做加法、乘法
也可以是集合{0,1,2,3}上定义二元运算为模4加法
更多更多的群
条件更严格的
Abel群(交换群)
如果一个群还满足交换律:对于所有的a∈G,的b∈G,都有a∙b = b∙a,那么这个群是一个Abel群或交换群
条件更宽泛的
半群:只要求结合律
幺半群:只要求结合律和单位元
环(Ring)
环的概念
环是群的plus版,环要求在一个非空集合R上定义两种运算," + &q ...
a
a
抽象代数(近世代数)中存在群、环、域的概念。在各种算法或者题解中可能涉及这些基础概念。
群(Group)
群的概念
设非空集合G,并且在G上存在一种二元计算,把运算符号记为**“∙”**
如果该计算满足下列性质,我们就认为**(G,∙)**是一个群
结合律:(a∙b)∙c = a∙(b∙c)
单位元:存在e∈G,使得a∙e = e∙a = a,把e称为G的单位元,或者称为幺元
逆元:对于所有的a∈G,都有对应的b∈G,使得a∙b = b∙a = e,把b称为a的逆元
封闭性:a∈G,b∈G,那么二元运算a∙b∈G
由这几条性质我们可以找到很多群的例子
比如在所有整数构成的集合Z上做加法、乘法
也可以是集合{0,1,2,3}上定义二元运算为模4加法
更多更多的群
条件更严格的
Abel群(交换群)
如果一个群还满足交换律:对于所有的a∈G,的b∈G,都有a∙b = b∙a,那么这个群是一个Abel群或交换群
条件更宽泛的
半群:只要求结合律
幺半群:只要求结合律和单位元
环(Ring)
环的概念
环是群的plus版,环要求在一个非空集合R上定义两种运算," + &q ...
AES中列混淆的矩阵乘法是在有限域GF(2⁸)上进行的
要学会计算它,需要从域开始了解
一、域(Field)
设 F 是一个非空集合,若在 F 上定义了两种二元运算:加法(记作 +)和乘法(记作 × 或省略),且满足以下条件,则称 F 为一个域:
1. 加法结构
封闭性:对任意 a,b∈F,有 a+b∈F。
结合律:对任意 a,b,c∈F,有 (a+b)+c=a+(b+c)。
交换律:对任意 a,b∈F,有 a+b=b+a。
单位元:存在元素 0∈F,使得对任意 a∈F,有 a+0=a。
逆元:对任意 a∈F,存在元素 −a∈F,使得 a+(−a)=0。
2. 乘法结构
封闭性:对任意 a,b∈F,有 a×b∈F。
结合律:对任意 a,b,c∈F,有 (a×b)×c=a×(b×c)。
交换律:对任意 a,b∈F,有 a×b=b×a。
单位元:存在元素 1∈F(1≠0),使得对任意 a∈F,有 a×1=a。
逆元:对任意非零元素 a∈F,存在元素 a⁻¹∈F,使得 a×a⁻¹=1。
值得注意的是,域并没有对乘法结构要求“零因子”,即没有要求存在元素 0∈F,使得对任意 a∈F,有 ...
在学习AES的时候,遇到了两个不太理解的名词:扩散(Diffusion)、混淆(Confusion)
浅显的学习了一番之后,大概能给出以下解释:
扩散(Diffusion) 和混淆(Confusion) 是香农(Claude Shannon)于 1949 年提出的两大核心设计原则,是确保加密算法安全性的基础。二者通过不同的机制对抗攻击者的统计分析和数学推导,共同实现 “明文、密钥与密文之间的关联性被隐藏” 的目标。
也就是说我们不希望攻击者通过观察密文就能够反推出明文和密钥的信息,需要一定的手段淡化规律。
扩散
扩散是指通过变换操作,将明文或密钥中单个比特的变化尽可能扩散到密文的多个比特上,使密文的每一个比特都依赖于明文和密钥的多个比特。
扩散常常通过线性变换来实现,例如AES中的行移位和列混合
在进行行移位之后,让每列的元素掺杂起来
列混合进行矩阵乘法得到的结果又与每列的四个元素都相关
这样通过这两步操作,变动明文中的每个元素都会对最终结果产生巨大的影响
从这个例子可以看出扩散的作用,简单来说就是使得局部可以影响整体
混淆
定义:混淆是指通过变换操作,使密文与密钥之间的关系变得复杂且 ...
AES简单介绍
常见密码算法我们将其分为三类:
对称密码算法(Symmetric-key Algorithm)
非对称密码算法(Asymmetric-key Algorithm)
摘要算法(Digest Algorithm)
对称密码算法是指加密秘钥和解密秘钥相同的密码算法
而对称密码又分为分组密码算法和流密码算法
进入正题:
AES全称为Advanced Encryption Standard(高级加密标准),属于对称密码算法中的分组密码算法
分组密码大体上是先将明文分成若干个明文块,再对每个明文块用相同的密钥和算法进行加密,最后将加密后的密文块拼接在一起。
AES是目前安全强度最高且广泛应用的分组密码。
常见的AES-128处理128比特的块,使用的是128比特的密钥。该密码在实际上想要破解是不可行的,目前公开的任何攻击方法也只是理论上可行。
AES-128加密流程
可以点击这里查看大佬做的动画解析
我们先准备一个s-box
我们后续会需要用到
一、密钥拓展
我们最初应当由128位初始密钥,形成一个 4×4 字节矩阵(16 字节)
W₀
W₁
W₂
W₃
W₄
W₅
W ...
本题附件给出了几个大数字,并在题干给出了这几个数字的运算关系
要求最终提交crypto{p,q}
我们先检查一下给出的数字,除了N以外全部是素数
根据大标题Modular Binomials(模二项式),我们第一步先把c1和c2的二项式拆开。
由于对N=p*q取模,拆分而来的二项式除了首项和尾项都同时含有p和q的幂,因此化简得到
我们让(1)式做e2次幂,让(2)式做e1次幂。再配一下系数,相减,很容易消去p
根据上图分析,我们在敲代码时只需要写出d的表达式,即
再与N求最大公约数即可
实现代码如下:
123456789101112from math import gcdN = 149055622578427140579327241295750028254053935026508697671159426064086003433803278662589824024479925649884665883051742716746578443524545439588475681903724467235496277522744427891842364907682723131874100771 ...
勒让德符号(Legendre Symbol)提供了一种有效的方法来确定整数a是否是模奇数素数p的二次余数
以Cryptohack中Adrien’s Signs一题为例
下载附件得到加密程序和输出结果两块内容
加密程序:
输出内容为列表形式
首先分析加密原理,它把原flag中的每个字符转化为8位二进制字符串(去掉0b之后左端补0)
然后对每一个1或者0,使用随机生成的整数e加密为n或者p-n(简单的数学推导)
也就是说输出列表中,每8个数代表1个字符,共有224个数,也就是说flag应当是28个字符组成
对p使用sympy库中的isprime函数做判断,发现它是素数,同时也是奇数。根据cryptohack本章的内容,想到判断a是否是p的二次剩余。
发现输出结果为1,a是模p的二次剩余
那么由规律:二次剩余*二次剩余 = 二次剩余
可知aᵉ = e个a相乘,也为模p的二次剩余
假设output列表里面,b=1生成的数字为c,那么c = aᵉ mod p,可写为 c ≡ aᵉ mod p,c是p的二次剩余
而b=0生成数字为p-c,不应当是p的二次剩余
也就是说我们对output列表中的 ...

