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实现把数字转换成中文
Jun 29 Python
Python中的单继承与多继承实例分析
May 10 Python
使用django实现一个代码发布系统
Jul 18 Python
pytorch 指定gpu训练与多gpu并行训练示例
Dec 31 Python
通过实例解析python描述符原理作用
Jan 22 Python
使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解
Jan 25 Python
Pandas时间序列:时期(period)及其算术运算详解
Feb 25 Python
Django CSRF认证的几种解决方案
Mar 03 Python
python 密码学示例——凯撒密码的实现
Sep 21 Python
Python爬虫抓取论坛关键字过程解析
Oct 19 Python
Pycharm中使用git进行合作开发的教程详解
Nov 17 Python
Python合并多张图片成PDF
Jun 09 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读取flv文件的播放时间长度
2009/09/03 PHP
php下关于中英数字混排的字符串分割问题
2010/04/06 PHP
PHP中绘制图像的一些函数总结
2014/11/19 PHP
PHP超全局数组(Superglobals)介绍
2015/07/01 PHP
php 中的closure用法详解
2017/06/12 PHP
Google Suggest ;-) 基于js的动态下拉菜单
2006/10/11 Javascript
关于恒等于(===)和非恒等于(!==)
2007/08/20 Javascript
javaScript 数值型和字符串型之间的转换
2009/07/25 Javascript
jquery 最简单的属性菜单
2009/10/08 Javascript
jQuery操作checkbox选择(list/table)
2013/04/07 Javascript
js实现对table动态添加、删除和更新的方法
2015/02/10 Javascript
JS实现的表格行鼠标点击高亮效果代码
2015/11/27 Javascript
JavaScript实现字符串与日期的互相转换及日期的格式化
2016/03/07 Javascript
webpack引入eslint配置详解
2018/01/22 Javascript
Vue.js 表单控件操作小结
2018/03/29 Javascript
浅谈如何通过node.js对数据进行MD5加密
2018/05/16 Javascript
jQuery实现基本动画效果的方法详解
2018/09/06 jQuery
iView框架问题整理小结
2018/10/16 Javascript
jquery分页插件pagination使用教程
2018/10/23 jQuery
vue基于viewer实现的图片查看器功能
2019/04/12 Javascript
JavaScript 类的封装操作示例详解
2020/05/16 Javascript
[01:28:24]NAVI vs VG Supermajor 败者组 BO3 第三场 6.5
2018/06/06 DOTA
Python 转义字符详细介绍
2017/03/21 Python
用Eclipse写python程序
2018/02/10 Python
详解用python写网络爬虫-爬取新浪微博评论
2019/05/10 Python
python实现ip地址的包含关系判断
2020/02/07 Python
Matplotlib自定义坐标轴刻度的实现示例
2020/06/18 Python
CSS3 background-image颜色渐变的实现代码
2018/09/13 HTML / CSS
如何删除一个表里面的重复行
2013/07/13 面试题
UNIX操作系统结构由哪几部分组成
2016/02/17 面试题
音乐教学反思
2014/02/02 职场文书
2014年教育教学工作总结
2014/11/13 职场文书
特此通知格式
2015/04/27 职场文书
禁毒主题班会教案
2015/08/14 职场文书
详解用Python把PDF转为Word方法总结
2021/04/27 Python
Python编解码问题及文本文件处理方法详解
2021/06/20 Python