常见加密算法和编码识别

前言

在对数据进行变换的过程中,除了简单的字节操作之外,还会使用一些常用的编码加密算法,因此如果能够快速识别出对应的编码或者加密算法,就能更快的分析出整个完整的算法。CTF 逆向中通常出现的加密算法包括base64、TEA、AES、RC4、MD5等。

Base64

Base64 是一种基于64个可打印字符来表示二进制数据的表示方法。转换的时候,将3字节的数据,先后放入一个24位的缓冲区中,先来的字节占高位。数据不足3字节的话,于缓冲器中剩下的比特用0补足。每次取出6比特(因为 {\displaystyle 2^{6}=64}),按照其值选择ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ 中的字符作为编码后的输出,直到全部输入数据转换完成。

通常而言 Base64 的识别特征为索引表,当我们能找到 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ 这样索引表,再经过简单的分析基本就能判定是 Base64 编码。

当然,有些题目 base64 的索引表是会变的,一些变种的 base64 主要 就是修改了这个索引表。

Tea

密码学arrow-up-right中,微型加密算法(Tiny Encryption Algorithm,TEA)是一种易于描述和执行arrow-up-right块密码arrow-up-right,通常只需要很少的代码就可实现。其设计者是剑桥大学计算机实验室arrow-up-right大卫·惠勒arrow-up-right罗杰·尼达姆arrow-up-right

参考代码:

在 Tea 算法中其最主要的识别特征就是 拥有一个 magic number :0x9e3779b9 。当然,这 Tea 算法也有魔改的,感兴趣的可以看 2018 0ctf Quals milk-tea。

RC4

密码学arrow-up-right中,RC4(来自Rivest Cipher 4的缩写)是一种流加密arrow-up-right算法,密钥arrow-up-right长度可变。它加解密使用相同的密钥,因此也属于对称加密算法arrow-up-right。RC4是有线等效加密arrow-up-right(WEP)中采用的加密算法,也曾经是TLSarrow-up-right可采用的算法之一。

通过分析初始化代码,可以看出初始化代码中,对字符数组s进行了初始化赋值,且赋值分别递增。之后对s进行了256次交换操作。通过识别初始化代码,可以知道rc4算法。

其伪代码表示为:

初始化长度为256的S盒arrow-up-right。第一个for循环将0到255的互不重复的元素装入S盒。第二个for循环根据密钥打乱S盒。

下面i,j是两个指针。每收到一个字节,就进行while循环。通过一定的算法((a),(b))定位S盒中的一个元素,并与输入字节异或,得到k。循环中还改变了S盒((c))。如果输入的是明文arrow-up-right,输出的就是密文arrow-up-right;如果输入的是密文,输出的就是明文。

此算法保证每256次循环中S盒的每个元素至少被交换过一次

python解密脚本

对应例题:《从 0 到 1》RE 篇——BabyAlgorithm

题目链接arrow-up-right

MD5

MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数arrow-up-right,可以产生出一个128位(16字节arrow-up-right)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特arrow-up-right(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4arrow-up-right算法。这套算法的程序在 RFC 1321arrow-up-right 中被加以规范。

伪代码表示为:

其鲜明的特征是:

Last updated