序列密码RC4理论篇

xiaoeryu Lv5

本章的主要内容为对RC4算法原理的了解和实现

RC4是序列密码中用的非常广泛的一个加解密算法

  • 因为是按位异或,所以显著特征是密文C和明文M的长度肯定是相等的。

RC4(来自Rivest Cipher 4的缩写)是一种流加密算法,密钥长度可变。在给定一密钥时,会生成一固定序列的字节流,用于和明文进行异或。它加解密使用相同的密钥,因此属于对称加密算法。RC4已经成为一些常用协议和标准的一部分,如1997年的WEP和2003/2004年的WPA;和1995年的SSL,以及后来1999年的TLS。让他如此广泛分布和使用的主要因素是它不可思议的简单和速度,不管是软件还是硬件,实现起来都十分容易。

  • RC4算法的原理很简单,主要包括初始化算法(KSA)和伪随机子密码生成算法(PRGA)两个部分。假设S-box的长度为256,密钥长度为Len。目前RC4在不知道key的情况下还是只能暴力破解,所以它的安全性还是有一定保证的。
KSA
  • 初始化(KSA)算法部分参数1是一个256长度的char型数组,定义为:unsigned char sBox[256];参数2是密钥,其内容可以随便定义,参数3是密钥的长度,为1-256;在初始化的过程中,密钥的主要功能是将S-box搅乱。
PRGA
  • 伪随机子密码生成算法(PRGA)参数1是上边rc4_init函数中,被搅乱的S-box;参数2是需要加密的数据data。经过了PRGA算法,可以确保任一给定密钥key都可以得到一个确定的用于和明文异或的字节流序列进行加密。

因为是对称加密,RC4的加密和解密过程是一样的

实现RC4算法

手动写一遍RC4的算法,看一下它的加密和解密流程

代码地址

总结:经过了初始化算法(KSA)和伪随机子密码生成算法(PRGA)两个部分后,可以知道,任意一个给定的key(长度为1-256)都会得到一个特定的字节流序列,可以看成是对明文进行异或的子密钥序列。因此,对于长度足够长的RC4的密钥,其对抗暴力破解便已足够,因此,加密强度也已经相当强!

在KSA阶段,需要有长度为256的状态向量即S盒的参与,并会有两轮256大小的循环,对状态向量S盒进行扰乱

在PRGA阶段,会有循环次数为加密内容字节数的循环体,每一次循环中都会有状态向量即S盒的参与,并会重新扰乱S盒生成新的状态向量

RC4作为对称密码中的序列密码,没有特别的常量的存在,256算是多次出现的数字

RC4加密算法在逆向分析过程中的快速识别方法:
  1. 首先判断明文和密文长度是否相等,登场则代表是序列密码。(可以通过编写frida脚本或xposed插件完成对响应函数的主动调用,判断当输入明文为任意长度时的密文长度)
  2. 接下来判断是否是RC4。RC4算法中的初始化算法(KSA)中有两轮非常显著的长度为256的循环体,用于根据给定的key生成S盒;伪随机子密码生成算法(PRGA)会根据上一步得到的扰乱的S盒,进一步生成子密钥流,最终和给定的铭文进行逐字节的异或;

在本篇文章中我们了解了RC4的基本原理,以及分别用java和C实现了RC4。在下篇文章中将基于这份代码分别对java和C中的RC4算法进行分析。

  • 标题: 序列密码RC4理论篇
  • 作者: xiaoeryu
  • 创建于 : 2024-02-21 13:29:38
  • 更新于 : 2024-02-23 15:31:00
  • 链接: https://github.com/xiaoeryu/2024/02/21/序列密码RC4理论篇/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
此页目录
序列密码RC4理论篇