RC4文件加密的python实现方法

作者:1Byte 时间:2023-12-21 20:25:28 

本文实例讲述了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程序设计有所帮助。

标签:RC4,加密,python
0
投稿

猜你喜欢

  • python通过get,post方式发送http请求和接收http响应的方法

    2022-04-09 04:37:54
  • SQL Server 事务,异常和游标详解

    2024-01-18 19:25:19
  • python中yield的用法详解——最简单,最清晰的解释

    2021-10-22 21:27:56
  • mysql设置某字段不能重复问题

    2024-01-19 19:22:14
  • Oracle数据库对象的使用详解

    2024-01-28 16:38:30
  • Python如何爬取51cto数据并存入MySQL

    2024-01-15 02:18:16
  • Python中使用__new__实现单例模式并解析

    2021-10-29 23:11:22
  • CSS制作圆角导航的另一思路

    2008-11-06 11:39:00
  • MySQL中group_concat函数深入理解

    2024-01-14 23:31:34
  • Python中二维列表如何获取子区域元素的组成

    2021-02-16 02:41:01
  • 关于VSCode 配置使用 PyLint 语法检查器的问题

    2023-06-18 17:10:33
  • python实现将html表格转换成CSV文件的方法

    2023-08-25 00:48:41
  • GoLang中Strconv库有哪些常用方法

    2024-05-09 10:11:17
  • tensorflow2.0教程之Keras快速入门

    2022-05-11 22:34:17
  • Python读取Word文档中的Excel嵌入文件的方法详解

    2022-12-21 14:11:23
  • JavaScript面向对象中的封装和继承你了解吗

    2024-06-07 16:00:16
  • 在Mac OS上使用mod_wsgi连接Python与Apache服务器

    2021-12-18 11:20:02
  • php cli换行示例

    2024-05-03 15:50:59
  • Python hashlib模块加密过程解析

    2021-09-08 13:29:25
  • php tpl模板引擎定义与使用示例

    2023-11-14 22:04:49
  • asp之家 网络编程 m.aspxhome.com