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中使用item()方法遍历字典的例子
Aug 26 Python
Jupyter安装nbextensions,启动提示没有nbextensions库
Apr 23 Python
使用PyInstaller将python转成可执行文件exe笔记
May 26 Python
pygame实现简易飞机大战
Sep 11 Python
对pandas读取中文unicode的csv和添加行标题的方法详解
Dec 12 Python
Python根据欧拉角求旋转矩阵的实例
Jan 28 Python
Django CBV与FBV原理及实例详解
Aug 12 Python
wxPython实现绘图小例子
Nov 19 Python
Pytorch中膨胀卷积的用法详解
Jan 07 Python
Python之变量类型和if判断方式
May 05 Python
Python pip 常用命令汇总
Oct 19 Python
Python time库的时间时钟处理
May 02 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使用APC实现实时上传进度条功能
2015/10/26 PHP
php gd等比例缩放压缩图片函数
2016/06/12 PHP
apache php mysql开发环境安装教程
2016/07/28 PHP
PHP使用数组实现矩阵数学运算的方法示例
2017/05/29 PHP
Javascript 调试利器 Firebug使用详解六
2009/07/05 Javascript
JavaScript 拾漏补遗
2009/12/27 Javascript
Jquery中使用setInterval和setTimeout的方法
2013/04/08 Javascript
javascript中String对象的slice()方法分析
2014/12/20 Javascript
JS实现动态给图片添加边框的方法
2015/04/01 Javascript
js实现简洁的TAB滑动门效果代码
2015/09/06 Javascript
AngularJS基础 ng-include 指令示例讲解
2016/08/01 Javascript
js学习笔记之事件处理模型
2016/10/31 Javascript
原生js开发的日历插件
2017/02/04 Javascript
Vue路由跳转问题记录详解
2017/06/15 Javascript
浅谈 vue 中的 watcher
2017/12/04 Javascript
微信小程序实现打开内置地图功能【附源码下载】
2017/12/07 Javascript
Vue框架之goods组件开发详解
2018/01/25 Javascript
vue 监听某个div垂直滚动条下拉到底部的方法
2018/09/15 Javascript
基于Vue组件化的日期联动选择器功能的实现代码
2018/11/30 Javascript
jQuery-ui插件sortable实现自由拖动排序
2018/12/01 jQuery
jQuery属性选择器用法实例分析
2019/06/28 jQuery
微信小程序获取用户信息及手机号(后端TP5.0)
2019/09/12 Javascript
微信小程序实现抖音播放效果的实例代码
2020/04/11 Javascript
javascript前端实现多视频上传
2020/12/13 Javascript
Python中的字符串切片(截取字符串)的详解
2019/05/15 Python
Flask框架单例模式实现方法详解
2019/07/31 Python
python 实现仿微信聊天时间格式化显示的代码
2020/04/17 Python
解决Jupyter notebook中.py与.ipynb文件的import问题
2020/04/21 Python
html5 乒乓球(碰撞检测)实例二
2013/07/25 HTML / CSS
亚洲最大的眼镜批发商和零售商之一:Glasseslit
2018/10/08 全球购物
CHARLES & KEITH澳大利亚官网:新加坡时尚品牌
2019/01/22 全球购物
C,C++的几个面试题小集
2013/07/13 面试题
会议活动邀请函
2014/01/27 职场文书
12.4法制宣传日标语
2014/10/08 职场文书
JavaScript函数柯里化
2021/11/07 Javascript
请求模块urllib之PYTHON爬虫的基本使用
2022/04/08 Python