前言

密码学是很重要的一门学科,也是很复杂得学科,但同样是撑起信息安全的伟大学科。不管是在哪个方向,只要与信息有关,都会涉及到密码学。在二进制中会分析大量的加密算法,在web分析中也纯在很多加密方式,今天我就用通俗的语言来分析从浅入深的分析RC4加密算法,并且涉及到其实战中的算法分析。让我们在二进制分析中更加游刃有余。

什么是RC4加密算法?

对这种算法的描述有很多,曾经作为商业密码未被公开过,不过现在这种加密已经成为历史。但是其中很优秀的加密思想依然值得我们学习,除此之外,改良这种算法并加以利用依然很受欢迎。
RC4加密算法是一种对称加密算法。所谓对称加密算法,说得直白一点,就是加密与解密的过程一模一样。假设定义RC4的运算过程是rc4(key,data),那么,密文=rc4(key,明文),明文=rc4(key,密文)。这种对称性就是基于秘钥流的加密算法的特征之一,RC4本质上就是一种秘钥流生成算法。其特点就是简单、运行效率高,不会占用过多的CPU,因此常用在很多旧无线网卡的WEP加密。
用一张简图来阐明一下RC4加密的流程:

如何理解这张图——加密原理

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

PRGA(Pseudo-random generation algorithm)算法根据 S 盒生成与明文长度相同的秘钥流,使用秘钥流加密明文。
循环体中每收到一个字节,a 和 b 定位S盒中的一个元素,并与输入字节异或,得到密文 k;同时,c 还改变了 S 盒。由于异或运算的特性,使得加密与解密过程一致。如果输入的是明文,输出的就是密文;如果输入的是密文,输出的就是明文。

因为接下来我会用两个例子来跟好的说明这种算法在二进制中的体现。一个是android逆向,会用到java版本的RC4,还有一个题目是伪代码,类似于C代码的形式,因此接下来展示一下C语言如何实现加密的。以方便后面题目的分析。
用于生成KSA,也可以认为是初始化

使用秘钥流进行加密的过程

中规中矩的RC4加密现在已经有解码器可以使用了,因此在CTF比赛中,出题人常常都会对RC4算法进行魔改,让玩家没办法用解码器解码,提高题目的难度,就像base64加密一样,在很多二进制题目中都会出现,但是每次出现都会有不一样的结果,出题人都会改动加密方式。因此,接下来我们就看看两个题目,从而更加理解RC4加密。
怎样提高逆向中RC4的难度?
这个题是安恒杯的一个题目,具体的怎样操作,题解就自己去查找,我们就主要分析出题人的思路和RC4加密算法

通过IDA反汇编的伪代码,逻辑不是很难。会先对输入的字符串进行base64加密,但是这个base64加密也不是常规的,更换过密码本的。这个加密直接用一个python脚本就能够解出来。
下面就进行了RC4加密的过程,我们就进入分析RC4,看看伪代码和源码有什么区别
这是准备阶段,初始化

接下来就是加密环节的反汇编代码

结果发现和源码是一样的,由于RC4这种加密的特殊性,不太容易在算法中修改,有效够提高这种题目难度的就是对加密函数的输入进行处理。这题就是运用了变种的base64进行处理。
接下来看看在android逆向中会有什么样的呈现吧。
该题目来自2019SCTF中的一道逆向题目
同样,该题的题解和怎样分析,在这里不会讲,我们依然是讲里面涉及到的加密算法

然而这题的独特之处在于将字符串存放在数据库中,又对字符串进行MD5加密,然后再作为key用于RC4加密。
RC4的变换招式:
1、 用其他加密算法对RC4加密函数的参数进行加密,然后对其进行隐藏,以提高逆向题目的难度。
2、 采用代码混淆,用字符替换RC4中的关键数据,但是结果并不影响,这样能够有效的阻止逆向分析是看出是RC4加密

总结

从接触RC4这种加密方式,到在二进制逆向分析中分析这种加密的题目,诀窍在于,出题人会对加密函数的参数做手脚,这样来提高难度。当我们明白RC4加密的原理和过程后,就会发现这种逆向题目并不是很难分析。不管是什么语言写的加密算法,在明白原理后,都是一样的分析。除此之外,在很多加密算法中,都是这样的,比如base64,只要我们明白其加密原理,不管怎样变换,我们都能够很快分析出来。
最后,二进制分析算法问题,我们应该优先了解其加密的机制,熟悉原理,就会知道这个加密算法会有怎样的变换。举一反三,在密码学中很实用,在二进制分析中也是很实用的。

点击收藏 | 0 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖