RC4原理及其Python的實現

2021-10-08 06:20:25 字數 4804 閱讀 2487

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演算法的特點是演算法簡單,執行速度快。並且金鑰...