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 26 Python
解决python3 urllib中urlopen报错的问题
Mar 25 Python
python生成词云的实现方法(推荐)
Jun 13 Python
PyCharm安装第三方库如Requests的图文教程
May 18 Python
Python pandas.DataFrame调整列顺序及修改index名的方法
Jun 21 Python
Django框架视图介绍与使用详解
Jul 18 Python
详解如何从TensorFlow的mnist数据集导出手写体数字图片
Aug 05 Python
详解python中的模块及包导入
Aug 30 Python
keras获得某一层或者某层权重的输出实例
Jan 24 Python
jupyter notebook参数化运行python方式
Apr 10 Python
python中执行smtplib失败的处理方法
Jul 01 Python
python爬不同图片分别保存在不同文件夹中的实现
Apr 02 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中使用Oracle数据库(6)
2006/10/09 PHP
PHP脚本的10个技巧(8)
2006/10/09 PHP
php 记录进行累加并显示总时长为秒的结果
2011/11/04 PHP
ThinkPHP行为扩展Behavior应用实例详解
2014/07/22 PHP
PHP重定向与伪静态区别
2017/02/19 PHP
laravel清除视图缓存的代码
2019/10/23 PHP
parseInt parseFloat js字符串转换数字
2010/08/01 Javascript
Jquery中获取iframe的代码
2011/01/11 Javascript
jQuery实现首页顶部可伸缩广告特效代码
2015/04/15 Javascript
JS中的==运算: [''] == false —>true
2016/07/24 Javascript
jQuery Easyui加载表格出错时在表格中间显示自定义的提示内容
2016/12/08 Javascript
Bootstrap实现基于carousel.js框架的轮播图效果
2017/05/02 Javascript
详解vue2父组件传递props异步数据到子组件的问题
2017/06/29 Javascript
基于easyui checkbox 的一些操作处理方法
2017/07/10 Javascript
JavaScript时间戳与时间日期间相互转换
2017/12/11 Javascript
vue2.0 datepicker使用方法
2018/02/04 Javascript
Angularjs 根据一个select的值去设置另一个select的值方法
2018/08/13 Javascript
vue鼠标移入添加class样式,鼠标移出去除样式(active)实现方法
2018/08/22 Javascript
JS数组扁平化(flat)方法总结详解
2019/06/24 Javascript
js实现无刷新监听URL的变化示例代码详解
2020/06/03 Javascript
JS操作JSON常用方法(10w阅读)
2020/12/06 Javascript
python实现比较文件内容异同
2018/06/22 Python
python xpath获取页面注释的方法
2019/01/14 Python
pyqt5 comboBox获得下标、文本和事件选中函数的方法
2019/06/14 Python
Python pandas.DataFrame调整列顺序及修改index名的方法
2019/06/21 Python
解决Pytorch 训练与测试时爆显存(out of memory)的问题
2019/08/20 Python
Pandas实现DataFrame按行求百分数(比例数)
2019/12/27 Python
关于Tensorflow分布式并行策略
2020/02/03 Python
利用CSS3的flexbox实现水平垂直居中与三列等高布局
2016/09/12 HTML / CSS
纽约通行卡:The New York Pass(免费游览纽约90多个景点)
2017/07/29 全球购物
计生办班子群众路线教育实践活动个人对照检查材料思想汇报
2014/10/04 职场文书
2014年采购工作总结
2014/11/20 职场文书
社会实践单位意见
2015/06/05 职场文书
详解SpringBoot异常处理流程及原理
2021/06/21 Java/Android
使用canvas对video视频某一刻截图功能
2021/09/25 HTML / CSS
css3新特性的应用示例分析
2022/03/16 HTML / CSS