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解析xml文件操作实例
Oct 05 Python
使用IPython来操作Docker容器的入门指引
Apr 08 Python
详细解析Python中的变量的数据类型
May 13 Python
centos6.4下python3.6.1安装教程
Jul 21 Python
解决python3 urllib 链接中有中文的问题
Jul 16 Python
快速解决pyqt5窗体关闭后子线程不同时退出的问题
Jun 19 Python
PYTHON实现SIGN签名的过程解析
Oct 28 Python
Python imageio读取视频并进行编解码详解
Dec 10 Python
python 解决print数组/矩阵无法完整输出的问题
Feb 19 Python
Python实现UDP程序通信过程图解
May 15 Python
Python定义一个函数的方法
Jun 15 Python
Pytorch中的数据集划分&正则化方法
May 27 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
40年前的这部特摄片恐龙特级克塞号80后的共同回忆
2020/03/08 日漫
给apache2.2加上mod_encoding模块後 php5.2.0 处理url出现bug
2007/04/12 PHP
给初学者的30条PHP最佳实践(荒野无灯)
2011/08/02 PHP
PHP文件上传主要代码讲解
2013/09/30 PHP
php比较两个字符串长度的方法
2015/07/13 PHP
使用Appcan客户端自动更新PHP版本号(全)
2015/07/31 PHP
PHP标准类(stdclass)用法示例
2016/09/28 PHP
基于php中echo用逗号和用点号的区别详解
2018/01/23 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
2020/04/04 PHP
Javascript实现带关闭按钮的网页漂浮广告代码
2014/01/12 Javascript
js获取checkbox复选框选中的选项实例
2014/08/24 Javascript
JQuery实现简单的服务器轮询效果实例
2016/03/31 Javascript
详细谈谈AngularJS的子级作用域问题
2016/09/05 Javascript
jquery.Jcrop结合JAVA后台实现图片裁剪上传实例
2016/11/05 Javascript
ThinkJS中如何使用MongoDB的CURD操作
2016/12/13 Javascript
Bootstrap提示框效果的实例代码
2017/07/12 Javascript
JavaScript 中定义函数用 var foo = function () {} 和 function foo()区别介绍
2018/03/01 Javascript
vue中使用input[type="file"]实现文件上传功能
2018/09/10 Javascript
详解ESLint在Vue中的使用小结
2018/10/15 Javascript
vue中根据时间戳判断对应的时间(今天 昨天 前天)
2019/12/20 Javascript
element中el-container容器与div布局区分详解
2020/05/13 Javascript
Python Web框架Flask下网站开发入门实例
2015/02/08 Python
wxPython定时器wx.Timer简单应用实例
2015/06/03 Python
Python判断某个用户对某个文件的权限
2016/10/13 Python
详解Python 2.6 升级至 Python 2.7 的实践心得
2017/04/27 Python
PyCharm设置每行最大长度限制的方法
2019/01/16 Python
python多线程http压力测试脚本
2019/06/25 Python
使用matlab或python将txt文件转为excel表格
2019/11/01 Python
The Hut德国站点:时装、家居用品、美容等
2016/09/23 全球购物
英国在线自行车店:Merlin Cycles
2018/08/20 全球购物
美国购物网站:Clickhere2shop
2021/01/28 全球购物
亿企通软件测试面试题
2012/04/10 面试题
三好学生先进事迹材料
2014/08/28 职场文书
2015新生加入学生会自荐书
2015/03/24 职场文书
Python+Selenium自动化环境搭建与操作基础详解
2022/03/13 Python