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‘)
时间: 2024-10-02 19:12:53

RC4算法的Python实现详注的相关文章

Dijkstra算法(三)之 Java详解

前面分别通过C和C++实现了迪杰斯特拉算法,本文介绍迪杰斯特拉算法的Java实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法图解 3. 迪杰斯特拉算法的代码说明 4. 迪杰斯特拉算法的源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 迪杰斯特拉算法介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想

python difflib详解

difflib -帮助进行差异化比较 这个模块提供的类和方法用来进行差异化比较,它能够生成文本或者html格式的差异化比较结果,如果需要比较目录的不同,可以使用filecmp模块. class difflib.SequenceMatcher 这是可以用来比较任何类型片段的类,只要比较的片段是可hash的,都可以用来比较,使用非常灵活.他源于1980,s的“完形匹配算法”,并且进行了一系列的优化和改进. 通过对算法的复杂度比较,它由于原始的完形匹配算法,在最坏情况下有n的平方次运算,在最好情况下,

lua rc4算法实现

由于项目需要,用python django写restful接口遇到瓶颈,python django+uwsgi处理请求是会阻塞的, 如果阻塞请求不及时处理,会卡住越来越多的其它的请求,导致越来越多的502.所以将请求处理频繁的,会阻 塞长时间的接口用lua实现,lua放在nginx里跑,还是很快的. 呵呵,费话少说了! 项目因用 到rc4加密算法,但网上实现lua rc4算法的很少,有的要依赖lua第三方库,很不方便.根据wiki实 现自己的算法: -- RC4 -- http://en.wik

机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)

机器学习算法与Python实践这个系列主要是参考<机器学习实战>这本书.因为自己想学习Python,然后也想对一些机器学习算法加深下了解,所以就想通过Python来实现几个比较常用的机器学习算法.恰好遇见这本同样定位的书籍,所以就参考这本书的过程来学习了. 这节学习的是逻辑回归(Logistic Regression),也算进入了比较正统的机器学习算法.啥叫正统呢?我概念里面机器学习算法一般是这样一个步骤: 1)对于一个问题,我们用数学语言来描述它,然后建立一个模型,例如回归模型或者分类模型等

Python数据类型详解——列表

Python数据类型详解--列表 在"Python之基本数据类型概览"一节中,大概介绍了列表的基本用法,本节我们详细学一下列表. 如何定义列表:在[]内以英文里输入法的逗号,,按照索引,存放各种数据类型,每个位置代表一个元素. 回顾一下列表的特点: 1.可存放多个值. 2.按照从左到右的顺序定义列表元素,下标从0开始顺序访问,是有序的. 3.可修改指定索引位置对应的值,可变. 一.列表元素的增加操作 1.追加 用append方法将数据追加到列表的尾部 names = ['Kwan',

《机器学习实战》之K-均值聚类算法的python实现

<机器学习实战>之K-均值聚类算法的python实现 最近的项目是关于"基于数据挖掘的电路故障分析",项目基本上都是师兄们在做,我只是在研究关于项目中用到的如下几种算法:二分均值聚类.最近邻分类.基于规则的分类器以及支持向量机.基于项目的保密性(其实也没有什么保密的,但是怕以后老板看到我写的这篇博文,所以,你懂的),这里就不介绍"基于数据挖掘的电路故障分析"的思路了. 废话不多说了,开始正题哈. 基本K-均值聚类算法 基本K均值算法的基本思路为:首先选择

python正则表达式详解

python正则表达式详解 正则表达式是一个很强大的字符串处理工具,几乎任何关于字符串的操作都可以使用正则表达式来完成,作为一个爬虫工作者,每天和字符串打交道,正则表达式更是不可或缺的技能,正则表达式的在不同的语言中使用方式可能不一样,不过只要学会了任意一门语言的正则表达式用法,其他语言中大部分也只是换了个函数的名称而已,本质都是一样的.下面,我来介绍一下python中的正则表达式是怎么使用的. 首先,python中的正则表达式大致分为以下几部分: 元字符 模式 函数 re 内置对象用法 分组用

《机器学习实战》之二分K-均值聚类算法的python实现

<机器学习实战>之二分K-均值聚类算法的python实现 上面博文介绍了K-均值聚类算法及其用python实现,上篇博文中的两张截图,我们可以看到,由于K-均值聚类算法中由于初始质心的选取,会造成聚类的局部最优,并不是全局最优,因此,会造成聚类的效果并不理想,为克服K-均值算法收敛于局部最小值的问题,就有了二分K-均值算法. 二分K-均值聚类算法 二分K均值算法是基本K均值算法的直接扩充,其基本思想是:为了得到K个簇,首先将所有点的集合分裂成两个簇,然后从这些簇中选取一个继续分裂,迭代直到产生

python线程详解

#线程状态 #线程同步(锁)#多线程的优势在于可以同时运行多个任务,至少感觉起来是这样,但是当线程需要共享数据时,可能存在数据不同步的问题. #threading模块#常用方法:'''threading.currentThread():返回当前的线程变量threading.enumerate():返回一个包含正在运行的线程的list,正在运行指:线程启动后,结束前,不包含启动前和终止后的线程threading.activeCount():返回正在运行的线程数量,与len(threading.en