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递归计算N!的方法
May 05 Python
Python实现SMTP发送邮件详细教程
Mar 02 Python
python实现获取Ip归属地等信息
Aug 27 Python
python读取与写入csv格式文件的示例代码
Dec 16 Python
对python实现二维函数高次拟合的示例详解
Dec 29 Python
对python 自定义协议的方法详解
Feb 13 Python
python程序运行进程、使用时间、剩余时间显示功能的实现代码
Jul 11 Python
Python通过cv2读取多个USB摄像头
Aug 28 Python
pytorch 准备、训练和测试自己的图片数据的方法
Jan 10 Python
python3爬取torrent种子链接实例
Jan 16 Python
OpenCV+python实现实时目标检测功能
Jun 24 Python
Python操作Word批量生成合同的实现示例
Aug 28 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来处理多个提交任务
2008/05/08 PHP
php守护进程 加linux命令nohup实现任务每秒执行一次
2011/07/04 PHP
PHP中使用crypt()实现用户身份验证的代码
2012/09/05 PHP
laravel安装和配置教程
2014/10/29 PHP
php简单随机字符串生成方法示例
2017/04/19 PHP
PHP实现十进制、二进制、八进制和十六进制转换相关函数用法分析
2017/04/25 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
基于PHP+Mysql简单实现了图书购物车系统的实例详解
2020/08/06 PHP
jquery select操作的日期联动实现代码
2009/12/06 Javascript
Extjs优化(二)Form表单提交通用实现
2013/04/15 Javascript
JavaScript中使用Substring删除字符串最后一个字符
2013/11/03 Javascript
用jquery的方法制作一个简单的导航栏
2014/06/23 Javascript
常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全(推荐)
2016/12/20 Javascript
JS实现搜索关键词的智能提示功能
2017/07/07 Javascript
关闭Vue计算属性自带的缓存功能方法
2018/03/02 Javascript
jQuery实现每隔一段时间自动更换样式的方法分析
2018/05/03 jQuery
el-select 下拉框多选实现全选的实现
2019/08/02 Javascript
ES2020系列之空值合并运算符 '??'
2020/07/22 Javascript
[00:53]TI3正赛第三天 DK怒破A队不败金身 现场国旗飘扬热血激昂
2013/08/10 DOTA
[01:20]DOTA2 齐天大圣至宝动态展示
2016/12/13 DOTA
Python线程中对join方法的运用的教程
2015/04/09 Python
Python3爬虫爬取百姓网列表并保存为json功能示例【基于request、lxml和json模块】
2018/12/05 Python
Flask 上传自定义头像的实例详解
2020/01/09 Python
HTML5视频播放插件 video.js介绍
2018/09/29 HTML / CSS
html5手机键盘弹出收起的处理
2020/01/20 HTML / CSS
美国卡车、吉普车和SUV零件网站:4 Wheel Parts
2016/11/24 全球购物
销售副总经理岗位职责
2013/12/11 职场文书
银行行长竞聘演讲稿
2014/04/23 职场文书
信访工作经验交流材料
2014/05/23 职场文书
运动会演讲稿200字
2014/08/25 职场文书
四风问题对照检查整改措施思想报告
2014/10/05 职场文书
2014年学校法制宣传日活动总结
2014/11/01 职场文书
2017年寒假社区服务活动总结
2016/04/06 职场文书
Python按顺序遍历并读取文件夹中文件
2022/04/29 Python
MySQL 计算连续登录天数
2022/05/11 MySQL
Windows Server 版本 20H2 于 8 月 9 日停止支持,Win10 版本 21H1 将于 12 月结束支
2022/07/23 数码科技