文章目录
基础知识
CBC翻转攻击
简介:
当我们的一个值C是由A和B异或得到
C = A XOR B
那么
A XOR B XOR C很明显是=0的
当我们知道B和C之后,想要得到A的值也很容易
A = B XOR C
因此,A XOR B XOR C等于0。有了这个公式,我们可以在XOR运算的末尾处设置我们自己的值,即可改变。
CBC-AES:Encrypt(明文^IV)
例如,已知CBC第一块(16位)
- 明文
- 密文
想直接修改第11位字符 0
->1
已知第11位字符为
1
,我们可以直接将加密后的
密文[10]=密文[10] xor ‘0’ xor ‘1’
即可修改
BASE64基本加密原理
A=>QQ==
a=>YQ==
97=110 0001=>右移2位 成6位=>1 1000==>查表(24)Y
上一个剩余的01二进制右移四位 010000=>查表(16)Q
填充(= =)
结果YQ==
- 在BASE64中,通常是以3个字符(ASCII)开始编码为一组
- 在转换为2进制中,又会以6位二进制分组(即一组:4*6=24)
- 在空数据,以
=
作为填充字符
a | |||
---|---|---|---|
1 1000 | 010000 | ||
Y | Q | = | = |
SpecialLCG
分析
MSSCTF 2021 初赛题学习
笔记
from Crypto.Util.number.inverse = gmpy2.invert 求逆元
bin(数值),可求出数值的二进制
- 不要想着现学现用,长期来看,慢慢去理解 不执著
EXP
from Crypto.Util.number import *
n=18253588106473969889
data=[8331802587873314500,16970700310063771377,16378474859328460142,13073117282614811463,747433301416436433]
t=[]
for i in range(4):
t.append(data[i+1]-data[i])
a1=(t[2]*inverse(t[0],n)-t[3]*inverse(t[1],n))*inverse((t[1]*inverse(t[0],n)-t[2]*inverse(t[1],n)),n)%n
b1=(t[3]-a1*t[2])*inverse(t[1],n)%n
c1=(data[2]-data[1]*a1-data[0]*b1)%n
print(long_to_bytes(a1)+long_to_bytes(b1)+long_to_bytes(c1))
babyLCG
分析
a、b、m已知,求seed就可解出LCG
线性递归表达式:
self._state = (self._key['a'] * self._state + self._key['b']) % self._key['m']
143893630627599013207723094044959571968=
(107763262682494809191803026213015101802*x1+153582801876235638173762045261195852087)%226649634126248141841388712969771891297
跟题目去理解(LCG算法==>欧几里得拓展算法)
https://blog.csdn.net/superprintf/article/details/108964563
根据公式,还原seed(求出a,n的逆元,再套公式算seed)
还原seed的公式:seed = (ani*(seed-b))%n
a=107763262682494809191803026213015101802
n=226649634126248141841388712969771891297
b = 153582801876235638173762045261195852087
c =