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中内置的日志模块logging用法详解
Jul 12 Python
Python实现图片转字符画的示例
Aug 22 Python
python3利用Dlib19.7实现人脸68个特征点标定
Feb 26 Python
Python numpy.array()生成相同元素数组的示例
Nov 12 Python
python 处理数字,把大于上限的数字置零实现方法
Jan 28 Python
详解用python自制微信机器人,定时发送天气预报
Mar 25 Python
Django实现分页显示效果
Oct 31 Python
详解pandas中iloc, loc和ix的区别和联系
Mar 09 Python
将tf.batch_matmul替换成tf.matmul的实现
Jun 18 Python
基于opencv实现简单画板功能
Aug 02 Python
Python测试框架:pytest学习笔记
Oct 20 Python
OpenCV全景图像拼接的实现示例
Jun 05 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
神族 Protoss 剧情介绍
2020/03/14 星际争霸
了解咖啡雨林联盟认证 什么是雨林认证 雨林认证是什么意思
2021/03/05 新手入门
3.从实例开始
2006/10/09 PHP
php函数mkdir实现递归创建层级目录
2016/10/27 PHP
PHP7匿名类的用法示例
2019/04/05 PHP
jQuery html() in Firefox (uses .innerHTML) ignores DOM changes
2010/03/05 Javascript
javascript获取作用在元素上面的样式属性代码
2012/09/20 Javascript
JS 精确统计网站访问量的实例代码
2013/07/05 Javascript
JQuery Mobile 弹出式登录框的实现方法
2016/05/28 Javascript
Angular 表单控件示例代码
2017/06/26 Javascript
vue中手机号,邮箱正则验证以及60s发送验证码的实例
2018/03/16 Javascript
实例介绍JavaScript中多种组合继承
2019/01/20 Javascript
Layui Table js 模拟选中checkbox的例子
2019/09/03 Javascript
vue中使用腾讯云Im的示例
2020/10/23 Javascript
element-ui 弹窗组件封装的步骤
2021/01/22 Javascript
[02:15]你好,这就是DOTA!
2015/08/05 DOTA
浅谈python多线程和队列管理shell程序
2015/08/04 Python
Python爬虫辅助利器PyQuery模块的安装使用攻略
2016/04/24 Python
Django管理员账号和密码忘记的完美解决方法
2018/12/06 Python
Python 微信之获取好友昵称并制作wordcloud的实例
2019/02/21 Python
使用python写的opencv实时监测和解析二维码和条形码
2019/08/14 Python
pygame实现打字游戏
2021/02/19 Python
Python大数据之网络爬虫的post请求、get请求区别实例分析
2019/11/16 Python
pycharm如何实现跨目录调用文件
2020/02/28 Python
python3让print输出不换行的方法
2020/08/24 Python
学生就业推荐信
2013/11/13 职场文书
先进班级集体事迹材料
2014/01/30 职场文书
公司聘任书模板
2014/03/29 职场文书
文明礼貌演讲稿
2014/05/12 职场文书
员工教育培训协议书
2014/09/27 职场文书
2014年老干部工作总结
2014/11/21 职场文书
应届生简历自我评价
2015/03/11 职场文书
入党申请书格式
2019/06/20 职场文书
OpenCV-Python实现轮廓拟合
2021/06/08 Python
详解Vue的列表渲染
2021/11/20 Vue.js
MySQL transaction事务安全示例讲解
2022/06/21 MySQL