常見加密方式及Python實現

2021-10-19 14:18:02 字數 3840 閱讀 4432

行者ai

由於計算機軟體的非法複製,通訊的洩密、資料安全受到威脅,所以加密在開發過程中是經常使用到的技術,在一些重要場景中都有所應用,如:登入、支付、oauth等,場景不同需要搭配不一樣的簽名加密演算法來達到業務目標。

加密演算法分雜湊演算法、對稱加密、非對稱加密。

(1)雜湊演算法:經常需要驗證訊息的完整性,雜湊(hash)函式提供了這一服務,它對不同長度的輸入訊息,產生固定長度的輸出。常見的演算法有md5、sha、hmac等。

(2)對稱加密:就是採用這種加密方法的雙方使用方式用同樣的金鑰進行加密和解密。金鑰是控制加密及解密過程的指令。演算法是一組規則,規定如何進行加密和解密。常見的對稱演算法有aes、des、3des等。

(3)非對稱加密:與對稱加密演算法不同,非對稱加密演算法需要兩個金鑰:公開金鑰(publickey)和私有金鑰(privatekey)。公開金鑰與私有金鑰是一對,如果用公開金鑰對資料進行加密,只有用對應的私有金鑰才能解密;如果用私有金鑰對資料進行加密,那麼只有用對應的公開金鑰才能解密。因為加密和解密使用的是兩個不同的金鑰,所以這種演算法叫作非對稱加密演算法。常見的非對稱演算法有rsa、dsa、ecc等。

2.1 雜湊演算法hmac、md5

hmac以hmacsha1為列,需要hmac_key秘鑰,加密資料一般採用base64編碼格式。

import hmac

import hashlib

from hashlib import sha1

import base64

defhash_hmac

(data, hmac_key)

:"""

:param data: 需要加密的資料

:param hmac_key: hmac秘鑰

:return: 加密後的密文

"""# 對加密資料進行base64編碼

data = base64.b64encode(data.encode(

'utf-8'))

.decode(

"utf-8"

)# 對編碼後的資料進行hmacsha1

hmac_code = hmac.new(hmac_key.encode(

), data.encode(

), sha1)

.hexdigest(

)# 對hmacsha1後的資料進行md5

sign = hashlib.md5(hmac_code.encode())

.hexdigest(

)return sign

if __name__ ==

'__main__'

: hash_hmac(

"text=智慧型內容審核"

,"潛在"

)

2.2 對稱加密aes

(1)對於對稱加密或非對稱都需要安裝第三方庫,python中的密碼庫是pycrypto,但在2023年已停止更新,現在使用 pycrytodome 取代 pycrypto 。

pip install pycryptodome
(2)aes有5種加密模式,分別是ecb, cbc, ctr, cfb, ofb,下面以aes的ecb模式為例,同樣aes也需要加密秘鑰aes_key,需要注意的是如果加密資料不足16或32位時需要補足為它們的倍數,下面以16的倍數為例:

import json

import base64

from crypto.cipher import aes

defadd_to_16

(value)

:"""

str不是16的倍數那就補足為16的倍數

:param value: 需要加密的引數

:return: 補足位數的引數

"""while

len(value)%16

!=0: value += b'\0'

# 返回bytes

return value

defencrypt_aes

(data, aes_key)

:"""

aes的ecb模式加密

:param data: 加密資料

:param aes_key: 加密的秘鑰

:return: 加密之後的密文

"""# 秘鑰

key = aes_key.encode(

)# 待加密文字

text =

bytes

(json.dumps(data)

.replace(

" ","")

.encode(

'utf-8'))

# 對加密資料進行填充

text = add_to_16(text)

# 初始化加密器,使用ecb模式

aes = aes.new(key, aes.mode_ecb)

# 先進行aes加密

aes_code = aes.encrypt(text)

# 用base64轉成字串形式,執行加密並轉碼返回bytes

encrypted_text = base64.encodebytes(aes_code)

return encrypted_text

if __name__ ==

'__main__'

: data =

aes_key =

"1111111111111111"

encrypt_aes(data, aes_key)

2.3 非對稱加密rsa

(1)同樣需要安裝 pycrytodome 庫,與3.2相同不再贅述;

(2)rsa加密需要公鑰進行加密,注意的是有時需要加密的資料量較大時,需要分段進行加密,下面就以分段加密為例,此方法也適用資料較少的加密。

from crypto.cipher import pkcs1_v1_5

from crypto.publickey import rsa

import base64

defcipher

(data, rsa_key)

:"""

公鑰加密

:param msg: 要加密內容

:return: 加密之後的密文

"""# 獲取公鑰

key = rsa_key

publickey = rsa.importkey(key)

# 分段加密

pk = pkcs1_v1_5.new(publickey)

encrypt_text =

# 對資料進行分段加密

for i in

range(0

,len

(data)

,100):

cont = data[i:i +

100]

"utf-8"))

)# 分段加密完進行拼接

cipher_text = b''

.join(encrypt_text)

# base64進行編碼

result = base64.b64encode(cipher_text)

return result.decode(

)if __name__ ==

'__main__'

: data =

# 讀取存放公鑰的檔案獲得公鑰

rsa_key =

open

('publickey.pem'

).read(

) cipher(data, rsa_key)

本文只是簡單介紹了分雜湊演算法、對稱加密、非對稱加密及示例,有些已經遭到破譯,有些安全度不高,有些強度不明,有些待進一步分析,有些需要深入研究。

加密 常見加密方式

由於在學習jwt的時候會涉及使用很多加密演算法,所以在這裡做下掃盲,簡單了解就可以 加密演算法種類有 解釋 加密後,密文可以反向解密得到密碼原文.4.1.1.對稱加密 檔案加密和解密使用相同的金鑰,即加密金鑰也可以用作解密金鑰 解釋 在對稱加密演算法中,資料發信方將明文和加密金鑰一起經過特殊的加密演...

最常見加密方式和Python實現 入門篇)

前言 我們所說的加密方式,都是對二進位制編碼的格式進行加密的,對應到python中,則是我們的bytes。所以當我們在python中進行加密操作的時候,要確保我們操作的是bytes,否則就會報錯。將字串和bytes互相轉換可以使用encode 和decode 方法。如下所示 方法中不傳引數則是以預設...

41 常見的加密方式

1.1 介紹 base64是一種用64個字元來表示任意二進位制資料的方法。base64是一種編碼方式而不是加密演算法。只是看上去像是加密 base64使用a z,a z,0 9,64個字元實現對資料進行加密 1.2 python使用import base64 base64.b64encode b s...