常見加密方式及Python實現

本文首發於: 行者AI

因爲計算機軟件的非法複製,通訊的泄密、數據安全受到威脅,因此加密在開發過程當中是常常使用到的技術,在一些重要場景中都有所應用,如:登陸、支付、oauth等,場景不一樣須要搭配不同的簽名加密算法來達到業務目標。python

1. 加密算法的種類

加密算法分散列算法、對稱加密、非對稱加密。算法

(1)散列算法:常常須要驗證消息的完整性,散列(Hash)函數提供了這一服務,它對不一樣長度的輸入消息,產生固定長度的輸出。常見的算法有MD五、SHA、HMAC等。json

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

(3)非對稱加密:與對稱加密算法不一樣,非對稱加密算法須要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey)。公開密鑰與私有密鑰是一對,若是用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密;若是用私有密鑰對數據進行加密,那麼只有用對應的公開密鑰才能解密。由於加密和解密使用的是兩個不一樣的密鑰,因此這種算法叫做非對稱加密算法。常見的非對稱算法有RSA、DSA、ECC等。app

2. Python的實現

2.1 散列算法HMAC、MD5

Hmac以HmacSha1爲列,須要hmac_key祕鑰,加密數據通常採用base64編碼格式。dom

import hmac
import hashlib
from hashlib import sha1
import base64

def hash_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,但在2012年已中止更新,如今使用 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

def add_to_16(value):
    """
    str不是16的倍數那就補足爲16的倍數
    :param value: 須要加密的參數
    :return: 補足位數的參數
    """
    while len(value) % 16 != 0:
        value += b'\0'
    # 返回bytes
    return value

def encrypt_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 = "行者AI專一於遊戲領域,多年的AI技術積澱,一站式提供文本、圖片、音/視頻內容審覈,遊戲AI以及數據平臺服務"
    aes_key = "1111111111111111"
    encrypt_aes(data, aes_key)

2.3 非對稱加密RSA

(1)一樣須要安裝 PyCrytodome 庫,與3.2相同再也不贅述;加密

(2)RSA加密須要公鑰進行加密,注意的是有時須要加密的數據量較大時,須要分段進行加密,下面就以分段加密爲例,此方法也適用數據較少的加密。code

from Crypto.Cipher import PKCS1_v1_5
from Crypto.PublicKey import RSA
import base64

def cipher(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]
        encrypt_text.append(pk.encrypt(cont.encode("utf-8")))
    # 分段加密完進行拼接
    cipher_text = b''.join(encrypt_text)
    # base64進行編碼
    result = base64.b64encode(cipher_text)
    return result.decode()

if __name__ == '__main__':
    data = "行者AI專一於遊戲領域,多年的AI技術積澱,一站式提供文本、圖片、音/視頻內容審覈,遊戲AI以及數據平臺服務"
    # 讀取存放公鑰的文件得到公鑰
    rsa_key = open('publickey.pem').read()
    cipher(data, rsa_key)

3. 總結

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

相關文章
相關標籤/搜索