国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

RC4-文件加密的python實現方法

2019-11-02 14:23:52
字體:
來源:轉載
供稿:網友

   本文實例講述了RC4文件加密的python實現方法。分享給大家供大家參考。具體分析如下:

  基于RC4流加密算法,使用擴展的16*16的S盒,32字節密鑰。

  目前應該是比較安全的。

  剛學習python,好不容易調通了。

  而且在VC和python下各實現了一遍,兩個平臺能夠互相加解密,很有成就感的說。

  下面是python3.0中的實現,在2.x下需要稍加修改。

  ?

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'' 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'' #crc crc = struct.pack('I',binascii.crc32(dd)) #加密數據 dd=Coding(dd) x = RC4(key,len(key),dd,len(dd))
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 左贡县| 马山县| 龙江县| 清河县| 武邑县| 集安市| 宁晋县| 天全县| 沧源| 新沂市| 湘潭市| 增城市| 彩票| 卓资县| 股票| 徐州市| 固原市| 淅川县| 二连浩特市| 上思县| 安义县| 集安市| 鄢陵县| 安达市| 青铜峡市| 镇康县| 东海县| 诏安县| 威远县| 万宁市| 定结县| 榆林市| 万全县| 呈贡县| 绥宁县| 抚远县| 宜宾市| 十堰市| 宁波市| 宜昌市| 镇雄县|