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 代码效率的方法
Jul 03 Python
玩转python爬虫之爬取糗事百科段子
Feb 17 Python
Django数据库表反向生成实例解析
Feb 06 Python
Python扩展内置类型详解
Mar 26 Python
Python使用try except处理程序异常的三种常用方法分析
Sep 05 Python
解决Python 使用h5py加载文件,看不到keys()的问题
Feb 08 Python
详解Python 解压缩文件
Apr 09 Python
Python3获取电脑IP、主机名、Mac地址的方法示例
Apr 11 Python
windows支持哪个版本的python
Jul 03 Python
Python实现封装打包自己写的代码,被python import
Jul 12 Python
python基于openpyxl生成excel文件
Dec 23 Python
梳理总结Python开发中需要摒弃的18个坏习惯
Jan 22 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中3种生成XML文件方法的速度效率比较
2012/10/06 PHP
使用CodeIgniter的类库做图片上传
2014/06/12 PHP
PHP实现手机号码中间四位用星号(*)隐藏的自定义函数分享
2014/09/27 PHP
php array_walk 对数组中的每个元素应用用户自定义函数详解
2016/11/18 PHP
写js时遇到的一些小问题
2010/12/06 Javascript
ASP.NET jQuery 实例9  通过控件hyperlink实现返回顶部效果
2012/02/03 Javascript
js实现的四级左侧网站分类菜单实例
2015/05/06 Javascript
基于jquery实现即时检查格式是否正确的表单
2016/05/06 Javascript
JS/jQ实现免费获取手机验证码倒计时效果
2016/06/13 Javascript
weUI应用之JS常用信息提示弹层的封装
2016/11/21 Javascript
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
2017/10/17 Javascript
在vue项目中引入高德地图及其UI组件的方法
2018/09/04 Javascript
多个Vue项目部署到服务器的步骤记录
2020/10/22 Javascript
python连接mysql数据库示例(做增删改操作)
2013/12/31 Python
Python过滤函数filter()使用自定义函数过滤序列实例
2014/08/26 Python
python使用socket进行简单网络连接的方法
2015/04/29 Python
python爬虫入门教程--快速理解HTTP协议(一)
2017/05/25 Python
Python实现抓取网页生成Excel文件的方法示例
2017/08/05 Python
Python内建模块struct实例详解
2018/02/02 Python
Python爬虫实现全国失信被执行人名单查询功能示例
2018/05/03 Python
python smtplib模块自动收发邮件功能(一)
2018/05/22 Python
Python运维开发之psutil库的使用详解
2018/10/18 Python
Python内置random模块生成随机数的方法
2019/05/31 Python
Python字典对象实现原理详解
2019/07/01 Python
Python split() 函数拆分字符串将字符串转化为列的方法
2019/07/16 Python
python内置模块collections知识点总结
2019/12/19 Python
Python-openCV读RGB通道图实例
2020/01/17 Python
Python 文件数据读写的具体实现
2020/01/24 Python
浅谈Python 参数与变量
2020/06/20 Python
用Python匹配HTML tag的时候,<.*>和<.*?>有什么区别
2012/11/04 面试题
医院总经理职责
2013/12/26 职场文书
《田忌赛马》教学反思
2016/02/19 职场文书
Golang标准库syscall详解(什么是系统调用)
2021/05/25 Golang
Oracle配置dblink访问PostgreSQL的操作方法
2022/03/21 PostgreSQL
Apache Pulsar结合Hudi构建Lakehouse方案分析
2022/03/31 Servers
Python实现将多张图片合成MP4视频并加入背景音乐
2022/04/28 Python