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中的yield使用方法
Feb 11 Python
Python中对列表排序实例
Jan 04 Python
Python简单检测文本类型的2种方法【基于文件头及cchardet库】
Sep 18 Python
django框架实现模板中获取request 的各种信息示例
Jul 01 Python
python操作excel让工作自动化
Aug 09 Python
python 有效的括号的实现代码示例
Nov 11 Python
Python log模块logging记录打印用法解析
Jan 20 Python
解决python运行启动报错问题
Jun 01 Python
keras 两种训练模型方式详解fit和fit_generator(节省内存)
Jul 03 Python
python中plt.imshow与cv2.imshow显示颜色问题
Jul 16 Python
详解Java中一维、二维数组在内存中的结构
Feb 11 Python
详解用Python把PDF转为Word方法总结
Apr 27 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
现磨咖啡骗局!现磨咖啡=新鲜咖啡?现磨咖啡背后的猫腻你不懂!
2019/03/28 冲泡冲煮
php启用zlib压缩文件的配置方法
2013/06/12 PHP
Codeigniter中禁止A Database Error Occurred错误提示的方法
2014/06/12 PHP
CI框架中zip类应用示例
2014/06/17 PHP
php使用ob_start()实现图片存入变量的方法
2014/11/14 PHP
PHP Header用于页面跳转时的几个注意事项
2016/10/21 PHP
PHP观察者模式实例分析【对比JS观察者模式】
2019/05/22 PHP
js获取单选按钮的数据
2006/11/27 Javascript
基于jQuery的树控件实现代码(asp.net+json)
2010/07/11 Javascript
jQuery中outerWidth()方法用法实例
2015/01/19 Javascript
js实现仿Windows风格选项卡和按钮效果实例
2015/05/13 Javascript
JS简单实现表格排序功能示例
2016/12/20 Javascript
angular.JS实现网页禁用调试、复制和剪切
2017/03/31 Javascript
JS中的事件委托实例浅析
2018/03/22 Javascript
一文看懂如何简单实现节流函数和防抖函数
2019/09/05 Javascript
d3.js实现图形拖拽
2019/12/19 Javascript
vue动态加载SVG文件并修改节点数据的操作代码
2020/08/17 Javascript
toString.call()通用的判断数据类型方法示例
2020/08/28 Javascript
跟老齐学Python之赋值,简单也不简单
2014/09/24 Python
python实现数值积分的Simpson方法实例分析
2015/06/05 Python
Python标准库之collections包的使用教程
2017/04/27 Python
python中(str,list,tuple)基础知识汇总
2018/02/20 Python
Python 实现Windows开机运行某软件的方法
2018/10/14 Python
python3+PyQt5 使用三种不同的简便项窗口部件显示数据的方法
2019/06/17 Python
html5使用html2canvas实现浏览器截图的示例
2017/08/31 HTML / CSS
HTML5和以前HTML4的区别整理
2013/10/20 HTML / CSS
html5本地存储之localstorage 、本地数据库、sessionStorage简单使用示例
2014/05/08 HTML / CSS
萌新HTML5 入门指南(二)
2020/11/09 HTML / CSS
加拿大大码女装购物网站:Penningtons
2020/12/26 全球购物
设计总监岗位职责
2013/12/07 职场文书
八年级英语教学反思
2014/01/09 职场文书
领导干部群众路线个人对照检查材料思想汇报
2014/09/30 职场文书
安全员岗位职责
2015/02/10 职场文书
统计员岗位职责范本
2015/04/14 职场文书
公司转让协议书
2016/03/19 职场文书
Python何绘制带有背景色块的折线图
2022/04/23 Python