Python中实现的RC4算法


Posted in Python onFebruary 14, 2015

闲暇之时,用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)
Python 相关文章推荐
python练习程序批量修改文件名
Jan 16 Python
Python科学计算环境推荐——Anaconda
Jun 30 Python
在Python中使用元类的教程
Apr 28 Python
Python实现网络端口转发和重定向的方法
Sep 19 Python
python OpenCV学习笔记实现二维直方图
Feb 08 Python
Django Web开发中django-debug-toolbar的配置以及使用
May 06 Python
Python使用reportlab模块生成PDF格式的文档
Mar 11 Python
用Python获取摄像头并实时控制人脸的实现示例
Jul 11 Python
django如何实现视图重定向
Jul 24 Python
django的ORM操作 删除和编辑实现详解
Jul 24 Python
python通过opencv实现图片裁剪原理解析
Jan 19 Python
python中%格式表达式实例用法
Jun 18 Python
Python脚本实现网卡流量监控
Feb 14 #Python
Centos5.x下升级python到python2.7版本教程
Feb 14 #Python
Python脚本实现DNSPod DNS动态解析域名
Feb 14 #Python
Python压缩和解压缩zip文件
Feb 14 #Python
Python简单日志处理类分享
Feb 14 #Python
Python魔术方法详解
Feb 14 #Python
Python中非常实用的一些功能和函数分享
Feb 14 #Python
You might like
一个用mysql_odbc和php写的serach数据库程序
2006/10/09 PHP
php取得字符串首字母的方法
2015/03/25 PHP
大家都应该掌握的PHP关联数组使用技巧
2015/12/25 PHP
Zend Framework教程之Loader以及PluginLoader用法详解
2016/03/09 PHP
php获取目录中所有文件名及判断文件与目录的简单方法
2017/03/04 PHP
Thinkphp5行为使用方法汇总
2017/12/21 PHP
ThinkPHP框架实现的微信支付接口开发完整示例
2019/04/10 PHP
Display SQL Server Version Information
2007/06/21 Javascript
JQuery index()方法使用代码
2010/06/02 Javascript
ExtJs GridPanel简单的增删改实现代码
2010/08/26 Javascript
bootstrap输入框组使用方法
2017/02/07 Javascript
js仿QQ邮箱收件人选择与搜索功能
2017/02/10 Javascript
基于javascript中的typeof和类型判断(详解)
2017/10/27 Javascript
json对象及数组键值的深度大小写转换问题详解
2018/03/30 Javascript
vue生命周期实例小结
2018/08/15 Javascript
基于nodejs的雪碧图制作工具的示例代码
2018/11/05 NodeJs
JS温故而知新之变量提升和时间死区
2019/01/27 Javascript
VSCode搭建Vue项目的方法
2020/04/30 Javascript
[04:54]DOTA2-DPC中国联赛1月31日Recap集锦
2021/03/11 DOTA
python使用循环实现批量创建文件夹示例
2014/03/25 Python
Python Web框架Flask下网站开发入门实例
2015/02/08 Python
浅谈Python 集合(set)类型的操作——并交差
2016/06/30 Python
python用plt画图时,cmp设置方法
2018/12/13 Python
使用python搭建服务器并实现Android端与之通信的方法
2019/06/28 Python
Python反爬虫伪装浏览器进行爬虫
2020/02/28 Python
Python就将所有的英文单词首字母变成大写
2021/02/12 Python
SmartBuyGlasses英国:购买太阳镜和眼镜
2018/01/29 全球购物
印度最好的在线药品订购网站:PharmEasy
2018/11/30 全球购物
个性大学生自我评价
2013/12/04 职场文书
经典团队口号大全
2014/06/21 职场文书
城管执法人员个人对照检查材料思想汇报
2014/09/29 职场文书
关于拾金不昧的感谢信
2015/01/21 职场文书
公司股份转让协议书范本
2015/01/28 职场文书
经理岗位职责
2015/02/02 职场文书
党员证明模板
2015/06/19 职场文书
利用js实现简单开关灯代码
2021/11/23 Javascript