1. 程式人生 > 程式設計 >Python內建方法實現字串的祕鑰加解密(推薦)

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()方法同時遍歷資料字串和祕鑰;

3、使用ord()方法分別獲取遍歷的資料字元和祕鑰字元的Unicode碼位,並將其相加,得到此資料字元的加密字元;
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內建方法實現字串的祕鑰加解密,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!
如果你覺得本文對你有幫助,歡迎轉載,煩請註明出處,謝謝!