python學習之RC4演算法實現

2021-09-29 06:45:44 字數 3862 閱讀 6015

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...