RC4文件加密的python实现方法


Posted in Python onJune 30, 2015

本文实例讲述了RC4文件加密的python实现方法。分享给大家供大家参考。具体分析如下:

基于RC4流加密算法,使用扩展的16*16的S盒,32字节密钥。
目前应该是比较安全的。
 
刚学习python,好不容易调通了。
而且在VC和python下各实现了一遍,两个平台能够互相加解密,很有成就感的说。
 
下面是python3.0中的实现,在2.x下需要稍加修改。

# for python 3.0
# from 李勃
import struct,sys,os,binascii
"""
  RC4加密算法
  16*16 S盒
  加密单元:short
"""
def RC4(pkey,keylen,pin,dlen):
  N=65536
  S = list(range(N))
  j = 0
  for i in range(N):
    j = (j + S[i] + pkey[i%keylen])%N
    temp = S[i]
    S[i] = S[j]
    S[j] = temp
  i = j = 0
  pout= b''
  for x in range(dlen):
    i = i+1
    j = (j + S[i])%N
    temp = S[i]
    S[i] = S[j]
    S[j] = temp
    pout += struct.pack('H',pin[x]^S[(S[i]+S[j])%N])
  return(pout)
# bytes->short
def Coding(data):
  if(len(data)%2):
    data+=b'\0'
  dlen = len(data)//2
  return(struct.unpack(str(dlen)+'H',data))
# short->bytes
def unCoding(data):
  d=b''
  for i in range(len(data)):
    d += struct.pack('H',data[i])
  return(d)
#产生32字节密钥
def CreatKey(Keyt):
  pl = len(Keyt)
  Key=b''
  r=0
  for i in range(32):
    k=(Keyt[r%pl]+i)%256
    Key+= struct.pack('B',k)
    r+=1
  return Key
#更新密钥
def UpdataKey(Keyt):
  Key = unCoding(Keyt)
  #循环左移
  Key = Key[1:] + struct.pack('B',Key[0])
  tem=0
  #求和
  for i in range(len(Key)):
    tem += Key[i];
  Keyo=b''
  #Xor
  for i in range(len(Key)):
    Keyo += struct.pack('B',(Key[i]^tem)%256)
    tem += Keyo[i]>>3
    tem = tem % 256
  return(Coding(Keyo))
if __name__ == '__main__':
  #获得输入文件
  if len(sys.argv)==1:
    filename = input('源文件: ')
  else:
    filename = sys.argv[1]
   
  try:
    fin = open(filename,'rb')
  except:
    print('打开文件失败!')
    input()
    sys.exit()
  print(filename)
  #打开输出文件
  if filename[-4:]=='.RC4':
    eID = 1
    key=input('输入解密密钥: ').encode()
    ofilename = filename[:-4]
  else:
    eID = 2
    key=input('输入加密密钥: ').encode()
    ofilename = filename+'.RC4'
  key = Coding(CreatKey(key))
  key = UpdataKey(key)
 
  #处理重名
  while os.path.exists(ofilename):
    ofilename = os.path.dirname(ofilename)+ '\\副本 '+ os.path.basename(ofilename)
  fout = open(ofilename,'wb')
  print(ofilename)
  #解密
  if eID==1:
    #读文件长度
    filelen = struct.unpack('I',fin.read(4))[0]
    print('FlieLen =',filelen,'\n......')
    while 1:
      #读块大小
      ps= fin.read(2)
      if not ps:
        #文件结束
        break
      packsize = struct.unpack('H',ps)[0]
      #读数据
      dd=fin.read(packsize)
      #解密
      dd=Coding(dd)
      x = RC4(key,len(key),dd,len(dd))
      key = UpdataKey(key)
      #crc
      crc = struct.unpack('I',fin.read(4))[0]
      if binascii.crc32(x)!=crc:
        print('CRC32校验错误!',crc,binascii.crc32(x))
        input()
        sys.exit()
      fout.write(x)
    #裁剪末尾填充位
    fout.truncate(filelen)
  #加密
  elif eID==2:
    #获得文件长度
    fin.seek(0,2)
    filelen = fin.tell()
    print('FlieLen =',filelen,'\n......')
    fin.seek(0,0)
    fout.write(struct.pack('I',filelen))
    while 1:
      #读数据
      dd=fin.read(65534)
      if not dd:
        #文件结束
        break
      #末尾填充
      srl = len(dd)
      if srl%2:
        srl+=1;
        dd+=b'\0'
      #crc
      crc = struct.pack('I',binascii.crc32(dd))
      #加密数据
      dd=Coding(dd)
      x = RC4(key,len(key),dd,len(dd))
      key = UpdataKey(key)
      #写入文件
      fout.write(struct.pack('H',srl))
      fout.write(x)
      fout.write(crc)
  fin.close()
  fout.close()
  print('OK!')
  input()

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
python使用Tkinter显示网络图片的方法
Apr 24 Python
python基于pygame实现响应游戏中事件的方法(附源码)
Nov 11 Python
简单总结Python中序列与字典的相同和不同之处
Jan 19 Python
python实现聊天小程序
Mar 13 Python
django中静态文件配置static的方法
May 20 Python
Python使用matplotlib实现基础绘图功能示例
Jul 03 Python
详解Python列表赋值复制深拷贝及5种浅拷贝
May 15 Python
win10从零安装配置pytorch全过程图文详解
May 08 Python
Python模拟伯努利试验和二项分布代码实例
May 27 Python
Python分析微信好友性别比例和省份城市分布比例的方法示例【基于itchat模块】
May 29 Python
python右对齐的实例方法
Jul 05 Python
详解Go语言运用广度优先搜索走迷宫
Jun 23 Python
详解Python中的序列化与反序列化的使用
Jun 30 #Python
Python中函数的参数传递与可变长参数介绍
Jun 30 #Python
python实现文件快照加密保护的方法
Jun 30 #Python
Python实现高效求解素数代码实例
Jun 30 #Python
python实现DES加密解密方法实例详解
Jun 30 #Python
python实现的系统实用log类实例
Jun 30 #Python
python实现在windows服务中新建进程的方法
Jun 30 #Python
You might like
php 分页原理详解
2009/08/21 PHP
基于curl数据采集之单页面并行采集函数get_htmls的使用
2013/04/28 PHP
Zend Framework教程之路由功能Zend_Controller_Router详解
2016/03/07 PHP
如何通过View::first使用Laravel Blade的动态模板详解
2017/09/21 PHP
简单实现php上传文件功能
2017/09/21 PHP
php框架CodeIgniter主从数据库配置方法分析
2018/05/25 PHP
使用composer安装使用thinkphp6.0框架问题【视频教程】
2019/10/01 PHP
推荐自用 Javascript 缩图函数 (onDOMLoaded)……
2007/10/23 Javascript
jQuery AJAX 调用WebService实现代码
2010/03/24 Javascript
js实现(全选)多选按钮的方法【附实例】
2016/03/30 Javascript
关于Angular2 + node接口调试的解决方案
2017/05/28 Javascript
利用JS对iframe父子(内外)页面进行操作的方法教程
2017/06/15 Javascript
Bootstrap Multiselect 常用组件实现代码
2017/07/09 Javascript
Three.js加载外部模型的教程详解
2017/11/10 Javascript
JavaScript程序设计高级算法之动态规划实例分析
2017/11/24 Javascript
vue-cli脚手架-bulid下的配置文件
2018/03/27 Javascript
关于vue中的ajax请求和axios包问题
2018/04/19 Javascript
JS实现的图片选择顺序切换和循环切换功能示例【测试可用】
2018/12/28 Javascript
vue实现手机号码的校验实例代码(防抖函数的应用场景)
2019/09/05 Javascript
Vue引入Stylus知识点总结
2020/01/16 Javascript
[17:45]DOTA2 HEROES教学视频教你分分钟做大人-军团指挥官
2014/06/11 DOTA
python实现的一只从百度开始不断搜索的小爬虫
2013/08/13 Python
Windows 7下Python Web环境搭建图文教程
2018/03/20 Python
Python利用pandas计算多个CSV文件数据值的实例
2018/04/19 Python
Flask框架使用DBUtils模块连接数据库操作示例
2018/07/20 Python
python学习之hook钩子的原理和使用
2018/10/25 Python
Python获取时间范围内日期列表和周列表的函数
2019/08/05 Python
python3通过udp实现组播数据的发送和接收操作
2020/05/05 Python
浅谈keras2 predict和fit_generator的坑
2020/06/17 Python
HTML5 文件域+FileReader 分段读取文件并上传到服务器
2017/10/23 HTML / CSS
Michael Kors加拿大官网:购买设计师手袋、手表、鞋子、服装等
2019/03/16 全球购物
荷兰音乐会和音乐剧门票订购网站:Topticketshop
2019/08/27 全球购物
统计每一学生的平均成绩
2014/06/06 面试题
北京RT科技有限公司.net工程师面试题
2013/02/15 面试题
介绍一下grep命令的使用
2015/06/12 面试题
大学生就业自荐书
2014/06/16 职场文书