Python中实现的RC4算法

476次阅读  |  发布于5年以前

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

编码 UTF-8

class 方式


    #/usr/bin/python
    #coding=utf-8

    import sys,os,hashlib,time,base64
    class rc4:

      def __init__(self,public_key = None,ckey_lenth = 16):
        self.ckey_lenth = ckey_lenth
        self.public_key = public_key or 'none_public_key'
        key = hashlib.md5(self.public_key).hexdigest()
        self.keya = hashlib.md5(key[0:16]).hexdigest()
        self.keyb = hashlib.md5(key[16:32]).hexdigest()
        self.keyc = ''

      def encode(self,string):
        self.keyc = hashlib.md5(str(time.time())).hexdigest()[32 - self.ckey_lenth:32]
        string = '0000000000' + hashlib.md5(string + self.keyb).hexdigest()[0:16] + string
        self.result = ''
        self.docrypt(string)
        return self.keyc + base64.b64encode(self.result)

      def decode(self,string):
        self.keyc = string[0:self.ckey_lenth]
        string = base64.b64decode(string[self.ckey_lenth:])
        self.result = ''
        self.docrypt(string)
        result = self.result
        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]:
          return result[26:]
        else:
          return None

      def docrypt(self,string):
        string_lenth = len(string)
        result = ''
        box = list(range(256))
        randkey = []

        cryptkey = self.keya + hashlib.md5(self.keya + self.keyc).hexdigest()
        key_lenth = len(cryptkey)

        for i in xrange(255):
          randkey.append(ord(cryptkey[i % key_lenth]))

        for i in xrange(255):
          j = 0
          j = (j + box[i] + randkey[i]) % 256
          tmp = box[i]
          box[i] = box[j]
          box[j] = tmp

        for i in xrange(string_lenth):
          a = j = 0
          a = (a + 1) % 256
          j = (j + box[a]) % 256
          tmp = box[a]
          box[a] = box[j]
          box[j] = tmp
          self.result += chr(ord(string[i]) ^ (box[(box[a] + box[j]) % 256]))

测试:


    rc = rc4('nishidahuaidan')
    string = '我在这里呢,你在那里呢'
    print(string)
    str = rc.encode(string)
    print(str)
    str = rc.decode(str)
    print(str)

function方式


    #/usr/bin/python
    #coding=utf-8

    import sys,os,hashlib,time,base64

    def rc4(string, op = 'encode', public_key = 'ddd', expirytime = 0):
      ckey_lenth = 4
      public_key = public_key and public_key or ''
      key = hashlib.md5(public_key).hexdigest()
      keya = hashlib.md5(key[0:16]).hexdigest()
      keyb = hashlib.md5(key[16:32]).hexdigest()
      keyc = ckey_lenth and (op == 'decode' and string[0:ckey_lenth] or hashlib.md5(str(time.time())).hexdigest()[32 - ckey_lenth:32]) or ''
      cryptkey = keya + hashlib.md5(keya + keyc).hexdigest()
      key_lenth = len(cryptkey)
      string = op == 'decode' and base64.b64decode(string[4:]) or '0000000000' + hashlib.md5(string + keyb).hexdigest()[0:16] + string
      string_lenth = len(string)

      result = ''
      box = list(range(256))
      randkey = []

      for i in xrange(255):
        randkey.append(ord(cryptkey[i % key_lenth]))

      for i in xrange(255):
        j = 0
        j = (j + box[i] + randkey[i]) % 256
        tmp = box[i]
        box[i] = box[j]
        box[j] = tmp

      for i in xrange(string_lenth):
        a = j = 0
        a = (a + 1) % 256
        j = (j + box[a]) % 256
        tmp = box[a]
        box[a] = box[j]
        box[j] = tmp
        result += chr(ord(string[i]) ^ (box[(box[a] + box[j]) % 256]))

      if op == 'decode':
        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]:
          return result[26:]
        else:
          return None
      else:
        return keyc + base64.b64encode(result)

测试:


    string = '我在这里呢,你在那里呢'
    print(string)
    str = rc4(string,'encode')
    print(str)
    rc = rc4(str,'decode')
    print(rc)

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8