学习RC4及C语言手搓RC4算法

本文主要是了解RC4和清楚RC4步骤.

学习RC4及C语言手搓RC4算法

本文主要是了解RC4和清楚RC4步骤。重点是算法步骤。

了解RC4

RC4(Rivest Cipher 4)是一种流加密算法,由Ron Rivest在1987年设计。 它通过生成密钥流字节与明文进行异或操作来实现加密,它加解密使用相同的密钥,因此也属于对称加密算法。 RC4使用可变长度的密钥,长度范围为1到256个字节。

RC4算法主要代码是如何生成密钥流。 分为两步:

  1. 初始化阶段 KSA(Key-Scheduling Algorithm)
  2. 密钥流生成阶段 PRGA (pseudo-random generation algorithm)

KSA主要步骤如下:

  1. 初始化 S 盒:创建一个256长度的数组S,初始化为S[i] = i
  2. 初始化临时数组 T进行密钥填充:如果RC4密钥(key)长度为key_len,密钥重复填充到长度为 256 的数组 T 中, T[i] = key[ i % key_len]
  3. 打乱 S 盒:使用密钥对 S 盒进行置换。 伪代码:
c
for i from 0 to 255:
    S[i] = i
    T[i] = key[i % key_len] 

j = 0
for i from 0 to 255:
    j = (j + S[i] + T[i]) % 256
    swap(S[i], S[j])

PRGA主要步骤如下: 密钥流生成阶段的目的是生成伪随机的密钥流字节,用于与明文或密文进行异或操作。 伪代码如下:

c
i = 0, j = 0
while (需要生成密钥流字节长度):
    i = (i + 1) % 256
    j = (j + S[i]) % 256
    swap(S[i], S[j])
    k = S[(S[i] + S[j]) % 256]
    输出 k

k就是密钥流字节。这是一个字节。这个字节用于和明文异或。

我生成一个数组keystream存储密钥流字节,这个keystream应该是和明文长度一致的。加解密的时候按字节进行异或。

我写的简单代码。

image-20250203153841067

但是我这代码有个缺陷,keystream数组长度只有256。明文超过256应该就出毛病了。理论应该是和明文长度一致的。 可以不用keystream数组,直接在PRGA阶段对明文进行加解密。

我这份代码只是展示了最简单的流程,没有使用函数封装。

再来看一份DeepSeek的代码:

文章有错误欢迎在评论区指正。 有疑问也可以在评论区讨论。

参考

DeepSeekhttps://www.cnblogs.com/shelmean/p/14281332.html

🌿三月总结|慢慢变好 < 2025
古典密码-仿射密码学习

评论区

评论加载中...