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中用has_key()方法查找键是否存在的教程
May 21 Python
使用Python对MySQL数据操作
Apr 06 Python
Python中的错误和异常处理简单操作示例【try-except用法】
Jul 25 Python
学生信息管理系统Python面向对象版
Jan 30 Python
Tensorflow模型实现预测或识别单张图片
Jul 19 Python
python3中eval函数用法使用简介
Aug 02 Python
python3.6中@property装饰器的使用方法示例
Aug 17 Python
Python编写打字训练小程序
Sep 26 Python
python实现操作文件(文件夹)
Oct 31 Python
Python PyInstaller库基本使用方法分析
Dec 12 Python
python字符串,元组,列表,字典互转代码实例详解
Feb 14 Python
Python figure参数及subplot子图绘制代码
Apr 18 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
收音机怀古---春雷3P7图片欣赏
2021/03/02 无线电
PHP新手上路(十四)
2006/10/09 PHP
php自定义函数之递归删除文件及目录
2010/08/08 PHP
php中mysql连接和基本操作代码(快速测试使用,简单方便)
2014/04/25 PHP
Ajax+PHP实现的分类列表框功能示例
2019/02/11 PHP
在laravel中实现事务回滚的方法
2019/10/10 PHP
ie和firefox中img对象区别的困惑
2006/12/27 Javascript
在第一个input框内输入内容.textarea自动得到第一个文件框的值的javascript代码
2007/04/20 Javascript
js中prototype用法详细介绍
2013/11/14 Javascript
jquery实现select下拉框美化特效代码分享
2015/08/18 Javascript
javascript中SetInterval与setTimeout的定时器用法
2015/08/24 Javascript
jQuery实现的个性化返回底部与返回顶部特效代码
2015/10/30 Javascript
jQuery实现的多滑动门,多选项卡效果代码
2016/03/28 Javascript
NodeJS简单实现WebSocket功能示例
2018/02/10 NodeJs
vue.js2.0点击获取自己的属性和jquery方法
2018/02/23 jQuery
Vue中v-for的数据分组实例
2018/03/07 Javascript
小程序ios音频播放没声音问题的解决
2018/07/11 Javascript
怎样在vue项目下添加ESLint的方法
2019/05/16 Javascript
微信小程序 搜索框组件代码实例
2019/09/06 Javascript
layui动态渲染生成select的option值方法
2019/09/23 Javascript
JS实现纵向轮播图(初级版)
2020/01/18 Javascript
[02:06]DOTA2英雄基础教程 暗影萨满
2013/12/16 DOTA
python基于xml parse实现解析cdatasection数据
2014/09/30 Python
浅析Python与Mongodb数据库之间的操作方法
2019/07/01 Python
Pycharm创建项目时如何自动添加头部信息
2019/11/14 Python
python Manager 之dict KeyError问题的解决
2019/12/21 Python
anaconda安装pytorch1.7.1和torchvision0.8.2的方法(亲测可用)
2021/02/01 Python
印度最大的时尚购物网站:Myntra
2018/09/13 全球购物
UNIX文件系统分类
2014/11/11 面试题
管理学专业个人求职信范文
2013/09/21 职场文书
2014年教师思想工作总结
2014/12/03 职场文书
诚信承诺书
2015/01/19 职场文书
2015年安全生产月活动总结
2015/03/26 职场文书
党员带头倡议书
2015/04/29 职场文书
《三国志》赏析
2019/08/27 职场文书
PHP对接阿里云虚拟号的实现(号码隐私保护)
2021/04/06 PHP