Contents
  1. 1. 前言
  2. 2. 简介
  3. 3. 原理
  4. 4. 代码

前言

上学期密码学的作业,写一下。

简介

在密码学中,RC4(来自Rivest Cipher 4的缩写)是一种流加密算法,密钥长度可变。它加解密使用相同的密钥,因此也属于对称加密算法。

原理

其原理主要分为三步:
RC4的原理分为三步:

初始化S和T

1
2
3
for i=0 to 255 do
S[i]=i;
T[i]=K[ imodkeylen ];

初始排列S

1
2
3
4
j=0;
for i=0 to 255 do
j= ( j+S[i]+T[i])mod256;
swap(S[i],S[j]);

产生密钥流

1
2
3
4
5
6
7
i,j=0;
for r=0 to len do //r为明文长度,r字节
i=(i+1) mod 256;
j=(j+S[i])mod 256;
swap(S[i],S[j]);
t=(S[i]+S[j])mod 256;
k[r]=S[t];

正确性分析
由于经过加密后的结果,输出的是一些不可见,所以又使用base64进行了再次加密,使其转化为可见字符。

安全性分析

理论上来说,RC4算法是很难被破解的。RC4中用到的key是长度在[1,256]的unsigned char字符串,可能性就是256+256^2+256^3+….256^256≈256^256次方种可能性,量级在10^600以上。如果你真的设置了一个256byte(不是bit哦)的key,别人想要暴力破解几乎是不可能的。
由于RC4算法加密是采用的xor,所以,一旦子密钥序列出现了重复,密文就有可能被破解。
由于存在部分弱密钥,使得子密钥序列在不到100万字节内就发生了完全的重复,如果是部分重复,则可能在不到10万字节内就能发生重复,因此,推荐在使用RC4算法时,必须对加密密钥进行测试,判断其是否为弱密钥。其不足主要体现于,在无线网络中IV(初始化向量)不变性漏洞。
加大被破解的难度:
(1)定时更换key,就像网民应该定时更换自己的密码一样。
(2)在真实原文里混杂一些随机字符串再加密。
(3)并不把加密串直接暴露给公众,可以对加密串做二次加密。(循环移位、字符-字符映射、按某种规则打散、再做一次RC4、等等)

代码

下面给出Python的完整代码

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#-*- coding: UTF-8 -*-
import hashlib
import base64


def Rc4_init(S, K): # S盒初始化置换,K为密钥
j = 0
K = hashlib.md5(K).hexdigest()
k = [] # 临时数组
for i in range(256):
S.append(i)
k.append(K[i % len(K)])
for i in range(256):
j = (j + S[i] + ord(k[i])) % 256
S[i], S[j] = S[j], S[i] # 交换S[i],S[j]


def rc4_Encrypt(S, D):
i = j = 0
result = ''
for a in D:
i = (i + 1) % 256
j = (j + S[i]) % 256
S[i], S[j] = S[j], S[i]
t = (S[i] + S[j]) % 256

k = chr(ord(a) ^ S[(S[i] + S[j]) % 256])
result += k
result = base64.b64encode(result)
return result


def rc4_Decrypt(S, D):
i = j = 0
D = base64.b64decode(D)
result = ''
for a in D:
i = (i + 1) % 256
j = (j + S[i]) % 256
S[i], S[j] = S[j], S[i]
t = (S[i] + S[j]) % 256

k = chr(ord(a) ^ S[(S[i] + S[j]) % 256])
result += k
return result


key = 'dasdffdghfghjde'
d = 'thisisatest'
print("key:"+key)
print("m:"+d)


s=[]
Rc4_init(s, key)
#print("s盒:")
#print(s)

c = rc4_Encrypt(s, d)
print("Encrypt:"+c)

s=[]
Rc4_init(s,key)
#print("s盒:")
#print(s)

z = rc4_Decrypt(s, c)
print("Decrypt:"+z)

Contents
  1. 1. 前言
  2. 2. 简介
  3. 3. 原理
  4. 4. 代码