Python內(nèi)置方法實(shí)現(xiàn)字符串的秘鑰加解密(推薦)
在實(shí)際編程開(kāi)發(fā)中,我們會(huì)使用到各類(lèi)的加密算法來(lái)對(duì)數(shù)據(jù)和信息進(jìn)行加密。比如密碼中比較常見(jià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的開(kāi)發(fā)過(guò)程中,我們就遇到了這樣的問(wèn)題。一方面不想為了一個(gè)小小的功能增加一個(gè)安裝容易出錯(cuò)的第三方庫(kù),一方面又有對(duì)用戶(hù)輸入的第三方密碼進(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)方法,歡迎留言討論:)
ps:Python利用字符串自帶函數(shù)實(shí)現(xiàn)加密和解密
字符串自帶的簡(jiǎn)單加密
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
這種方式十分的簡(jiǎn)單,其中makestrans里面的兩個(gè)參數(shù)的內(nèi)容是一一對(duì)應(yīng)的,解密只需要將映射方向轉(zhuǎn)變一下就行。
總結(jié)
以上所述是小編給大家介紹的Python內(nèi)置方法實(shí)現(xiàn)字符串的秘鑰加解密,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
解決python刪除文件的權(quán)限錯(cuò)誤問(wèn)題
下面小編就為大家分享一篇解決python刪除文件的權(quán)限錯(cuò)誤問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
python獲取list下標(biāo)及其值的簡(jiǎn)單方法
下面小編就為大家?guī)?lái)一篇python獲取list下標(biāo)及其值的簡(jiǎn)單方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09
Python搭建代理IP池實(shí)現(xiàn)存儲(chǔ)IP的方法
這篇文章主要介紹了Python搭建代理IP池實(shí)現(xiàn)存儲(chǔ)IP的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
Python實(shí)現(xiàn)將json文件中向量寫(xiě)入Excel的方法
這篇文章主要介紹了Python實(shí)現(xiàn)將json文件中向量寫(xiě)入Excel的方法,涉及Python讀取、遍歷json格式數(shù)據(jù)及Excel文件寫(xiě)入相關(guān)操作技巧,需要的朋友可以參考下2018-03-03
python+Word2Vec實(shí)現(xiàn)中文聊天機(jī)器人的示例代碼
本文主要介紹了python+Word2Vec實(shí)現(xiàn)中文聊天機(jī)器人,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
Python使用qrcode庫(kù)實(shí)現(xiàn)生成二維碼的操作指南
二維碼是一種廣泛使用的二維條碼,因其高效的數(shù)據(jù)存儲(chǔ)能力和易于掃描的特點(diǎn),廣泛應(yīng)用于支付、身份驗(yàn)證、營(yíng)銷(xiāo)推廣等領(lǐng)域,Python qrcode 庫(kù)是一個(gè)生成二維碼的工具,它能夠幫助我們輕松地生成二維碼,在本文中,我們將深入解析 qrcode 庫(kù)的使用方法及其實(shí)際應(yīng)用2025-01-01

