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多线程编程(六):可重入锁RLock
Apr 05 Python
Python实现豆瓣图片下载的方法
May 25 Python
Python脚本实现虾米网签到功能
Apr 12 Python
利用scrapy将爬到的数据保存到mysql(防止重复)
Mar 31 Python
python增加矩阵维度的实例讲解
Apr 04 Python
python实现汽车管理系统
Nov 30 Python
Python实现查找二叉搜索树第k大的节点功能示例
Jan 24 Python
Python 脚本的三种执行方式小结
Dec 21 Python
PyTorch中 tensor.detach() 和 tensor.data 的区别详解
Jan 06 Python
python批量修改xml属性的实现方式
Mar 05 Python
PyTorch中Tensor的数据类型和运算的使用
Sep 03 Python
python 深度学习中的4种激活函数
Sep 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
php中取得URL的根域名的代码
2011/03/23 PHP
fleaphp crud操作之findByField函数的使用方法
2011/04/23 PHP
php session_start()出错原因分析及解决方法
2013/10/28 PHP
详解WordPress中添加和执行动作的函数使用方法
2015/12/29 PHP
安装docker和docker-compose实例详解
2019/07/30 PHP
用js通过url传参把数据从一个页面传到另一个页面
2014/09/01 Javascript
jquery实现一个简单好用的弹出框
2014/09/26 Javascript
JavaScript实现彩虹文字效果的方法
2015/04/16 Javascript
JQuery实现图片轮播效果
2015/09/15 Javascript
js+html5操作sqlite数据库的方法
2016/02/02 Javascript
JQuery中Ajax的操作完整例子
2017/03/07 Javascript
详解用node-images 打造简易图片服务器
2017/05/08 Javascript
easyui datagrid 表格中操作栏 按钮图标不显示的解决方法
2017/07/27 Javascript
jquery tmpl模板(实例讲解)
2017/09/02 jQuery
vue2.0开发入门笔记之.vue文件的生成和使用
2017/09/19 Javascript
在ES5与ES6环境下处理函数默认参数的实现方法
2018/05/13 Javascript
详解Vue2.0组件的继承与扩展
2018/11/23 Javascript
Vue组件Draggable实现拖拽功能
2018/12/01 Javascript
Vue.js中的高级面试题及答案
2020/01/13 Javascript
微信小程序报错: thirdScriptError的错误问题
2020/06/19 Javascript
springboot+vue实现文件上传下载
2020/11/17 Vue.js
[02:48]DOTA2超级联赛专访海涛:你们的选择没有错
2013/06/07 DOTA
python3访问sina首页中文的处理方法
2014/02/24 Python
python调用新浪微博API项目实践
2014/07/28 Python
在Python的Django框架中创建语言文件
2015/07/27 Python
对python 读取线的shp文件实例详解
2018/12/22 Python
Django上使用数据可视化利器Bokeh解析
2019/07/31 Python
Python Lambda函数使用总结详解
2019/12/11 Python
Python使用Pandas库常见操作详解
2020/01/16 Python
香港卓悦化妆品官网:BONJOUR
2017/09/21 全球购物
介绍一下代理模式(Proxy)
2014/10/17 面试题
创业计划书中包含的9个方面
2013/12/26 职场文书
写给学生的新学期寄语
2014/01/18 职场文书
俄语专业毕业生求职信
2014/07/12 职场文书
上课随便讲话检讨书
2014/09/12 职场文书
2015年教师节活动总结
2015/03/20 职场文书