1. 背景與歷史
rc4是一種流加密法,這意味著,其加密是逐個位元組進行的,但也可以改為逐位加密或者是除位元組/位之外的大小。
rc4已經成為某些被廣泛使用的加密技術和標準的一部分,包括無線裝置隱私、用於無線卡與tls的wpa。它之所以能被這麼廣泛部署,是因為它的速度及設計的簡單性。它可以用軟體和硬體來實現,而且不用消耗太多的資源。
2. 演算法描述
rc4生成乙個稱為金鑰流的偽隨機流。加密時,這是使用xor的明文組合。解密也是以類似的方式進行的。
有乙個由1~ 256個位元組的組成的變長金鑰。該金鑰 用於初始化乙個256位元組的狀態向量,其元素用s[0],s[1],…,s[255]標識。要進行解密或者解密操作,選取s中的256個位元組之一來進行。我們稱這個結果輸出為k。之後將s的項重新排列一次。這裡包含兩個處理過程:s的初始化,以及流的生成。
2.1 s的初始化
這個過程處理是由以下步驟組成:
(1)選取乙個長度為1~ 256個位元組的金鑰k。
(2)設定狀態向量s的值等於0~ 255(以遞增的順序),也就是說s[0]=0,s[1]=1,…,s[255]=255。
(3)建立臨時陣列,如果金鑰k的長度是256個位元組,那麼把k複製到s。否則,在把k複製到臨時陣列後,臨時陣列的剩餘位置再次用k的值進行填充,最後,臨時陣列必須完全填滿。此步驟可以用如下邏輯:
t=
bytes
(key,encoding=
'utf-8'
)#將utf-8的位元組碼解碼成python預設的unicode的字串
t=list
(t)#轉換成列表型別
print
('private key:'
,t)#輸出金鑰
len_key=
len(t)
#確定金鑰的長度
r=[t[i%len_key]
for i in
range
(256)]
#對t進行複製和填充,並儲存在r陣列中
s=
[x for x in
range
(256)]
#列表推導式,初始化狀態向量s
j=0#進行初始置換,位於s[i]的位元組與s陣列中的另乙個位元組(由r[i]決定)進行交換
for i in
range
(256):
j =(j+s[i]
+r[i])%
256#進行值交換
temp=s[i]
s[i]
=r[i]
r[i]
=temp
2.2 流的生成經過以上的初始化和置換以後,s已經準備好了,初始的金鑰陣列k可以丟棄了。現在我們需要另乙個迴圈。在每一步中,我們把s[i]與s的另乙個位元組進行交換,每次交換的方法由s的實現來決定。一旦用完了256個位置後,在從s[i]開始,其邏輯**如下:
i=
0 j=
0 sh=
length=
int(length)
for i in
range
(length)
: i=
(i+1)%
256 j=
(j+s[i])%
256 s[i]
,s[i]
=s[j]
,s[j]
h=(s[j]
+s[i])%
256 k=s[h]
然後,對於加密,k與明文的下乙個位元組進行xor執行。對於解密,k與密文的下乙個位元組進行xor運算。
3. 演算法實現
其演算法的加密和解密的python**如下:
#rc4的python實現
defini_s
(r):
#初始化s
s=[x for x in
range
(256)]
#列表推導式,初始化狀態向量s
j=0#進行初始置換,位於s[i]的位元組與s陣列中的另乙個位元組(由r[i]決定)進行交換
for i in
range
(256):
j =(j+s[i]
+r[i])%
256#進行值交換
temp=s[i]
s[i]
=r[i]
r[i]
=temp
return s
defgen_r
(key)
:#生成輔助表r
t=bytes
(key,encoding=
'utf-8'
)#將utf-8的位元組碼解碼成python預設的unicode的字串
t=list
(t)#轉換成列表型別
print
('private key:'
,t)#輸出金鑰
len_key=
len(t)
#確定金鑰的長度
r=[t[i%len_key]
for i in
range
(256)]
#對t進行複製和填充,並儲存在r陣列中
return r
defstream_k
(s,length)
: i=
0 j=
0 sh=
#sh儲存流
length=
int(length)
#儲存明文的長度或者密文長度的一半
for i in
range
(length)
: i=
(i+1)%
256#如果用完256個位置,再從s[i]開始
j=(j+s[i])%
256#選擇s[i]與s的另乙個位元組
#對s[i]和s的另一位元組進行交換
temp=s[i]
s[j]
=s[j]
s[i]
=temp
h=(s[j]
+s[i])%
256#防溢位操作
k=s[h]
#將k在sh的末尾新增新的物件
return sh
choose=
input
('choose 1--encryption, 2--decryption:'
)#1為加密,2為解密
#加密操作
if choose==
'1':
key=
input
('input the key:'
)#key儲存金鑰
r=gen_r(key)
#r儲存key的輔助表
s=ini_s(r)
#s的初始化
plaintext=
input
('input the plaintext:'
)#plaintext儲存明文
ciphertext=
''#ciphertext儲存密文
sh=stream_k(s,
len(plaintext)
)#生成明文的流
#sh與明文的下乙個位元組進行異或運算
for i in
range
(len
(plaintext)):
ciphertext = ciphertext +
'%02x'
%(sh[i]
^ord
(plaintext[i]))
#進行異或運算並儲存在ciphertext
print
('ciphertext:'
,ciphertext)
#輸出密文
#解密操作
if choose==
'2':
key=
input
('input the key:'
)#key儲存金鑰
k=gen_r(key)
#k儲存key的輔助表
s=ini_s(k)
#s的初始化
ciphertext=
input
('input the ciphertext:'
)#ciphertext儲存密文
plaintext=
''#plaintext儲存明文
sh=stream_k(s,
len(ciphertext)/2
)#生成密文的流
#sh與密文的下乙個位元組進行異或運算
for i in
range
(int
(len
(ciphertext)/2
)): plaintext = plaintext +
chr(
int(ciphertext[0:
2],16
)^ sh[i]
)#進行異或運算並儲存在plaintext
ciphertext=ciphertext[2:
]print
('plaintext:'
,plaintext)
#輸出密文
其加密的結果如下圖所示:
其加密的結果如下圖所示:
python學習之RC4演算法實現
rc4演算法是一種對稱加密演算法,即加密與解密的過程相同。假設其運算過程表示為rc4 key,data 其中key為金鑰,data為待處理的資料,則 密文 rc4 key,data data rc4 key,密文 也就是說,對一段資料 原文 做奇數次rc4運算,得到密文,做偶數次rc4運算,結果還是...
流密碼 python實現RC4加密
1 理解流密碼的基本思想 2 掌握rc4加密演算法的加解密過程和實現方法 3 採用自己熟悉的程式語言實現rc4密碼演算法。給定金鑰abcde,試對明文 shenzhen university 加密 注 明文包括空格,但不包括引號 rc4的python實現 defs box r s盒 s x for ...
RC4加密演算法的原理及實現
rc4於1987年提出,和des演算法一樣。是一種對稱加密演算法,也就是說使用的金鑰為單鑰 或稱為私鑰 但不同於des的是。rc4不是對明文進行分組處理,而是位元組流的方式依次加密明文中的每個位元組。解密的時候也是依次對密文中的每個位元組進行解密。rc4演算法的特點是演算法簡單,執行速度快。並且金鑰...