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 snownlp情感分析简易demo(分享)
Jun 04 Python
pandas groupby 分组取每组的前几行记录方法
Apr 20 Python
python保存文件方法小结
Jul 27 Python
解决pip install xxx报错SyntaxError: invalid syntax的问题
Nov 30 Python
PyQt5实现从主窗口打开子窗口的方法
Jun 19 Python
Python获取一个用户名的组ID过程解析
Sep 03 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
Sep 04 Python
Django将默认的SQLite更换为MySQL的实现
Nov 18 Python
Python Django2.0集成Celery4.1教程
Nov 19 Python
Python实现打印实心和空心菱形
Nov 23 Python
python图片验证码识别最新模块muggle_ocr的示例代码
Jul 03 Python
Python制作简单的剪刀石头布游戏
Dec 10 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上的memcache和memcached两个pecl库
2010/03/29 PHP
php unset全局变量运用问题的深入解析
2013/06/17 PHP
codeigniter自带数据库类使用方法说明
2014/03/25 PHP
php格式化日期实例分析
2014/11/12 PHP
PHP针对JSON操作实例分析
2015/01/12 PHP
浅谈php7的重大新特性
2015/10/23 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
2017/09/22 PHP
php使用scandir()函数扫描指定目录下所有文件示例
2019/06/08 PHP
jQuery中wrapAll()方法用法实例
2015/01/16 Javascript
浅谈JavaScript函数的四种存在形态
2016/06/08 Javascript
bootstrap vue.js实现tab效果
2017/02/07 Javascript
基于JavaScript实现的希尔排序算法分析
2017/04/14 Javascript
vue+ElementUI实现订单页动态添加产品数据效果实例代码
2017/07/13 Javascript
AngularJS中的路由使用及实现代码
2017/10/09 Javascript
原生JS获取元素的位置与尺寸实现方法
2017/10/18 Javascript
Vue的路由动态重定向和导航守卫实例
2018/03/17 Javascript
node.js基础知识汇总
2020/08/25 Javascript
[45:16]完美世界DOTA2联赛循环赛 IO vs FTD BO2第二场 11.05
2020/11/06 DOTA
简介Python设计模式中的代理模式与模板方法模式编程
2016/02/02 Python
Python实现求一个集合所有子集的示例
2018/05/04 Python
Python根据欧拉角求旋转矩阵的实例
2019/01/28 Python
python使用Plotly绘图工具绘制散点图、线形图
2019/04/02 Python
django的csrf实现过程详解
2019/07/26 Python
QML使用Python的函数过程解析
2019/09/26 Python
python中文分词库jieba使用方法详解
2020/02/11 Python
cosme官方海外旗舰店:日本最大化妆品和美容产品的综合口碑网站
2017/01/18 全球购物
美国一家运动专业鞋类零售商:Warehouse Shoe Sale(WSS)
2018/03/28 全球购物
北美女性服装零售连锁店:maurices
2019/06/12 全球购物
法学专业个人求职信
2013/09/26 职场文书
汽车维修专业毕业生的求职信分享
2013/12/04 职场文书
高中生打架检讨书1000字
2015/02/17 职场文书
九年级语文教学反思
2016/03/03 职场文书
详解Redis实现限流的三种方式
2021/04/27 Redis
Python爬虫:从m3u8文件里提取小视频的正确操作
2021/05/14 Python
HTML+CSS实现导航条下拉菜单的示例代码
2021/08/02 HTML / CSS
Python+OpenCV实现图片中的圆形检测
2022/04/07 Python