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 相关文章推荐
基于scrapy实现的简单蜘蛛采集程序
Apr 17 Python
在Python中使用HTMLParser解析HTML的教程
Apr 29 Python
使用pandas把某一列的字符值转换为数字的实例
Jan 29 Python
python实现海螺图片的方法示例
May 12 Python
使用Filter过滤python中的日志输出的实现方法
Jul 17 Python
python同时替换多个字符串方法示例
Sep 17 Python
Python全栈之列表数据类型详解
Oct 01 Python
python实现tail实时查看服务器日志示例
Dec 24 Python
超全Python图像处理讲解(多模块实现)
Apr 13 Python
python能否java成为主流语言吗
Jun 22 Python
python 实现aes256加密
Nov 27 Python
Python PIL按比例裁剪图片
May 11 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 foreach遍历多维数组实现方式
2016/11/16 PHP
JavaScript URL参数读取改进版
2009/01/16 Javascript
javascript EXCEL 操作类代码
2009/07/30 Javascript
js中数组Array的一些常用方法总结
2013/08/12 Javascript
JS 实现导航栏悬停效果(续)
2013/09/24 Javascript
给事件响应函数传参数的四种方式小结
2013/12/05 Javascript
jquery中ajax函数执行顺序问题之如何设置同步
2014/02/28 Javascript
jquery实现鼠标滑过显示二级下拉菜单效果
2015/08/24 Javascript
AngularJS中的指令全面解析(必看)
2016/05/20 Javascript
JS中对Cookie的操作详解
2016/08/05 Javascript
WebPack基础知识详解
2017/01/16 Javascript
微信小程序 自定义对话框实例详解
2017/01/20 Javascript
详解AngularJS中$filter过滤器使用(自定义过滤器)
2017/02/04 Javascript
JQuery中Ajax的操作完整例子
2017/03/07 Javascript
NodeJS使用七牛云存储上传文件的方法
2017/07/24 NodeJs
JQuery插件tablesorter表格排序实现过程解析
2020/05/28 jQuery
nuxt.js写项目时增加错误提示页面操作
2020/11/05 Javascript
Python标准库与第三方库详解
2014/07/22 Python
python paramiko模块学习分享
2017/08/23 Python
python获取外网IP并发邮件的实现方法
2017/10/01 Python
使用Python操作excel文件的实例代码
2017/10/15 Python
python之生产者消费者模型实现详解
2019/07/27 Python
python统计字符的个数代码实例
2020/02/07 Python
详解android与HTML混合开发总结
2018/06/06 HTML / CSS
阿里旅行:飞猪
2017/01/05 全球购物
自主招生自荐信格式
2013/12/03 职场文书
社区国庆节活动方案
2014/02/05 职场文书
防沙治沙典型材料
2014/05/07 职场文书
大型活动组织方案
2014/05/10 职场文书
社团活动总结格式
2014/08/29 职场文书
毕业横幅标语
2014/10/08 职场文书
青年联谊会致辞
2015/07/31 职场文书
学校2016年九九重阳节活动总结
2016/04/01 职场文书
新手,如何业余时间安排好写作、提高写作能力?
2019/10/21 职场文书
导游词之蓬莱长岛
2019/12/17 职场文书
详解分布式系统中如何用python实现Paxos
2021/05/18 Python