Python內(nèi)置方法實(shí)現(xiàn)字符串的秘鑰加解密(推薦)
在實(shí)際編程開(kāi)發(fā)中,我們會(huì)使用到各類的加密算法來(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ì)用戶輸入的第三方密碼進(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)文章
Pycharm報(bào)錯(cuò)Non-zero?exit?code?(2)的完美解決方案
最近在使用pycharm安裝或升級(jí)模塊時(shí)出現(xiàn)了錯(cuò)誤,下面這篇文章主要給大家介紹了關(guān)于Pycharm報(bào)錯(cuò)Non-zero?exit?code?(2)的完美解決方案,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06使用Python實(shí)現(xiàn)多功能課堂點(diǎn)名器與抽簽工具
這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)多功能課堂點(diǎn)名器,也可以用作抽簽工具,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02Python爬蟲(chóng)回測(cè)股票的實(shí)例講解
在本篇文章里小編給大家整理的是一篇關(guān)于Python爬蟲(chóng)回測(cè)股票的實(shí)例講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-01-01解讀opencv->tensorrt的數(shù)據(jù)排列方式
這篇文章主要介紹了解讀opencv->tensorrt的數(shù)據(jù)排列方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02python廣度優(yōu)先搜索得到兩點(diǎn)間最短路徑
這篇文章主要為大家詳細(xì)介紹了python廣度優(yōu)先搜索得到兩點(diǎn)間最短路徑,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01詳解python3類型注釋annotations實(shí)用案例
這篇文章主要介紹了詳解python3類型注釋annotations實(shí)用案例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01初學(xué)者快看,Python下劃線的五個(gè)作用介紹
大家好,本篇文章主要講的是初學(xué)者快看,Python下劃線的五個(gè)作用介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12