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简单实现基数排序算法
May 16 Python
Python查询阿里巴巴关键字排名的方法
Jul 08 Python
解决Python requests 报错方法集锦
Mar 19 Python
Python基于win32ui模块创建弹出式菜单示例
May 09 Python
python实现贪吃蛇小游戏
Mar 21 Python
python文档字符串(函数使用说明)使用详解
Jul 30 Python
python创建属于自己的单词词库 便于背单词
Jul 30 Python
Python 类,property属性(简化属性的操作),@property,property()用法示例
Oct 12 Python
Pytorch之parameters的使用
Dec 31 Python
Pytorch 的损失函数Loss function使用详解
Jan 02 Python
基于梯度爆炸的解决方法:clip gradient
Feb 04 Python
pytorch 计算ConvTranspose1d输出特征大小方式
Jun 23 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中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
2011/05/04 PHP
PHP return语句的另一个作用
2014/07/30 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
2019/12/31 PHP
jQuery中使用了document和window哪些属性和方法小结
2011/09/13 Javascript
jquery.cookie() 方法的使用(读取、写入、删除)
2013/12/05 Javascript
js 弹出新页面避免被浏览器、ad拦截的一种新方法
2014/04/30 Javascript
关于JavaScript中name的意义冲突示例介绍
2014/05/29 Javascript
一个简单的全屏图片上下打开显示网页效果示例
2014/07/08 Javascript
使用jQuery实现星级评分代码分享
2014/12/09 Javascript
script标签属性用type还是language
2015/01/21 Javascript
js闭包所用的场合以及优缺点分析
2015/06/22 Javascript
AngularJS入门示例之Hello World详解
2017/01/04 Javascript
JavaScript设计模式之单例模式详解
2017/06/09 Javascript
前端主流框架vue学习笔记第一篇
2017/07/26 Javascript
使用JavaScript实现点击循环切换图片效果
2017/09/03 Javascript
基于js粘贴事件paste简单解析以及遇到的坑
2017/09/07 Javascript
详解在vue-cli中使用路由
2017/09/25 Javascript
JS实现打字游戏
2019/12/17 Javascript
[04:52]2015国际邀请赛LGD战队晋级之路
2015/08/14 DOTA
Python常用小技巧总结
2015/06/01 Python
深入解析Python中的list列表及其切片和迭代操作
2016/03/13 Python
python数字图像处理之骨架提取与分水岭算法
2018/04/27 Python
在Pycharm中修改文件默认打开方式的方法
2019/01/17 Python
详解程序意外中断自动重启shell脚本(以Python为例)
2019/07/26 Python
python通过txt文件批量安装依赖包的实现步骤
2019/08/13 Python
django实现模板中的字符串文字和自动转义
2020/03/31 Python
Opencv图像处理:如何判断图片里某个颜色值占的比例
2020/06/03 Python
Python猫眼电影最近上映的电影票房信息
2020/09/18 Python
美国复古街头服饰精品店:Need Supply Co.
2017/02/22 全球购物
会计毕业生自荐信
2013/11/21 职场文书
应用数学专业求职信
2014/03/14 职场文书
老兵退伍标语
2014/10/07 职场文书
信访维稳工作汇报
2014/10/27 职场文书
2014离婚协议书范文(3篇)
2014/11/29 职场文书
技术员岗位职责
2015/02/04 职场文书
公司趣味运动会开幕词
2016/03/04 职场文书