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计算最大优先级队列实例
Dec 18 Python
python 生成器生成杨辉三角的方法(必看)
Apr 10 Python
Python列表list解析操作示例【整数操作、字符操作、矩阵操作】
Jul 25 Python
Python3实现的判断环形链表算法示例
Mar 07 Python
python3通过selenium爬虫获取到dj商品的实例代码
Apr 25 Python
python使用PIL和matplotlib获取图片像素点并合并解析
Sep 10 Python
简单了解Java Netty Reactor三种线程模型
Apr 26 Python
使用OpenCV获取图像某点的颜色值,并设置某点的颜色
Jun 02 Python
用于ETL的Python数据转换工具详解
Jul 21 Python
Python获取指定网段正在使用的IP
Dec 14 Python
Python 数据可视化神器Pyecharts绘制图像练习
Feb 28 Python
Python中的 Set 与 dict
Mar 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下通过伪造http头破解防盗链的代码
2010/07/03 PHP
浅析Yii2 GridView 日期格式化并实现日期可搜索教程
2016/04/22 PHP
Netbeans 8.2将支持PHP7 更精彩
2016/06/13 PHP
win10 apache配置虚拟主机后localhost无法使用的解决方法
2018/01/27 PHP
javascript 数据类型转换(parseInt,parseFloat)
2010/07/20 Javascript
javascript拖拽上传类库DropzoneJS使用方法
2013/12/05 Javascript
解析jquery中的ajax缓存问题
2013/12/19 Javascript
一个不错的js html页面倒计时可精确到秒
2014/10/22 Javascript
JQuery表单验证插件EasyValidator用法分析
2014/11/15 Javascript
JavaScript实现的浮动层框架用法实例分析
2015/10/10 Javascript
JavaScript函数柯里化详解
2016/04/29 Javascript
js窗口震动小程序分享
2016/11/28 Javascript
jQuery轻松实现无缝轮播效果
2017/03/22 jQuery
微信小程序动态显示项目倒计时效果
2017/06/13 Javascript
浅谈webpack组织模块的原理
2018/03/10 Javascript
详解微信小程序的不同函数调用的几种方法
2019/05/08 Javascript
layui 数据表格复选框实现单选功能的例子
2019/09/19 Javascript
vue实现淘宝购物车功能
2020/04/20 Javascript
Python实现调度算法代码详解
2017/12/01 Python
利用python编写一个图片主色转换的脚本
2017/12/07 Python
centos 安装python3.6环境并配置虚拟环境的详细教程
2018/02/22 Python
python如何修改装饰器中参数
2018/03/20 Python
Python 一句话生成字母表的方法
2019/01/02 Python
一步步教你用python的scrapy编写一个爬虫
2019/04/17 Python
Python 3.6打包成EXE可执行程序的实现
2019/10/18 Python
tensorflow 初始化未初始化的变量实例
2020/02/06 Python
高一历史教学反思
2014/01/13 职场文书
鸿星尔克广告词
2014/03/21 职场文书
岗位竞聘演讲稿范文
2014/04/24 职场文书
2014年教师节红领巾广播稿
2014/09/10 职场文书
单位证明范文
2015/06/18 职场文书
2016继续教育培训学习心得体会
2016/01/19 职场文书
《观察物体》教学反思
2016/02/17 职场文书
PHP解决高并发问题
2021/04/01 PHP
使用Djongo模块在Django中使用MongoDB数据库
2021/06/20 Python
使用 DataAnt 监控 Apache APISIX的原理解析
2022/07/07 Servers