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字符串、元组、列表、字典互相转换的方法
Jan 23 Python
利用selenium 3.7和python3添加cookie模拟登陆的实现
Nov 20 Python
python 定义n个变量方法 (变量声明自动化)
Nov 10 Python
python脚本当作Linux中的服务启动实现方法
Jun 28 Python
python创建子类的方法分析
Nov 28 Python
Python Pandas 转换unix时间戳方式
Dec 07 Python
python机器学习库xgboost的使用
Jan 20 Python
Windows下Anaconda和PyCharm的安装与使用详解
Apr 23 Python
python3.6.8 + pycharm + PyQt5 环境搭建的图文教程
Jun 11 Python
Python字符串split及rsplit方法原理详解
Jun 29 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
Nov 18 Python
Pycharm连接远程服务器并远程调试的全过程
Jun 24 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 开发环境配置(Zend Studio)
2010/04/28 PHP
php多线程并发实现方法
2016/09/30 PHP
实例讲解YII2中多表关联的使用方法
2017/07/21 PHP
PHP实现的多维数组排序算法分析
2018/02/10 PHP
PHP常用日期加减计算方法实例小结
2018/07/31 PHP
PHP bin2hex()函数基础实例讲解
2019/02/11 PHP
Laravel5.0+框架邮件发送功能实现方法图文与实例详解
2019/04/23 PHP
jcrop基本参数一览
2013/07/16 Javascript
原生JavaScript实现连连看游戏(附源码)
2013/11/05 Javascript
从零学JS之你需要了解的几本书
2014/05/19 Javascript
nodejs 提示‘xxx’ 不是内部或外部命令解决方法
2014/11/20 NodeJs
jQuery中document与window以及load与ready 区别详解
2014/12/29 Javascript
js实现的倒计时按钮实例
2015/06/24 Javascript
jQuery mobile 移动web(4)
2015/12/20 Javascript
JavaScript对象参数的引用传递
2016/01/14 Javascript
React Native 图片查看组件的方法
2018/03/01 Javascript
vue.js父子组件通信动态绑定的实例
2018/09/28 Javascript
微信小程序带动画弹窗组件使用方法详解
2018/11/27 Javascript
layui监听工具栏的实例(操作列表按钮)
2019/09/10 Javascript
vue 开发企业微信整合案例分析
2019/12/02 Javascript
JS写滑稽笑脸运动效果
2020/05/28 Javascript
vue + el-form 实现的多层循环表单验证
2020/11/25 Vue.js
JS获取一个字符串中指定字符串第n次出现的位置
2021/02/10 Javascript
vue前端和Django后端如何查询一定时间段内的数据
2021/02/28 Vue.js
Python实现检测服务器是否可以ping通的2种方法
2015/01/01 Python
从局部变量和全局变量开始全面解析Python中变量的作用域
2016/06/16 Python
Python Tkinter实现简易计算器功能
2018/01/30 Python
简单了解django orm中介模型
2019/07/30 Python
Python3.6+selenium2.53.6自动化测试_读取excel文件的方法
2019/09/06 Python
keras K.function获取某层的输出操作
2020/06/29 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
2020/08/07 Python
Python 实现二叉查找树的示例代码
2020/12/21 Python
Python使用paramiko连接远程服务器执行Shell命令的实现
2021/03/04 Python
软件测试笔试题
2012/10/25 面试题
婚礼答谢词
2015/01/04 职场文书
MongoDB balancer的使用详解
2021/04/30 MongoDB