RC4

RC4

介绍

对于RC4,它是一种对称加密算法,并且它是一种流密码,它的明文和密钥流一样长,密钥的话,长度可以为1~256。但是密钥过短的话,会大大降低安全性,因此建议最少使用128位的密钥进行加密,否则密钥流会重复,造成随机性变低。

流密码是一个明文字节对应一个密钥字节进行异或操作进行加密。解密的话也是同样如此,如果一个明文进行两次异或会得到它本身(如果不会的话,可以取了解一下异或的操作)。

RC4的相关变量

**1.**密钥流:明文的长度和密钥流的长度是相对应的,例如明文长500字节,那么密钥流也会长500字节。密钥流的生成取决于密钥。如果密钥小于明文的长度,那么就会循环补充,直至密钥流长度达到明文长度。例: key=’123’,明文长500,那么key_stream=’123123…..’,这个长度和明文的长度相同。

2.状态向量S:s[i]=i,初始的S盒S[0] = 0 , S[1] = 1 .....S[n]=n

3.临时向量T:T[i] = K [i mod keylen](这个keylen的长度等于密钥的长度,而不是密钥流的长度)

KSA算法

首先生成S盒,这个S盒是初始的,可以参考一下上一个状态向量S, 接着生成T临时向量,也可以参考一下上面的。

对于明文长度为n的时候,初始j = 0,然后对i进行0到n-1的遍历。计算j = (j + S[i] + S[j]) mod n ,然后进行S[i]S[j]的值进行互换。

PRGA算法

对于经过KSA算法得到的S盒,把ij初始化为 0 ,对r = 0 进行0~n-1的遍历。

i = (i+1) mod n j = (j+1) mod n ,每循环一次就要进行S[i]S[j]值的互换。其中t=[S[i] + S[j]] mod n

K[r] = S[t].得到长度为n的密钥流。

对明文进行加密和解密

因为明文长度等于密钥流长度,则可进行每一位相互对应异或

密文(c) = key ^ m

明文(m) = key ^ c

总结

RC4特点

1.RC4算法简单,易于实现。

2.算法运行速度快,便于运算

3.密钥的长度可变,明文的长度为n,则密钥的长度为1~n

RC4代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
def KSA(key):
"""
密钥调度算法
"""
key_len = len(key)
S = list(range(256))
j = 0
for i in range(256):
j = (j + S[i] + key[i % key_len]) % 256
S[i], S[j] = S[j], S[i] # 交换S[i]和S[j]
return S


def PRGA(S, data):
"""
伪随机子密码生成算法
"""
i = 0
j = 0
key = []
for byte in data:
i = (i + 1) % 256
j = (j + S[i]) % 256
S[i], S[j] = S[j], S[i] # 交换S[i]和S[j]
k = S[(S[i] + S[j]) % 256]
key.append(k ^ byte)
return bytes(key)


def RC4(key, data):
"""
RC4加密和解密函数
"""
S = KSA(key)
return PRGA(S, data)


# 示例:使用RC4算法加密和解密字符串
key = b'abcdefghijklmnop'
data = b'hello world'
# key=input()
# data=input()
# key=key.encode('utf-8')
# data=data.encode('utf-8')
# 这里为可选择自己想要输入的明文和密钥
encrypted = RC4(key, data)
print('加密结果:', encrypted)
decrypted = RC4(key, encrypted)
print('解密结果:', decrypted)
# 加密结果: b'\xc4\xa5/\xb1\xddf\x88t\x00\x8b['
# 解密结果: b'hello world'

逻辑思维图

这个仅针对这个算法看完之后还有些模糊,可以来看一下这个

img


RC4
http://example.com/2023/07/08/RC4/
作者
RK1Y8
发布于
2023年7月8日
许可协议