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中定义结构体的方法
Mar 04 Python
python使用socket进行简单网络连接的方法
Apr 29 Python
Python实现一个服务器监听多个客户端请求
Apr 12 Python
对python 读取线的shp文件实例详解
Dec 22 Python
python pandas库的安装和创建
Jan 10 Python
用python做游戏的细节详解
Jun 25 Python
pytorch多进程加速及代码优化方法
Aug 19 Python
python元组和字典的内建函数实例详解
Oct 22 Python
Python实现CNN的多通道输入实例
Jan 17 Python
Django模型中字段属性choice使用说明
Mar 30 Python
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
Aug 18 Python
Pytest单元测试框架如何实现参数化
Sep 05 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
PHP Parse Error: syntax error, unexpected $end 错误的解决办法
2012/06/05 PHP
基于PHP实现通过照片获取ip地址
2016/04/26 PHP
Netbeans 8.2与PHP相关的新特性介绍
2016/10/08 PHP
php如何获取Http请求
2020/04/30 PHP
javascript 硬盘序列号+其它硬件信息
2008/12/23 Javascript
JS 强制设为首页的代码
2009/01/31 Javascript
用js脚本控制asp.net下treeview的NodeCheck的实现代码
2010/03/02 Javascript
jquery 获取 outerHtml 包含当前节点本身的代码
2014/10/30 Javascript
JavaScript中string转换成number介绍
2014/12/31 Javascript
JS使用ajax从xml文件动态获取数据显示的方法
2015/03/24 Javascript
JS实现鼠标滑过链接改变网页背景颜色的方法
2015/10/20 Javascript
详解nodejs 文本操作模块-fs模块(五)
2016/12/23 NodeJs
BootStrap栅格系统、表单样式与按钮样式源码解析
2017/01/20 Javascript
详谈表单重复提交的三种情况及解决方法
2017/08/16 Javascript
微信小程序网络封装(简单高效)
2018/08/06 Javascript
vue-mugen-scroll组件实现pc端滚动刷新
2019/08/16 Javascript
手把手15分钟搭一个企业级脚手架
2019/09/16 Javascript
安装多版本Vue-CLI的实现方法
2020/03/24 Javascript
python抓取网页时字符集转换问题处理方案分享
2014/06/19 Python
python线程池threadpool实现篇
2018/04/27 Python
Python 从相对路径下import的方法
2018/12/04 Python
Django 日志配置按日期滚动的方法
2019/01/31 Python
Python学习笔记之文件的读写操作实例分析
2019/08/07 Python
python3注册全局热键的实现
2020/03/22 Python
Pycharm如何导入python文件及解决报错问题
2020/05/10 Python
html5写一个BUI折叠菜单插件的实现方法
2019/09/11 HTML / CSS
英国床垫和床架购物网站:Bedman
2019/11/04 全球购物
如何进行有效的自我评价
2013/09/27 职场文书
《蚕姑娘》教学反思
2014/04/15 职场文书
给校长的建议书300字
2014/05/16 职场文书
2015年营销工作总结范文
2015/04/23 职场文书
整脏治乱工作简报
2015/07/21 职场文书
小学数学继续教育研修日志
2015/11/13 职场文书
2016年七夕爱情寄语
2015/12/04 职场文书
小学生节约用水倡议书
2019/08/12 职场文书
关于Spring配置文件加载方式变化引发的异常详解
2022/01/18 Java/Android