1. 程式人生 > 其它 >md5加密解密程式碼_Python內建方法實現基於祕鑰的資訊加解密

md5加密解密程式碼_Python內建方法實現基於祕鑰的資訊加解密

技術標籤:md5加密解密程式碼md5解密程式碼python md5解密

點選關注州的先生 精彩不容錯過

在實際程式設計開發中,我們會使用到各類的加密演算法來對資料和資訊進行加密。 比如密碼中比較常見的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,j in zip(s,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,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

data = "zmister.com"
print("原始資料為:",data)
enc_str = enctry(data)
print("加密資料為:",enc_str)
dec_str = dectry(enc_str)
print("解密資料為:",dec_str)
執行上述程式碼,我們會得到如下圖所示的結果:

51e460c651bcc89ba5b7f54ce0b8a734.png

最後

可以發現,這個方法對於一般性的資料加解密而言,還是比較簡單和便捷的,唯一需要考量的是祕鑰的複雜性和安全性,如果有更好地實現方法,歡迎留言討論:)

▼點選“

萬水千山總是情,點個“在看”行不行▼