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中的MongoDB基本操作:连接、查询实例
Feb 13 Python
使用Python编写提取日志中的中文的脚本的方法
Apr 30 Python
使用Python生成随机密码的示例分享
Feb 18 Python
Python代码缩进和测试模块示例详解
May 07 Python
Python之文字转图片方法
May 10 Python
Python3多进程 multiprocessing 模块实例详解
Jun 11 Python
PyQt5实现从主窗口打开子窗口的方法
Jun 19 Python
python并发编程多进程 互斥锁原理解析
Aug 20 Python
Django中的FBV和CBV用法详解
Sep 15 Python
Python实现自动打开电脑应用的示例代码
Apr 17 Python
基于Python pyecharts实现多种图例代码解析
Aug 10 Python
python中tkinter复选框使用操作
Nov 11 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比较多维数组中值的大小排序实现代码
2012/09/08 PHP
php基于base64解码图片与加密图片还原实例
2014/11/03 PHP
PHP中把有符号整型转换为无符号整型方法
2015/05/27 PHP
PHP微信分享开发详解
2017/01/14 PHP
PHP开发的文字水印,缩略图,图片水印实现类与用法示例
2019/04/12 PHP
Javascript 复制数组实现代码
2009/11/26 Javascript
DWZ刷新dialog解决方法
2013/03/03 Javascript
终于解决了IE8不支持数组的indexOf方法
2013/04/03 Javascript
在新窗口打开超链接的方法小结
2013/04/14 Javascript
JQuery中DOM事件冒泡实例分析
2015/06/13 Javascript
浅析JavaScript 调试方法和技巧
2015/10/22 Javascript
快速掌握WordPress中加载JavaScript脚本的方法
2015/12/17 Javascript
微信小程序  简单实例(阅读器)的实例开发
2016/09/29 Javascript
Node.js自定义实现文件路由功能
2017/09/22 Javascript
vue检测对象和数组的变化分析
2018/06/30 Javascript
微信小程序scroll-view仿拼多多横向滑动滚动条
2020/04/21 Javascript
js实现九宫格抽奖
2020/03/19 Javascript
基于vue 动态菜单 刷新空白问题的解决
2020/08/06 Javascript
解决vue项目中遇到 Cannot find module ‘chalk‘ 报错的问题
2020/11/05 Javascript
jQuery实现移动端扭蛋机抽奖
2020/11/08 jQuery
vue中使用echarts的示例
2021/01/03 Vue.js
[02:33]DOTA2亚洲邀请赛趣味视频之吐真话筒
2018/03/31 DOTA
python try except返回异常的信息字符串代码实例
2019/08/15 Python
50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)
2019/11/20 Python
Python3运算符常见用法分析
2020/02/14 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
2021/01/25 Python
css3让div随鼠标移动而抖动起来
2014/02/10 HTML / CSS
JSF如何进行表格处理及取值
2012/08/06 面试题
班组长安全生产职责
2013/12/16 职场文书
人力资源部岗位职责
2015/02/11 职场文书
护理工作个人总结
2015/03/03 职场文书
初中班主任心得体会
2016/01/07 职场文书
2016年中学植树节活动总结
2016/03/16 职场文书
python使用PySimpleGUI设置进度条及控件使用
2021/06/10 Python
Redis唯一ID生成器的实现
2022/07/07 Redis
mysql数据库如何转移到oracle
2022/12/24 MySQL