RC4算法的Python實現詳注


      剛對RC4算法進行了學習,網上發現https://ju.outofmemory.cn/entry/46753 中作者展示了RC4的python實現,但代碼缺乏注釋,較為晦澀,因此本文對部分代碼進行了注釋,希望能對學習RC4算法的pythoner有所幫助。

 1 #/usr/bin/python
 2 #coding=utf-8
 3 import sys,os,hashlib,time,base64
 4 def rc4(string, op = 'encode', public_key = 'ddd', expirytime = 0):
 5     ckey_lenth = 4  #定義IV的長度
 6     public_key = public_key and public_key or ''
 7     key = hashlib.md5(public_key).hexdigest() #將密碼public_key進行md5,返回32字節的key
 8     keya = hashlib.md5(key[0:16]).hexdigest() #將Key的前16字節md5,返回32字節的keya
 9     keyb = hashlib.md5(key[16:32]).hexdigest() #將key的后16字節md5,返回32字節的keyb
10     
11     #當加密時,keyc取time.time()的md5前4字節,用作IV
12     #當解密時,從密文的前4字節取出IV
13     keyc = ckey_lenth and (op == 'decode' and string[0:ckey_lenth] or hashlib.md5(str(time.time())).hexdigest()[32 - ckey_lenth:32]) or ''
14     
15     #真正的密鑰cryptkey是由keya拼接keya以及keyc的md5得來的共64字節的字符串
16     cryptkey = keya + hashlib.md5(keya + keyc).hexdigest()
17     key_lenth = len(cryptkey)   #64
18 
19     #當加密時,待加密的明文是由10字節的0以及待加密的明文string與keyb的md5值的前前16字節以及明文string拼接而成
20     #當解密時,密文即為傳入的string的前4字節以后的內容並解碼
21     string = op == 'decode' and base64.b64decode(string[4:]) or '0000000000' + hashlib.md5(string + keyb).hexdigest()[0:16] + string
22     string_lenth = len(string)
23         
24     result = ''
25     box = list(range(256))
26     randkey = []
27         
28     for i in xrange(255):
29         #隨機填充cryptokey中字符的ascii碼值,會出現4輪的重復,randkey[0]~randkey[63],randkey[64]~randkey[127],……
30         randkey.append(ord(cryptkey[i % key_lenth]))
31     
32     #隨機打亂box列表
33     #cryptkey的真正目的是生成偽隨機的box
34     for i in xrange(255):
35         j = 0
36         j = (j + box[i] + randkey[i]) % 256
37         tmp = box[i]
38         box[i] = box[j]
39         box[j] = tmp
40         
41     for i in xrange(string_lenth):
42         a = j = 0
43         a = (a + 1) % 256
44         j = (j + box[a]) % 256
45         tmp = box[a]
46         box[a] = box[j]
47         box[j] = tmp
48         #以上再次進行了打亂
49 
50         #真正的明文string逐字節與box中的隨機值異或生成加密的result
51         #不管怎么隨機打亂,由於cryptkey以及string_length總是一樣的,因此box最終也一樣
52         result += chr(ord(string[i]) ^ (box[(box[a] + box[j]) % 256]))
53         #解密時,密文在與box異或則返回明文
54     
55     if op == 'decode':
56         #result[10:26] == hashlib.md5(result[26:] + keyb).hexdigest()[0:16],用來驗證string的完整性
57         if (result[0:10] == '0000000000' or int(result[0:10]) - int(time.time()) > 0) and result[10:26] == hashlib.md5(result[26:] + keyb).hexdigest()[0:16]:
58             return result[26:]  #前十字節是0,再16字節是明文string與keyb的md5前16字節,最后的則是string
59         else:
60             return None
61     else:
62         #加密,返回IV+result的base64編碼
63         return keyc + base64.b64encode(result)
64 
65 if __name__ == '__main__':
66     #print rc4('我們','encode','98765')
67     print rc4('fd09GMhYylNXC5t550VwC5oX9WS4zrB0bI9rs6kvTAMoiGI=','decode','98765')

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM