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显示进度条的方法
Sep 20 Python
python将每个单词按空格分开并保存到文件中
Mar 19 Python
python字符串与url编码的转换实例
May 10 Python
Python中的groupby分组功能的实例代码
Jul 11 Python
python 找出list中最大或者最小几个数的索引方法
Oct 30 Python
python+PyQT实现系统桌面时钟
Jun 16 Python
Scrapy框架爬取西刺代理网免费高匿代理的实现代码
Feb 22 Python
Python实现二叉搜索树BST的方法示例
Jul 30 Python
python+selenium定时爬取丁香园的新型冠状病毒数据并制作出类似的地图(部署到云服务器)
Feb 09 Python
在python3.64中安装pyinstaller库的方法步骤
Jun 02 Python
Python collections.defaultdict模块用法详解
Jun 18 Python
python实现简单的名片管理系统
Apr 26 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
用文本文件制作留言板提示(上)
2006/10/09 PHP
php中模拟POST传递数据的两种方法分享
2011/09/16 PHP
PHP字符过滤函数去除字符串最后一个逗号(rtrim)
2013/03/26 PHP
Discuz批量替换帖子内容的方法(使用SQL更新数据库)
2014/06/23 PHP
浅析Yii2中GridView常见操作
2016/04/22 PHP
全面解析PHP操作Memcache基本函数
2016/07/14 PHP
php登录超时检测功能实例详解
2017/03/21 PHP
PHP策略模式定义与用法示例
2017/07/27 PHP
Yii使用EasyWechat实现小程序获取用户的openID的方法
2020/04/29 PHP
js loading加载效果实现代码
2009/11/24 Javascript
js实现可拖动DIV的方法
2013/12/17 Javascript
javascript拖拽应用实例
2016/03/25 Javascript
Angularjs在初始化未完毕时出现闪烁问题的解决方法分析
2016/08/05 Javascript
JavaScript实现点击按钮复制指定区域文本(推荐)
2016/11/25 Javascript
JavaScript中的子窗口与父窗口的互相调用问题
2017/02/08 Javascript
详解angularjs结合pagination插件实现分页功能
2017/02/10 Javascript
JavaScript中的return布尔值的用法和原理解析
2017/08/14 Javascript
详解vue-cli+element-ui树形表格(多级表格折腾小计)
2019/04/17 Javascript
jQuery实现计算器功能
2020/10/19 jQuery
antd日期选择器禁止选择当天之前的时间操作
2020/10/29 Javascript
python动态参数用法实例分析
2015/05/25 Python
python中list常用操作实例详解
2015/06/03 Python
OpenCV-Python实现轮廓检测实例分析
2018/01/05 Python
Python字典遍历操作实例小结
2019/03/05 Python
Python合并同一个文件夹下所有PDF文件的方法
2019/03/11 Python
pandas 数据结构之Series的使用方法
2019/06/21 Python
浅谈amaze-ui中datepicker和datetimepicker注意的几点
2020/08/21 HTML / CSS
英国女性运动服品牌:Sweaty Betty
2018/11/08 全球购物
营业员个人总结的自我评价
2013/10/25 职场文书
优质服务活动实施方案
2014/05/02 职场文书
敬老院院长事迹材料
2014/05/21 职场文书
个人委托书如何写
2014/09/25 职场文书
党的群众路线教育实践活动领导班子整改措施
2014/09/30 职场文书
2015年暑期见闻
2015/07/14 职场文书
给领导敬酒词
2015/08/12 职场文书
详解MySQL数据库千万级数据查询和存储
2021/05/18 MySQL