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实现同时给多个变量赋值的方法
Apr 30 Python
python 正确保留多位小数的实例
Jul 16 Python
在python中实现对list求和及求积
Nov 14 Python
django主动抛出403异常的方法详解
Jan 04 Python
windows中安装Python3.8.0的实现方法
Nov 19 Python
python求绝对值的三种方法小结
Dec 04 Python
python 实现将小图片放到另一个较大的白色或黑色背景图片中
Dec 12 Python
Tensorflow累加的实现案例
Feb 05 Python
利用python绘制中国地图(含省界、河流等)
Sep 21 Python
python mongo 向数据中的数组类型新增数据操作
Dec 05 Python
解决Pytorch dataloader时报错每个tensor维度不一样的问题
May 28 Python
python垃圾回收机制原理分析
Apr 13 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实现上传图片生成缩略图示例
2014/04/13 PHP
php中$美元符号与Zen Coding冲突问题解决方法分享
2014/05/28 PHP
ThinkPHP权限认证Auth实例详解
2014/07/22 PHP
学习php开源项目的源码指南
2014/12/21 PHP
PHP实现获取中英文首字母
2015/06/19 PHP
详谈PHP编码转换问题
2015/07/28 PHP
完美利用Yii2微信后台开发的系列总结
2016/07/18 PHP
JavaScript中关于class的调用方法
2017/11/28 Javascript
vue利用axios来完成数据的交互
2018/03/23 Javascript
[02:49]DAC2018决赛日TOP5 LGD开启黑暗之门绝杀VP
2018/04/08 DOTA
python网络编程学习笔记(四):域名系统
2014/06/09 Python
在Python中操作时间之mktime()方法的使用教程
2015/05/22 Python
python从入门到精通(DAY 1)
2015/12/20 Python
Python Xml文件添加字节属性的方法
2018/03/31 Python
情人节快乐! python绘制漂亮玫瑰
2020/08/18 Python
运用Python的webbrowser实现定时打开特定网页
2019/02/21 Python
Python基于scipy实现信号滤波功能
2019/05/08 Python
wxPython实现画图板
2020/08/27 Python
flask 框架操作MySQL数据库简单示例
2020/02/02 Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
2020/05/19 Python
ubuntu16.04升级Python3.5到Python3.7的方法步骤
2020/08/20 Python
如何从csv文件构建Tensorflow的数据集
2020/09/21 Python
纯css3显示隐藏一个div特效的具体实现
2014/02/10 HTML / CSS
Hanro官网:奢华男士和女士内衣、睡衣和家居服
2018/10/25 全球购物
Feelunique中文官网:欧洲最大化妆品零售电商
2020/07/10 全球购物
技校生自我鉴定
2013/12/08 职场文书
大三毕业自我鉴定
2014/01/15 职场文书
学校领导班子四风对照检查材料
2014/09/27 职场文书
写给孩子的新学期寄语
2015/02/27 职场文书
师范生见习自我总结
2015/06/23 职场文书
Python如何解决secure_filename对中文不支持问题
2021/07/16 Python
Python 数据可视化之Seaborn详解
2021/11/02 Python
django 认证类配置实现
2021/11/11 Python
日本十大血腥动漫,那些被禁播的动漫盘点
2022/03/21 日漫
MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法
2022/04/18 MySQL
Python 绘制多因子柱状图
2022/05/11 Python