html5中文学习网

您的位置: 首页 > 网站及特效实例 > jquery特效 » 正文

RC4文件加密的python实现方法_编程语言综合

[ ] 已经帮助:人解决问题

   本文实例讲述了RC4文件加密的python实现方法。分享给大家供大家参考。具体分析如下:nysHTML5中文学习网 - HTML5先行者学习网

  基于RC4流加密算法,使用扩展的16*16的S盒,32字节密钥。nysHTML5中文学习网 - HTML5先行者学习网

  目前应该是比较安全的。nysHTML5中文学习网 - HTML5先行者学习网

  刚学习python,好不容易调通了。nysHTML5中文学习网 - HTML5先行者学习网

  而且在VC和python下各实现了一遍,两个平台能够互相加解密,很有成就感的说。nysHTML5中文学习网 - HTML5先行者学习网

  下面是python3.0中的实现,在2.x下需要稍加修改。nysHTML5中文学习网 - HTML5先行者学习网

  ?nysHTML5中文学习网 - HTML5先行者学习网

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# 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程序设计有所帮助。nysHTML5中文学习网 - HTML5先行者学习网

(责任编辑:)
推荐书籍
推荐资讯
关于HTML5先行者 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助