因為發現基礎教程我之前推薦的那個網站就已經很完善了,就不重復寫了,所以本汪來一起做練習吧。
一、加密原理
記得當時我學c++的時候,學到輸入輸出流的時候,當時王老師就教我們寫了一個小的加密程序,所以這次既然學習了Python這個小練習當然不能放過(其實這個加密程序我用c++,java都寫過可以說也算比較熟了)。加密原理就是循環讀取文件每個字節,然后進行相應的加密運算后就是加密操作了,解密時候進行逆運算就是解密操作了。
比如我們讀取文件的第一個字節數據是20(讀取出來的每位數據為0~255,因為8位是1字節,所以二進制的00000000~11111111表示的無符號數字范圍就是0~255了),加密我們可以選擇在這個基礎上加1,那么加密后的第1個字節就是21了,如果我們將所有字節加1,那么相當於文件進行了加密(需要注意的是如果是255的話加1會越界,所以邊界值需要特殊處理,如256的話我們則直接寫入0)。解密時候我們每個字節都減1即可(當然邊界值需要自己處理,比如之前加密后的0,我們直接寫入255)。當然這樣解密是不是很容易就會破解那,所以我們可以定義一個字符串來進行加密,比如“123456”,我們第1個字節與1進行加密,第2個字節與2進行加密,到了第7個我們再與1加密進行,直到所有字節都循環與這個字符串加密完,這樣是不是加大了破解的難度那?
當然我用的是異或加密算法,異或一個最神奇的地方莫過於不借助任何變量將2個變量的值交換了。比如
a=10 b=20 a^=b b^=a a^=b print(a) print(b) #輸出 #20 #10
是不是很神奇呢,所以加密使用異或也可以很方便的進行加密和還原
二、程序效果演示
1.創建一個txt文件(當然圖片,聲音,所有格式文件都可以),這里方便演示我選擇一個txt文件
2.運行寫好的python腳本
加密后的文件是不是什么都看不出來了
3.進行解密(我們輸入一次錯誤的密碼,當然密碼近似度越高,還原的內容就會越多,當然如果是圖片或者聲音那么你錯一個都是無法播放的)
三、本汪寫的加密源碼(如有不足請指正)
1 #作者:smallfoxdog 小狐狸狗狗 2 #時間:2018年3月20日13:57:04 3 #功能:文件的加密和解密 4 5 import os 6 7 #主函數 8 def main(): 9 getInput() 10 11 #輸入參數 12 def getInput(): 13 14 #獲取操作的參數 15 while(True): 16 17 oper = input("請輸入操作(e:加密 d:解密):") 18 19 if(oper=="e" or oper=="d"): 20 break 21 else: 22 print("輸入有誤,請重新輸入!") 23 24 #獲取文件密碼 25 while(True): 26 27 password= input("請輸入密碼:") 28 29 if(len(password)==0): 30 print("密碼不能為空!") 31 else: 32 break 33 34 #獲取操作的文件路徑 35 while(True): 36 37 path=input("請輸入文件路徑:") 38 39 try: 40 f_read = open(path,"rb") 41 except: 42 print("文件沒有找到,請檢查路徑是否存在!") 43 else: 44 break 45 46 #進行加密或解密操作 47 if(oper=="e"): 48 encrypt(path,password) 49 elif(oper=="d"): 50 decrypt(path, password) 51 52 #加密 53 def encrypt(path,password): 54 55 #因為剛學可能有庫可以直接獲取這些信息吧,不過自己寫個算法獲取這些信息也沒什么難度 56 fileFullName = path.split(os.path.sep)#os.path.sep為操作系統的文件分隔符 57 fileName = fileFullName[len(fileFullName)-1].split(".")[0] 58 fileSuffix = fileFullName[len(fileFullName)-1].split(".")[1] 59 60 # print("文件全名稱:",fileFullName[len(fileFullName)-1]) 61 # print("文件名稱:",fileName) 62 # print("文件后綴:",fileSuffix) 63 64 fileParent = path[0:len(path)-len(fileFullName[len(fileFullName)-1])] 65 newFileName="加密_"+fileFullName[len(fileFullName)-1] 66 newFilePath=fileParent+newFileName 67 68 # print("文件父路徑:",fileParent) 69 # print("新的文件名稱:",newFileName) 70 # print("新的文件全路徑:", newFilePath) 71 72 f_read = open(path,"rb") 73 f_write = open(newFilePath,"wb") 74 75 count=0 #當前密碼加密索引 76 77 #我們采用異或循環加密 78 for now in f_read: 79 for nowByte in now: 80 newByte=nowByte^ord(password[count%len(password)]) 81 count+=1 82 f_write.write(bytes([newByte])) 83 84 f_read.close() 85 f_write.close() 86 87 print("汪~文件加密完畢^_^") 88 89 #解密(因為我們采取的異或解密,所以其實和加密算法一樣) 90 def decrypt(path, password): 91 # 因為剛學可能有庫可以直接獲取這些信息吧,不過自己寫個算法獲取這些信息也沒什么難度 92 fileFullName = path.split(os.path.sep) # os.path.sep為操作系統的文件分隔符 93 fileName = fileFullName[len(fileFullName) - 1].split(".")[0] 94 fileSuffix = fileFullName[len(fileFullName) - 1].split(".")[1] 95 96 # print("文件全名稱:", fileFullName[len(fileFullName)-1]) 97 # print("文件名稱:", fileName) 98 # print("文件后綴:", fileSuffix) 99 100 fileParent = path[0:len(path) - len(fileFullName[len(fileFullName)-1])] 101 newFileName = "解密_" + fileFullName[len(fileFullName) - 1] 102 newFilePath = fileParent + newFileName 103 104 # print("文件父路徑:", fileParent) 105 # print("新的文件名稱:", newFileName) 106 # print("新的文件全路徑:", newFilePath) 107 108 f_read = open(path, "rb") 109 f_write = open(newFilePath, "wb") 110 111 count = 0 # 當前密碼加密索引 112 113 # 我們采用異或循環加密 114 for now in f_read: 115 for nowByte in now: 116 newByte = nowByte ^ ord(password[count % len(password)]) 117 count += 1 118 f_write.write(bytes([newByte])) 119 120 f_read.close() 121 f_write.close() 122 123 print("汪~文件解密完畢^_^") 124 125 main()
大家也來寫一個屬於自己的加密小程序吧^_^。加密和解密可以優化在一個方法里面,之前一開始想的采用一開始的加法進行加密,減法進行解密,最后還是采用了異或加密所以加密和解密就一樣了,大家可以優化一下代碼哦。也可以使用其他方式試試哦,歡迎一起交流^_^