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 条件判断的缩写方法
Sep 06 Python
Python中pygame的mouse鼠标事件用法实例
Nov 11 Python
Python实现将罗马数字转换成普通阿拉伯数字的方法
Apr 19 Python
Python 实现数据库(SQL)更新脚本的生成方法
Jul 09 Python
Linux CentOS7下安装python3 的方法
Jan 21 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
Mar 15 Python
Python通用函数实现数组计算的方法
Jun 13 Python
python异常触发及自定义异常类解析
Aug 06 Python
Python中实现输入超时及如何通过变量获取变量名
Jan 18 Python
Python sqlite3查询操作过程解析
Feb 20 Python
python实现每天自动签到领积分的示例代码
Aug 18 Python
Django前后端分离csrf token获取方式
Dec 25 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边学边教》(02.Apache+PHP环境配置――上篇)
2006/12/13 PHP
php smarty模版引擎中变量操作符及使用方法
2009/12/11 PHP
php中函数前加&符号的作用分解
2014/07/08 PHP
PHP对象克隆clone用法示例
2016/09/28 PHP
IE浏览器兼容Firefox的JS脚本的代码
2008/10/23 Javascript
javascript中html字符串转化为jquery dom对象的方法
2015/08/27 Javascript
jQuery中bind(),live(),delegate(),on()绑定事件方法实例详解
2016/01/19 Javascript
JS动态创建元素的两种方法
2016/04/20 Javascript
javascript中对Date类型的常用操作小结
2016/05/19 Javascript
JavaScript之cookie技术详解
2016/11/18 Javascript
vue滚动轴插件better-scroll使用详解
2017/10/17 Javascript
vue-router路由与页面间导航实例解析
2017/11/07 Javascript
Vue下路由History模式打包后页面空白的解决方法
2018/06/29 Javascript
vue-cli 3.x 配置Axios(proxyTable)跨域代理方法
2018/09/19 Javascript
Vue props 单向数据流的实现
2018/11/06 Javascript
highCharts提示框中显示当前时间的方法
2019/01/18 Javascript
js简单粗暴的发布订阅示例代码
2021/01/23 Javascript
python单例模式实例分析
2015/04/08 Python
python计算方程式根的方法
2015/05/07 Python
详解python3百度指数抓取实例
2016/12/12 Python
Python编程产生非均匀随机数的几种方法代码分享
2017/12/13 Python
Flask之flask-session的具体使用
2018/07/26 Python
解决pyinstaller打包发布后的exe文件打开控制台闪退的问题
2019/06/21 Python
django框架单表操作之增删改实例分析
2019/12/16 Python
使用pycharm和pylint检查python代码规范操作
2020/06/09 Python
德国最大的拼图在线商店:Puzzle.de
2016/12/17 全球购物
CHARLES & KEITH加拿大官网:新加坡时尚品牌
2020/03/26 全球购物
GWebs公司笔试题
2012/05/04 面试题
初三政治教学反思
2014/01/30 职场文书
社区交通安全实施方案
2014/03/22 职场文书
工会主席事迹材料
2014/06/03 职场文书
庆元旦演讲稿
2014/09/15 职场文书
2015年教师节活动总结
2015/03/20 职场文书
少先队大队委竞选口号
2015/12/25 职场文书
2016年优秀团支部事迹材料
2016/02/26 职场文书
基于Python和openCV实现图像的全景拼接详细步骤
2021/10/05 Python