rc4是乙個典型的基於非線性陣列變換的序列密碼。它以乙個足夠大的陣列s為基礎,對其進行非線性變換,產生非線性的金鑰流序列。
rc4演算法s盒的大小根據引數n的值而變化,通常n=8,這樣rc4可生成256個元素的陣列s
種子金鑰長度為1~ 256
個位元組(8~2048
位元)的可變長度,用於初始化256個位元組的初始向量s
rc4有兩個主要演算法:
具體過程如下:
# ksa 初始化s盒
definitsbox
(k):
# 初始化s盒 存初始值0-255
s =list
(range
(256))
t =# 用於輪轉存放key
for i in
range
(256):
ord(k[i %
len(k)])
)# 存放輪轉的256位key
j =0for i in
range
(256):
j =(j + s[i]
+ t[i])%
256# 通過交換,打亂s盒
s[i]
, s[j]
= s[j]
, s[i]
return s
# prga生成金鑰流
defencrypt
(m, k)
: c =
"" i = j =
0# 呼叫已經初始化的s盒
s = initsbox(k)
for x in
range
(len
(m))
: i =
(i +1)
%256
j =(j + s[i])%
256 s[i]
, s[j]
= s[j]
, s[i]
# 交換 打亂s盒
t =(s[i]
+ s[j])%
256# 將生成的金鑰流key逐一與明文進行異或,格式化成16進製制字串
c +=
'%02x'%(
ord(m[x]
)^ s[t]
)return c
if __name__ ==
"__main__"
:# 加密
m =k =
"qwertyuiop"
ans = encrypt(m, k)
print
("加密後得到的內容為: \n"
+ ans)
# 解密
c = ans #獲取密文
b ="" text =
""# 將16進製制字串轉換為相應字元,存入字串b中
for i in
range(0
,len
(c),2)
: b +=
str(
chr(
int(c[i : i +2]
,16))
)# 解密其實就是再次與金鑰流進行異或,再次呼叫encrypt函式
res = encrypt(b, k)
# 異或後的16進製制對應相應的明文本元,轉換為相應字元
for i in
range(0
,len
(res),2
):text +=
str(
chr(
int(res[i : i +2]
,16))
)print
("解密後得到的明文為: \n"
+ text)
加密與解密使用同乙個加密函式,因為解密其實就是再次與金鑰流進行異或。結果如下。
演算法主要包含金鑰排程演算法(ksa):用於打亂s盒的初始排列 和偽隨機數生成演算法(prga)用於輸出隨機序列並修改s的當前排列。前者的所有操作僅僅是改變位置。後者的秘鑰序列生成過程較為複雜(很好地打亂),但加解密使用的是同乙個秘鑰k,故隨機生成後的秘鑰序列依然是相同的,加上加解密只是簡單的異或運算,故演算法正確。
由演算法的實現可知,rc4演算法的加解密對種子秘鑰的依賴十分強烈。故需要保證種子秘鑰的安全性。對於此,可進行相關攻擊。
演算法存在無效的初始置換,j = (j + s[i] + t[i]) mod 256
取(j+t[i])mod 256 ≡ 0
即t[i]=[0,0,255,254,253,...,2]
這樣的情況下,s盒完全不會被攪亂,都是無效替換。這樣便可以通過統計分析破解。
流密碼(序列密碼)與Rc4演算法
流密碼 序列密碼 與rc4演算法 rc4是一種序列密碼,它是一種可變金鑰長度 面向位元組操作的序列密碼,乙個明文位元組與乙個金鑰位元組相異或產生乙個密文位元組。演算法原理 對於n 8位長的字,即以乙個位元組為單位,此時n 256,用從1到256個位元組的可變長度金鑰初始化乙個256個位元組的狀態向量...
流密碼加密(RC4和LFSR)
演算法思想 1 先初始化狀態向量s 256個位元組,用來作為金鑰流生成的種子1 按照公升序,給每個位元組賦值0,1,2,3,4,5,6 254,255。2 初始金鑰 由使用者輸入 長度任意。如果輸入長度小於256個位元組,則進行輪轉,直到填滿。例如輸入金鑰的是1,2,3,4,5,那麼填入的是1,2,...
流密碼 python實現RC4加密
1 理解流密碼的基本思想 2 掌握rc4加密演算法的加解密過程和實現方法 3 採用自己熟悉的程式語言實現rc4密碼演算法。給定金鑰abcde,試對明文 shenzhen university 加密 注 明文包括空格,但不包括引號 rc4的python實現 defs box r s盒 s x for ...