前言
上學期密碼學的作業,寫一下。
簡介
在密碼學中,RC4(來自Rivest Cipher 4的縮寫)是一種流加密算法,密鑰長度可變。它加解密使用相同的密鑰,因此也屬於對稱加密算法。
原理
其原理主要分爲三步:
RC4的原理分爲三步:
初始化S和T
for i=0 to 255 do
S[i]=i;
T[i]=K[ imodkeylen ];
初始排列S
j=0;
for i=0 to 255 do
j= ( j+S[i]+T[i])mod256;
swap(S[i],S[j]);
產生密鑰流
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+2562+2563+…256256≈256256次方種可能性,量級在10^600以上。如果你真的設置了一個256byte(不是bit哦)的key,別人想要暴力破解幾乎是不可能的。
由於RC4算法加密是採用的xor,所以,一旦子密鑰序列出現了重複,密文就有可能被破解。
由於存在部分弱密鑰,使得子密鑰序列在不到100萬字節內就發生了完全的重複,如果是部分重複,則可能在不到10萬字節內就能發生重複,因此,推薦在使用RC4算法時,必須對加密密鑰進行測試,判斷其是否爲弱密鑰。其不足主要體現於,在無線網絡中IV(初始化向量)不變性漏洞。
加大被破解的難度:
(1)定時更換key,就像網民應該定時更換自己的密碼一樣。
(2)在真實原文裏混雜一些隨機字符串再加密。
(3)並不把加密串直接暴露給公衆,可以對加密串做二次加密。(循環移位、字符-字符映射、按某種規則打散、再做一次RC4、等等)
代碼
下面給出Python的完整代碼
#-*- 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)