Python中实现的RC4算法

时间:2022-05-19 23:19:27

闲暇之时,用Python实现了一下RC4算法

编码 UTF-8

class 方式

  1. #/usr/bin/python 
  2. #coding=utf-8 
  3.   
  4. import sys,os,hashlib,time,base64 
  5. class rc4: 
  6.   
  7.   def __init__(self,public_key = None,ckey_lenth = 16): 
  8.     self.ckey_lenth = ckey_lenth 
  9.     self.public_key = public_key or 'none_public_key' 
  10.     key = hashlib.md5(self.public_key).hexdigest() 
  11.     self.keya = hashlib.md5(key[0:16]).hexdigest() 
  12.     self.keyb = hashlib.md5(key[16:32]).hexdigest() 
  13.     self.keyc = '' 
  14.   
  15.   def encode(self,string): 
  16.     self.keyc = hashlib.md5(str(time.time())).hexdigest()[32 - self.ckey_lenth:32] 
  17.     string = '0000000000' + hashlib.md5(string + self.keyb).hexdigest()[0:16] + string 
  18.     self.result = '' 
  19.     self.docrypt(string) 
  20.     return self.keyc + base64.b64encode(self.result) 
  21.   
  22.   def decode(self,string): 
  23.     self.keyc = string[0:self.ckey_lenth] 
  24.     string = base64.b64decode(string[self.ckey_lenth:]) 
  25.     self.result = '' 
  26.     self.docrypt(string) 
  27.     result = self.result 
  28.     if (result[0:10] == '0000000000' or int(result[0:10]) - int(time.time()) > 0) and result[10:26] == hashlib.md5(result[26:] + self.keyb).hexdigest()[0:16]: 
  29.       return result[26:] 
  30.     else
  31.       return None 
  32.   
  33.   def docrypt(self,string): 
  34.     string_lenth = len(string) 
  35.     result = '' 
  36.     box = list(range(256)) 
  37.     randkey = [] 
  38.   
  39.     cryptkey = self.keya + hashlib.md5(self.keya + self.keyc).hexdigest() 
  40.     key_lenth = len(cryptkey) 
  41.   
  42.     for i in xrange(255): 
  43.       randkey.append(ord(cryptkey[i % key_lenth])) 
  44.   
  45.     for i in xrange(255): 
  46.       j = 0 
  47.       j = (j + box[i] + randkey[i]) % 256 
  48.       tmp = box[i] 
  49.       box[i] = box[j] 
  50.       box[j] = tmp 
  51.   
  52.     for i in xrange(string_lenth): 
  53.       a = j = 0 
  54.       a = (a + 1) % 256 
  55.       j = (j + box[a]) % 256 
  56.       tmp = box[a] 
  57.       box[a] = box[j] 
  58.       box[j] = tmp 
  59.       self.result += chr(ord(string[i]) ^ (box[(box[a] + box[j]) % 256])) 

测试:

  1. rc = rc4('nishidahuaidan'
  2. string = '我在这里呢,你在那里呢' 
  3. print(string) 
  4. str = rc.encode(string) 
  5. print(str) 
  6. str = rc.decode(str) 
  7. print(str) 

function方式

  1. #/usr/bin/python 
  2. #coding=utf-8 
  3.   
  4. import sys,os,hashlib,time,base64 
  5.   
  6. def rc4(string, op = 'encode', public_key = 'ddd', expirytime = 0): 
  7.   ckey_lenth = 4 
  8.   public_key = public_key and public_key or '' 
  9.   key = hashlib.md5(public_key).hexdigest() 
  10.   keya = hashlib.md5(key[0:16]).hexdigest() 
  11.   keyb = hashlib.md5(key[16:32]).hexdigest() 
  12.   keyc = ckey_lenth and (op == 'decode' and string[0:ckey_lenth] or hashlib.md5(str(time.time())).hexdigest()[32 - ckey_lenth:32]) or '' 
  13.   cryptkey = keya + hashlib.md5(keya + keyc).hexdigest() 
  14.   key_lenth = len(cryptkey) 
  15.   string = op == 'decode' and base64.b64decode(string[4:]) or '0000000000' + hashlib.md5(string + keyb).hexdigest()[0:16] + string 
  16.   string_lenth = len(string) 
  17.   
  18.   result = '' 
  19.   box = list(range(256)) 
  20.   randkey = [] 
  21.   
  22.   for i in xrange(255): 
  23.     randkey.append(ord(cryptkey[i % key_lenth])) 
  24.   
  25.   for i in xrange(255): 
  26.     j = 0 
  27.     j = (j + box[i] + randkey[i]) % 256 
  28.     tmp = box[i] 
  29.     box[i] = box[j] 
  30.     box[j] = tmp 
  31.   
  32.   for i in xrange(string_lenth): 
  33.     a = j = 0 
  34.     a = (a + 1) % 256 
  35.     j = (j + box[a]) % 256 
  36.     tmp = box[a] 
  37.     box[a] = box[j] 
  38.     box[j] = tmp 
  39.     result += chr(ord(string[i]) ^ (box[(box[a] + box[j]) % 256])) 
  40.   
  41.   if op == 'decode'
  42.     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]: 
  43.       return result[26:] 
  44.     else
  45.       return None 
  46.   else
  47.     return keyc + base64.b64encode(result) 

测试:

  1. string = '我在这里呢,你在那里呢' 
  2. print(string) 
  3. str = rc4(string,'encode'
  4. print(str) 
  5. rc = rc4(str,'decode'
  6. print(rc)