rc4演算法是一種對稱加密演算法,即加密與解密的過程相同。假設其運算過程表示為rc4(key, data),其中key為金鑰,data為待處理的資料,則:
密文=rc4(key,data)
data=rc4(key,密文)
也就是說,對一段資料(原文)做奇數次rc4運算,得到密文,做偶數次rc4運算,結果還是原文。
rc4演算法是基於金鑰流的加密演算法。
假設要加密的資料(明文)長度為n個位元組,通過某種演算法產生n位元組的資料(金鑰),將這兩串資料按位異或(xor),得到密文。把密文與這串金鑰再xor,就能得到明文。這一串由某種演算法產生的n位元組(8n位),稱為金鑰流,對應演算法就叫做金鑰流生成演算法。區分不同基於金鑰流的加密演算法的標準就是其金鑰流的生成方式。
演算法特點:
簡單,執行速度快,金鑰長度可變(長度範圍為 1-256 位元組)。
rc4演算法組成:
1、s盒生成
根據使用者輸入的秘鑰 key,使用 金鑰排程演算法(key-scheduling algorithm,ksa)生成 s 盒。
2、生成金鑰流,加密資料
使用偽隨機生成演算法(pseudo-random generation algorithm,prga)生成秘鑰流,然後使用生成的金鑰流加密明文資料,得到密文。
對應得到的密文,可以根據需要再做處理,例如base64編碼。
這裡需要注意的是,對於包含中文的明文,需要做適當的編碼(encode)和解碼(decode)處理,編碼方法一般為「utf-8」,同時還涉及字元轉ascii編碼(10進製)等操作。
可以通過匯入crypto.cipher中的arc4來實現,也可以自定義實現,本文通過自定義方法實現。
**執行環境:
windows 10
python 3.7
# coding=utf-8
# python 3.7
import sys
def bytestohex(bytes):
sb = ''
for i in range(len(bytes)):
hexs = hex(bytes[i] & 0xff)[2:]
if len(hexs) < 2:
sb += '0'
sb += hexs
return sb
def hextobyte(inhex):
hexlen = len(inhex)
result =
if (hexlen % 2 == 1):
hexlen += 1
inhex="0"+inhex
for i in range(0, hexlen, 2):
return result
def initkey(akey):
state = list(range(256))
bkey =[ord(i) for i in list(akey)]
index1 = 0
index2 = 0
if (len(bkey) == 0):
return
for i in range(256):
index2 = ((bkey[index1] & 0xff) + (state[i] & 0xff) + index2) & 0xff
state[i], state[index2] = state[index2], state[i]
index1 = (index1 + 1) % len(bkey)
return state
def rc4base(input, mkkey):
x = 0
y = 0
key = initkey(mkkey)
result = list(range(len(input)))
for i in range(len(input)):
x = (x + 1) & 0xff
y = ((key[x] & 0xff) + y) & 0xff
key[x], key[y] = key[y], key[x]
xorindex = ((key[x] & 0xff) + (key[y] & 0xff)) & 0xff
result[i] = (input[i] ^ key[xorindex])
return result
def encryrc4byte(data, key, chartset='utf-8'):
if not chartset:
bdata = [ord(i) for i in data]
return rc4base(bdata, key)
else:
bdata = list(data.encode(chartset))
return rc4base(bdata, key)
def decryrc4(data, key, chartset='utf-8'):
r = rc4base(hextobyte(data), key)
return bytes(r).decode(chartset)
def encryrc4string(data, key, chartset='utf-8'):
return bytestohex(encryrc4byte(data, key, chartset))
def main(data, key, signs):
if signs == 'encode':
datas = encryrc4string(data, key)
else:
datas = decryrc4(data, key)
print(datas)
if __name__ =='__main__':
try:
key = sys.ar**[2] #"key"
data = sys.ar**[1] #"encoded_string"
choices=sys.ar**[3].strip() # decode or encode
if choices not in ['decode', 'encode']:
print('usage: %s string2decode key_string decode' % sys.ar**[0])
print(' or: %s string2encode key_string encode' % sys.ar**[0])
exit()
except:
print('usage: %s string2decode key_string decode' % sys.ar**[0])
print(' or: %s string2encode key_string encode' % sys.ar**[0])
exit()
main(data,key,choices)
使用方法很簡單,需要的引數共3個,第乙個data引數為明文或密文,第二個引數key為金鑰,第三個choices為加密(encode)或者解密(deocde)操作,假設**儲存為rc4.py檔案,在命令列中執行:
python rc4.py dsadasmi明文 thisiskey encode
得到密文:efc3c7d2cb1ffc0b1fd84d6f000b 。
進行解密:
python rc4.py efc3c7d2cb1ffc0b1fd84d6f000b thisiskey decode
得到明文: dsadasmi明文 。 RC4演算法實現
1 金鑰流 rc4演算法的關鍵是根據明文和金鑰生成相應的金鑰流,金鑰流的長度和明文的長度是對應的,也就是說明文的長度是500位元組,那麼金鑰流也是500位元組。當然,加密生成的密文也是500位元組,因為密文第i位元組 明文第i位元組 金鑰流第i位元組 2 狀態向量s 長度為256,s 0 s 1 s...
RC4演算法實現
1 金鑰流 rc4演算法的關鍵是根據明文和金鑰生成相應的金鑰流,金鑰流的長度和明文的長度是對應的,也就是說明文的長度是500位元組,那麼金鑰流也是500位元組。當然,加密生成的密文也是500位元組,因為密文第i位元組 明文第i位元組 金鑰流第i位元組 2 狀態向量s 長度為256,s 0 s 1 s...
RC4金鑰演算法
rc4是面向位元組的序列密碼,乙個明文的位元組 8位元 與乙個金鑰的位元組進行異或就生成了乙個密文的位元組。乙個可以在金鑰流中生成一位元組的金鑰,包含從1到256位元組的任何位置。rc4演算法的結構非常簡單,由兩部分組成 金鑰排程演算法ksa和偽隨機金鑰序列生成演算法prga。1 金鑰排程演算法ks...