CTF-Crypto

 

 

 

 

MD5

Message Digest Algorithm 5,中文名为消息摘要算法第五版,是计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。

MD5作为一种常用的摘要算法(或指纹算法),其具有以下几个重要的特点:

输入任意长度信息,输出长度固定:MD5 可输入任意长度的信息,其输出均为128位(bit)固定长度的二进制数据。

运算速度快:MD5的运算均为32位 与、或、非、位移等位运算,因此其运算速率快,几乎不消耗CPU时间。

不可逆:根据MD5的的散列结果,无法计算出原始数据(查字典除外)。

碰撞性:原始数据与其MD5散列结果并非一一对应,存在多个原始数据的MD5结果相同的可能性。

因此,MD5 不再被认为是安全的哈希算法,不适合用于加密或保护通信。

例1:解密e00cf25ad42683b3df678c61f42c6bda

这里推荐使用在线网站或者工具进行解密,得到结果admin1

例2:

其实这个脚本没什么太大的问题,只是在哈希之前没做UTF8编码会导致报错,我用的是python3所以print格式也要改一下。运行后得到结果e9032994dabac08080091151380478a2

 

BASE家族

base64、base32、base16可以分别编码转化8位字节为6位、5位、4位。16,32,64分别表示用多少个字符来编码

Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。包括MIME的email,email via MIME,在XML中存储复杂数据

编码原理:Base64编码要求把3个8位字节转化为4个6位的字节,之后在6位的前面补两个0,形成8位一个字节的形式,6位2进制能表示的最大数是2的6次方是64,这也是为什么是64个字符(A-Z,a-z,0-9,+和/这64个编码字符,=号不属于编码字符,而是填充字符)的原因,这样就需要一张映射表,如下:

例:解密ZmxhZ3tUSEVfRkxBR19PRl9USElTX1NUUklOR30=

通过上述方法解得flag

flag{THE_FLAG_OF_THIS_STRING}

 

url编码

url编码又叫百分号编码,是统一资源定位(URL)编码方式。URL地址(常说网址)规定了常用地数字,字母可以直接使用,另外一批作为特殊用户字符也可以直接用(/,:@等),剩下的其它所有字符必须通过%xx编码处理。 现在已经成为一种规范了,基本所有程序语言都有这种编码

url编码表

例:解密%66%6c%61%67%7b%61%6e%64%20%31%3d%31%7d

通过上表可以得到flag{and 1=1}

 

凯撒密码

将明文中的 每个字母 都按照其在字母表中的顺序向后(或向前)移动固定数目(循环移动)作为密文

例:解密synt{5pq1004q-86n5-46q8-o720-oro5on0417r1}

我们可以发现跟flag形式有点类似,此时我们可以将s向后移动13位得到f,后面的字母如此类推,经过大量的手算果然得到flag{5cd1004d-86a5-46d8-b720-beb5ba0417e1}

 

根据姓名和生日构造密码

例:

姓名:张三

生日:19900315

key格式为key{xxxxxxxxxx}

根据姓名和生日构造密码,从key的格式可以知道密码的长度为10位,生日19900315加上张三拼音的缩写zs刚好10位,尝试不同的大小写和排列组合得到flag为flag{zs19900315}

 

变异凯撒

例:解密afZ_r9VYfScOeO_UL^RWUc

寻找明文和密文的规律:

明文flag对应afZ_

f-102 a-97 相差5

l-108 f-102 相差6

a-97 Z-90 相差7

g-103 _-95 相差8

可以看出每个字符的偏移量为n+4

依次算出各密文字符对应的明文字符求得明文为

Caesar_variation

 

故最后结果为

flag{Caesar_variation}

 

Quoted-printable编码

何一个8位的字节值可编码为3个字符:一个等号”=”后跟随两个十六进制数字(0–9或A–F)表示该字节的数值.例如,ASCII码换页符(十进制值为12)可以表示为”=0C”, 等号”=”(十进制值为61)必须表示为”=3D”. 除了可打印ASCII字符与换行符以外,所有字符必须表示为这种格式.

所有可打印ASCII字符(十进制值的范围为33到126)可用ASCII字符编码来直接表示, 但是等号”=”(十进制值为61)不可以这样直接表示.ASCII的水平制表符(tab)与空格符, 十进制为9和32, 如果不出现在行尾则可以用其ASCII字符编码直接表示。如果这两个字符出现在行尾,必须QP编码表示为”=09″ (tab)或”=20″ (space).网址:yii666.com

如果数据中包含有意义的行结束标志,必须转换为ASCII回车(CR)换行(LF)序列,既不能用原来的ASCII字符也不能用QP编码的”=”转义字符序列。 相反,如果字节值13与10有其它的不是行结束的含义,它们必须QP编码为=0D与=0A.

quoted-printable编码的数据的每行长度不能超过76个字符. 为满足此要求又不改变被编码文本,在QP编码结果的每行末尾加上软换行(soft line break). 即在每行末尾加上一个”=”, 但并不会出现在解码得到的文本中

例:解密=E9=82=A3=E4=BD=A0=E4=B9=9F=E5=BE=88=E6=A3=92=E5=93=A6

通过上述方法,解密得到flag{那你也很棒哦}

 

rabbit编码

Rabbit加密算法是一个可逆加密算法,是一个高性能的流密码加密方式,Rabbit算法属于对称加密算法。

Rabbit算法原理:Rabbit使用一个128位密钥和一个64位初始化向量。该加密算法的核心组件是一个位流生成器,该流生成器每次迭代都会加密128个消息位

Rabbit算法安全性:

Rabbit声称128位安全,以防止攻击者的目标是一个特定的密钥。然而,如果攻击者同时以大量的密钥为目标,并且并不真正关心他破解的是哪一个,那么小的IV大小就会导致96位的安全级别降低。这是由于通用的TMD权衡攻击造成的

Rabbit的输出存在一个小的偏差,但是经研究发现暂时不会对Rabbit的安全构成威胁

例:解密U2FsdGVkX1/+ydnDPowGbjjJXhZxm2MP2AgI

直接使用解密工具得到flag{Cute_Rabbit}

 

栅栏加密

把要加密的明文分成N个一组,然后把每组的第1个字符组合,每组第2个字符组合...每组的第N(最后一个分组可能不足N个)个字符组合,最后把他们全部连接起来就是密文

例:解密felhaagv{ewtehtehfilnakgw}

当栏位为13时,可以得到flag{wethinkwehavetheflag}

 

非对称算法加密RSA

RSA算法由两个密钥,即公钥和私钥组成,如果没有 RSA 算法,现在的网络世界毫无安全可言,也不可能有现在的网上交易。众所周知的 ssh 协议也是基于 RSA 加密算法才能确保通讯是加密的

1976年以前,所有的加密方法都使用对称加密算法:加密和解密使用同一套规则。例如:甲使用密钥 A 加密,将密文传递给乙,乙仍使用密钥 A 解密。如果密钥 A 在甲传递给乙的过程中泄露,或者根据已知的几次密文和明文推导出密钥 A,则甲乙之间的通讯将毫无秘密

甲使用公钥 A 加密,将密文传递给乙,乙使用私钥 B 解密得到明文。其中公钥在网络上传递,私钥只有乙自己拥有,不在网络上传递,这样即使知道了公钥 A 也无法解密。反过来通讯也一样。只要私钥不泄漏,通信就是安全的,这就是非对称加密算法。

加密

密文 = 明文 E mod N

公钥(E,N)

解密

明文 = 密文 D mod N

私钥(D,N)

密钥对的生成过程

你可能想知道,公钥(n,e) = (4757 , 101) 和私钥(n,d) = (4757 ,1601) 是怎么生成的,且看下面的步骤。

1、随机找两个质数 P 和 Q ,P 与 Q 越大,越安全

比如 P = 67 ,Q = 71。计算他们的乘积 n = P * Q = 4757 ,转化为二进为 1001010010101,该加密算法即为 13 位,实际使用中的算法是往往是 1024 位 或 2048 位,位数越长,算法越难被破解。

2、计算 n 的欧拉函数 φ(n) (注:互质是公约数只有1的两个整数,叫做互质整数)

φ(n) 表示在小于等于 n 的正整数之中,与 n 构成互质关系的数的个数。例如:在 1 到 8 之中,与 8 形成互质关系的是 1、3、5、7,所以 φ(n) = 4。 如果 n = P * Q,P 与 Q 均为质数,则

φ(n) = φ(P * Q)= φ(P - 1)φ(Q - 1)

例:

在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17

求解出d作为flag提交

(1)求n

473398607161* 4511491=2135733555619387051(两个大质数)

(2)求m

φ (473398607160,4511490)=2135733082216268400

(3)求e

1<e<m gcd(e,m)=1 e,m互质(e和m的最大公约数为1) 取e=17

(4)求d

1<d<m e*d%m= 1 得到 ed-my=1 取y=193

那公钥(n,e)=(2135733555619387051,17) 私钥(n,d)=(2135733555619387051,125631357777427553)

得到d为flag{125631357777427553}

编写人:Kevin
2023.9.26