md5加密解密代码_Python内置方法实现基于秘钥的信息加解密
生活随笔
收集整理的這篇文章主要介紹了
md5加密解密代码_Python内置方法实现基于秘钥的信息加解密
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
點(diǎn)擊關(guān)注州的先生 精彩不容錯(cuò)過(guò)
在實(shí)際編程開發(fā)中,我們會(huì)使用到各類的加密算法來(lái)對(duì)數(shù)據(jù)和信息進(jìn)行加密。比如密碼中比較常見的MD5加密,以及AES加密等等。對(duì)于密碼認(rèn)證來(lái)說(shuō),MD5加密是比較適合的,因?yàn)槠洳恍枰佑|到明文的數(shù)據(jù),只需要比對(duì)MD5加密后的哈希值就能判斷數(shù)據(jù)是否一致;而對(duì)于一些在加密后進(jìn)行解密的數(shù)據(jù)而言,AES則更加的常用。在Python中實(shí)現(xiàn)AES算法需要借助的第三方庫(kù)Crypto,其在各個(gè)操作系統(tǒng)上的安裝方法有些許復(fù)雜,所以對(duì)于簡(jiǎn)單的使用有點(diǎn)殺雞用牛刀的意思。在Mrdoc的開發(fā)過(guò)程中,我們就遇到了這樣的問(wèn)題。一方面不想為了一個(gè)小小的功能增加一個(gè)安裝容易出錯(cuò)的第三方庫(kù),一方面又有對(duì)用戶輸入的第三方密碼進(jìn)行加密和解密的需求。最終,我們采用的Python內(nèi)置的方法實(shí)現(xiàn)了。設(shè)置一個(gè)秘鑰
在這個(gè)秘鑰加解密方案中,我們需要設(shè)置一個(gè)秘鑰,用來(lái)對(duì)數(shù)據(jù)進(jìn)行加密和解密。在Mrdoc中,我們借助Django項(xiàng)目中的SECRET_KEY變量來(lái)作為秘鑰。原則就是,盡量復(fù)雜且長(zhǎng):key = 'djq%5cu#-jeq15abg$z9_i#_w=$o88m!*alpbedlbat8cr74sd'接下來(lái)對(duì)數(shù)據(jù)的加密和解密,我們都需要使用到這個(gè)秘鑰。對(duì)數(shù)據(jù)進(jìn)行加密我們的加密邏輯其實(shí)很簡(jiǎn)單,核心是一個(gè)Python內(nèi)置方法ord(),這個(gè)方法用于返回一個(gè)單字節(jié)的ASCII碼字符的Unicode碼位。加密邏輯步驟如下:1、創(chuàng)建一個(gè)空字符串變量,作為加密字符的初始值;
2、使用zip()方法同時(shí)遍歷數(shù)據(jù)字符串和秘鑰;
3、使用ord()方法分別獲取遍歷的數(shù)據(jù)字符和秘鑰字符的Unicode碼位,并將其相加,得到此數(shù)據(jù)字符的加密字符;
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”使用這個(gè)加密方法進(jìn)行加密,最終會(huì)得到如下所示的加密字符串:'222_215_218_152_169_200_231_'
對(duì)數(shù)據(jù)進(jìn)行解密
與加密的邏輯相反,我們需要把Unicode碼位還原為單字節(jié)的ASCII碼字符,這需要利用到Python的內(nèi)置方法chr()。所以數(shù)據(jù)解密的步驟如下所示:1、定義一個(gè)空的字符串變量,作為解密數(shù)據(jù)的初始值;
2、使用zip()方法同時(shí)遍歷加密后的數(shù)據(jù)和秘鑰;
3、將加密數(shù)據(jù)字符減去秘鑰字符的Unicode碼位,得到原始數(shù)據(jù)的Unicode碼位,然后使用chr()方法將其還原為ASCII單字節(jié)字符;
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碼)的單字節(jié)字符
dec_str = dec_str+temp
return dec_str這樣,我們就能把加密的數(shù)據(jù)解密出來(lái)。我們用一個(gè)完整的代碼來(lái)測(cè)試一下:# coding:utf-8
# @文件: utils.py
# @創(chuàng)建者:州的先生
# #日期: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碼)的單字節(jié)字符
dec_str = dec_str+temp
return dec_str
data = "zmister.com"
print("原始數(shù)據(jù)為:",data)
enc_str = enctry(data)
print("加密數(shù)據(jù)為:",enc_str)
dec_str = dectry(enc_str)
print("解密數(shù)據(jù)為:",dec_str)運(yùn)行上述代碼,我們會(huì)得到如下圖所示的結(jié)果:
最后
可以發(fā)現(xiàn),這個(gè)方法對(duì)于一般性的數(shù)據(jù)加解密而言,還是比較簡(jiǎn)單和便捷的,唯一需要考量的是秘鑰的復(fù)雜性和安全性,如果有更好地實(shí)現(xiàn)方法,歡迎留言討論:)▼點(diǎn)擊“
萬(wàn)水千山總是情,點(diǎn)個(gè)“在看”行不行▼?
總結(jié)
以上是生活随笔為你收集整理的md5加密解密代码_Python内置方法实现基于秘钥的信息加解密的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java多线程中出现的异常分别有哪些_j
- 下一篇: java求1000内的水仙花数