程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> RC4文件加密的python實現方法

RC4文件加密的python實現方法

編輯:更多關於編程

       本文實例講述了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)) key = UpdataKey(key) #寫入文件 fout.write(struct.pack('H',srl)) fout.write(x) fout.write(crc) fin.close() fout.close() print('OK!') input()

      希望本文所述對大家的Python程序設計有所幫助。

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved