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实现简单状态框架的方法
Mar 19 Python
Python发送以整个文件夹的内容为附件的邮件的教程
May 06 Python
Python 3实战爬虫之爬取京东图书的图片详解
Oct 09 Python
python自动截取需要区域,进行图像识别的方法
May 17 Python
详解将Django部署到Centos7全攻略
Sep 26 Python
Pycharm设置utf-8自动显示方法
Jan 17 Python
Python使用MyQR制作专属动态彩色二维码功能
Jun 04 Python
在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法
Jun 18 Python
如何定义TensorFlow输入节点
Jan 23 Python
python误差棒图errorbar()函数实例解析
Feb 11 Python
Pycharm github配置实现过程图解
Oct 13 Python
如何正确理解python装饰器
Jun 15 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(三)
2012/03/22 PHP
php解决约瑟夫环示例
2014/04/09 PHP
php调用shell的方法
2014/11/05 PHP
php通过修改header强制图片下载的方法
2015/03/24 PHP
PHP实现的构造sql语句类实例
2016/02/03 PHP
小议Function.apply()之二------利用Apply的参数数组化来提高 JavaScript程序性能
2006/11/30 Javascript
javascript firefox兼容ie的dom方法脚本
2008/05/18 Javascript
使用JQUERY Tabs插件宿主IFRAMES
2010/01/01 Javascript
Extjs407 getValue()和getRawValue()区别介绍
2013/05/21 Javascript
jQuery Trim去除字符串首尾空字符的实现方法说明
2014/02/11 Javascript
javascript使用正则表达式实现去掉空格之后的字符
2015/02/15 Javascript
使用jQuery+EasyUI实现CheckBoxTree的级联选中特效
2015/12/06 Javascript
学习jQuey中的return false
2015/12/18 Javascript
JavaScript实现鼠标点击导航栏变色特效
2017/02/08 Javascript
AngularJs导出数据到Excel的示例代码
2017/08/11 Javascript
详解Nodejs mongoose
2018/06/10 NodeJs
详解Webpack多环境代码打包的方法
2018/08/03 Javascript
Node.js API详解之 zlib模块用法分析
2020/05/19 Javascript
Vue点击切换Class变化,实现Active当前样式操作
2020/07/17 Javascript
[01:01:01]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第一场 10.29
2020/10/29 DOTA
Python程序员鲜为人知但你应该知道的17个问题
2014/06/04 Python
Python内置函数dir详解
2015/04/14 Python
python中base64加密解密方法实例分析
2015/05/16 Python
Python实现的概率分布运算操作示例
2017/08/14 Python
python基于socket函数实现端口扫描
2020/05/28 Python
基于keras中的回调函数用法说明
2020/06/17 Python
日本最大的眼镜购物网站:Oh My Glasses
2016/11/13 全球购物
美国礼品卡商城: Gift Card Mall
2017/08/25 全球购物
英国男女豪华配饰和礼品网站:Black.co.uk
2020/02/28 全球购物
《悯农》教学反思
2014/04/28 职场文书
拒绝黄毒毒宣传标语
2014/06/26 职场文书
2014年大学生党员自我评议
2014/09/22 职场文书
四风问题自我剖析材料
2014/10/07 职场文书
会计工作检讨书
2015/02/19 职场文书
2015年教师师德师风承诺书
2015/04/28 职场文书
Redis主从配置和底层实现原理解析(实战记录)
2021/06/30 Redis