Python內建方法實現字串的祕鑰加解密(推薦)
在實際程式設計開發中,我們會使用到各類的加密演算法來對資料和資訊進行加密。比如密碼中比較常見的MD5加密,以及AES加密等等。
對於密碼認證來說,MD5加密是比較適合的,因為其不需要接觸到明文的資料,只需要比對MD5加密後的雜湊值就能判斷資料是否一致;而對於一些在加密後進行解密的資料而言,AES則更加的常用。
在Python中實現AES演算法需要藉助的第三方庫Crypto,其在各個作業系統上的安裝方法有些許複雜,所以對於簡單的使用有點殺雞用牛刀的意思。在Mrdoc的開發過程中,我們就遇到了這樣的問題。一方面不想為了一個小小的功能增加一個安裝容易出錯的第三方庫,一方面又有對使用者輸入的第三方密碼進行加密和解密的需求。最終,我們採用的Python內建的方法實現了。
一、設定一個祕鑰
在這個祕鑰加解密方案中,我們需要設定一個祕鑰,用來對資料進行加密和解密。在Mrdoc中,我們藉助Django專案中的SECRET_KEY變數來作為祕鑰。原則就是,儘量複雜且長:
key = 'djq%5cu#-jeq15abg$z9_i#_w=$o88m!*alpbedlbat8cr74sd'
接下來對資料的加密和解密,我們都需要使用到這個祕鑰。
二、對資料進行加密
我們的加密邏輯其實很簡單,核心是一個Python內建方法ord(),這個方法用於返回一個單位元組的ASCII碼字元的Unicode碼位。加密邏輯步驟如下:
1、建立一個空字串變數,作為加密字元的初始值;
2、使用zip()方法同時遍歷資料字串和祕鑰;
4、將得到的加密字元追加到空字串變數中;
5、返回最終的空字串變數;
其程式碼如下所示:
# 加密 def enctry(s): k = 'djq%5cu#-jeq15abg$z9_i#_w=$o88m!*alpbedlbat8cr74sd' encry_str = "" for i,j in zip(s,k): # i為字元,j為祕鑰字元 temp = str(ord(i)+ord(j))+'_' # 加密字元 = 字元的Unicode碼 + 祕鑰的Unicode碼 encry_str = encry_str + temp return encry_str
如果我們將字串”zmister”使用這個加密方法進行加密,最終會得到如下所示的加密字串:
'222_215_218_152_169_200_231_'
三、對資料進行解密
與加密的邏輯相反,我們需要把Unicode碼位還原為單位元組的ASCII碼字元,這需要利用到Python的內建方法chr()。所以資料解密的步驟如下所示:
1、定義一個空的字串變數,作為解密資料的初始值;
2、使用zip()方法同時遍歷加密後的資料和祕鑰;
3、將加密資料字元減去祕鑰字元的Unicode碼位,得到原始資料的Unicode碼位,然後使用chr()方法將其還原為ASCII單位元組字元;
4、將得到的解密字元追加到空字串變數中;
5、返回解密字元
其程式碼如下所示:
# 解密 def dectry(p): k = 'djq%5cu#-jeq15abg$z9_i#_w=$o88m!*alpbedlbat8cr74sd' dec_str = "" for i,j in zip(p.split("_")[:-1],k): # i 為加密字元,j為祕鑰字元 temp = chr(int(i) - ord(j)) # 解密字元 = (加密Unicode碼字元 - 祕鑰字元的Unicode碼)的單位元組字元 dec_str = dec_str+temp return dec_str
這樣,我們就能把加密的資料解密出來。我們用一個完整的程式碼來測試一下:
# coding:utf-8 # @檔案: utils.py # @建立者:州的先生 # #日期:2019/12/8 # 部落格地址:zmister.com # 加密 def enctry(s): k = 'djq%5cu#-jeq15abg$z9_i#_w=$o88m!*alpbedlbat8cr74sd' encry_str = "" for i,k): # i為字元,j為祕鑰字元 temp = str(ord(i)+ord(j))+'_' # 加密字元 = 字元的Unicode碼 + 祕鑰的Unicode碼 encry_str = encry_str + temp return encry_str # 解密 def dectry(p): k = 'djq%5cu#-jeq15abg$z9_i#_w=$o88m!*alpbedlbat8cr74sd' dec_str = "" for i,k): # i 為加密字元,j為祕鑰字元 temp = chr(int(i) - ord(j)) # 解密字元 = (加密Unicode碼字元 - 祕鑰字元的Unicode碼)的單位元組字元 dec_str = dec_str+temp return dec_str data = "zmister.com" print("原始資料為:",data) enc_str = enctry(data) print("加密資料為:",enc_str) dec_str = dectry(enc_str) print("解密資料為:",dec_str)
執行上述程式碼,我們會得到如下圖所示的結果:
四、最後
可以發現,這個方法對於一般性的資料加解密而言,還是比較簡單和便捷的,唯一需要考量的是祕鑰的複雜性和安全性,如果有更好地實現方法,歡迎留言討論:)
ps:Python利用字串自帶函式實現加密和解密
字串自帶的簡單加密
encode = str.maketrans('eilouvy','1234567')#加密方式 words = 'iloveyou' encode_words = words.translate(encode)#按encode加密方式加密 print(encode_words) #輸出23461745 dedoed = str.maketrans('1234567','eilouvy')#解密方式 dedoed_words = encode_words.translate(dedoed)#按decode解密方式解密 print(dedoed_words)#輸出iloveyou
這種方式十分的簡單,其中makestrans裡面的兩個引數的內容是一一對應的,解密只需要將對映方向轉變一下就行。
總結
以上所述是小編給大家介紹的Python內建方法實現字串的祕鑰加解密,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!
如果你覺得本文對你有幫助,歡迎轉載,煩請註明出處,謝謝!