zoukankan      html  css  js  c++  java
  • 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')
  • 相关阅读:
    Linux 安装nginx
    Linux服务器svn与项目同步
    Linux服务器安装svn
    Thinkphp5模板继承
    Thinkphp5 Route用法
    一键切换hosts文件
    lnmp手动新建虚拟机
    wamp 配置虚拟主机
    百度编辑器
    百度编辑器:上传图片二
  • 原文地址:https://www.cnblogs.com/darkpig/p/5849161.html
Copyright © 2011-2022 走看看