教你用Python做個簡單的加密程序(還基礎什么呀,直接來練習吧,帶源碼)


       因為發現基礎教程我之前推薦的那個網站就已經很完善了,就不重復寫了,所以本汪來一起做練習吧。

 

一、加密原理

       記得當時我學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()

       大家也來寫一個屬於自己的加密小程序吧^_^。加密和解密可以優化在一個方法里面,之前一開始想的采用一開始的加法進行加密,減法進行解密,最后還是采用了異或加密所以加密和解密就一樣了,大家可以優化一下代碼哦。也可以使用其他方式試試哦,歡迎一起交流^_^

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM