當前位置:編程學習大全網 - 源碼下載 - 求壹段 PHP 和 Python 的 RC4 加解密代碼

求壹段 PHP 和 Python 的 RC4 加解密代碼

剛對RC4算法進行了學習,網上發現mory.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字節的keyb10 11 #當加密時,keyc取time.time()的md5前4字節,用作IV12 #當解密時,從密文的前4字節取出IV13 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) #6418 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] + string22 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的真正目的是生成偽隨機的box34 for i in xrange(255):35 j = 036 j = (j + box[i] + randkey[i]) % 25637 tmp = box[i]38 box[i] = box[j]39 box[j] = tmp40 41 for i in xrange(string_lenth):42 a = j = 043 a = (a + 1) % 25644 j = (j + box[a]) % 25645 tmp = box[a]46 box[a] = box[j]47 box[j] = tmp48 #以上再次進行了打亂49 50 #真正的明文string逐字節與box中的隨機值異或生成加密的result51 #不管怎麽隨機打亂,由於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字節,最後的則是string59 else:60 return None61 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')

  • 上一篇:ASe是什麽意思?
  • 下一篇:怎樣建立壹個自己的小說網?
  • copyright 2024編程學習大全網