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 相关文章推荐
Ruby元编程基础学习笔记整理
Jul 02 Python
idea创建springMVC框架和配置小文件的教程图解
Sep 18 Python
利用ctypes获取numpy数组的指针方法
Feb 12 Python
Python Opencv实现图像轮廓识别功能
Mar 23 Python
python多任务之协程的使用详解
Aug 26 Python
Python3分析处理声音数据的例子
Aug 27 Python
Python编写打字训练小程序
Sep 26 Python
Tensorflow的常用矩阵生成方式
Jan 04 Python
Python如何获取Win7,Win10系统缩放大小
Jan 10 Python
keras绘制acc和loss曲线图实例
Jun 15 Python
matplotlib subplot绘制多个子图的方法示例
Jul 28 Python
Python3中PyQt5简单实现文件打开及保存
Jun 10 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
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
2010/02/16 PHP
php学习之 循环结构实现代码
2011/06/09 PHP
destoon复制新模块的方法
2014/06/21 PHP
php+mysqli使用面向对象方式查询数据库实例
2015/01/29 PHP
PHP序列化/对象注入漏洞分析
2016/04/18 PHP
PHP聚合式迭代器接口IteratorAggregate用法分析
2017/12/28 PHP
PHP如何获取Cookie并实现模拟登录
2020/07/16 PHP
event.keyCode键码值表 附只能输入特定的字符串代码
2009/05/15 Javascript
关于js datetime的那点事
2011/11/15 Javascript
javascript倒计时功能实现代码
2012/06/07 Javascript
jquery购物车实时结算特效实现思路
2013/09/23 Javascript
兼容主流浏览器的JS复制内容到剪贴板
2014/12/12 Javascript
JS实现页面超时后自动跳转到登陆页面
2015/01/19 Javascript
浅谈下拉菜单中的Option对象
2015/05/10 Javascript
JavaScript实现LI列表数据绑定的方法
2015/08/04 Javascript
BootStrap glyphicon图标无法显示的解决方法
2016/09/06 Javascript
jQuery-mobile事件监听与用法详解
2016/11/23 Javascript
利用纯JS实现像素逐渐显示的方法示例
2017/08/14 Javascript
详解tween.js 中文使用指南
2018/01/05 Javascript
Node.js操作系统OS模块用法分析
2019/01/04 Javascript
D3.js(v3)+react 实现带坐标与比例尺的散点图 (V3版本)
2019/05/09 Javascript
python虚拟环境 virtualenv的简单使用
2020/01/21 Javascript
python 生成器协程运算实例
2017/09/04 Python
不管你的Python报什么错,用这个模块就能正常运行
2018/09/14 Python
python对矩阵进行转置的2种处理方法
2019/07/17 Python
在Python IDLE 下调用anaconda中的库教程
2020/03/09 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
2020/03/30 Python
手把手教你将Flask应用封装成Docker服务的实现
2020/08/19 Python
html5使用canvas绘制太阳系效果
2014/12/15 HTML / CSS
问卷调查计划书
2014/01/10 职场文书
腾讯广告词
2014/03/19 职场文书
劳动竞赛口号
2014/06/16 职场文书
2014年网络管理员工作总结
2014/12/01 职场文书
三年级学生评语大全
2014/12/26 职场文书
大学生党员自我评价
2015/03/04 职场文书
Redis基本数据类型Set常用操作命令
2022/06/01 Redis