6-python庫之-md5 base64 AES RSA加密算法

在做一些網(wǎng)絡(luò)傳輸?shù)臅r(shí)候會對數(shù)據(jù)進(jìn)行加密,這邊例舉一些常用的加密算法

1.md5

1.字符串md5

import hashlib


if __name__ == '__main__':
    username = "test"
    username_md5 = hashlib.md5(username.encode(encoding='UTF-8')).hexdigest()
    print(username_md5)

hashlib里面還有sha的各種加密方式,調(diào)用跟md5一樣,只要把md5換成sha1就可以,可以自己嘗試。

2.文件md5

import hashlib

if __name__ == '__main__':

    username = "./test.txt"

    m = hashlib.md5()
    n = 1024 * 4
    inp = open(username, 'rb')
    while True:
        buf = inp.read(n)
        if buf:
            m.update(buf)
        else:
            break
    print(m.hexdigest())
    

2.base64

base64的加密方式

import base64


if __name__ == '__main__':
    username = "test"
    username_encode = base64.b64encode(username.encode(encoding='UTF-8'))
    print(username_encode)
    username_decode = base64.b64decode(username_encode)
    print(username_decode)
    

3.AES

  • 秘鑰:加密的時(shí)候用秘鑰,解密的時(shí)候需要同樣的秘鑰才能解出來
  • 明文:需要加密的參數(shù)
  • 模式:aes 加密常用的有 ECB 和 CBC 模式(我只用了這兩個(gè)模式,還有其他模式)
  • iv 偏移量:這個(gè)參數(shù)在 ECB 模式下不需要,在 AES 模式下需要
  1. AES CBC 加密:
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex


# 如果text不足16位的倍數(shù)就用空格補(bǔ)足為16位
def add_to_16(text):
    if len(text.encode('utf-8')) % 16:
        add = 16 - (len(text.encode('utf-8')) % 16)
    else:
        add = 0

    text = text + ('\0' * add)
    return text.encode('utf-8')


# 加密函數(shù)
def encrypt(text):
    key = '9999999999999999'.encode('utf-8')
    mode = AES.MODE_CBC
    iv = b'qqqqqqqqqqqqqqqq'
    text = add_to_16(text)
    cryptos = AES.new(key, mode, iv)
    cipher_text = cryptos.encrypt(text)
    # 因?yàn)锳ES加密后的字符串不一定是ascii字符集的,輸出保存可能存在問題,所以這里轉(zhuǎn)為16進(jìn)制字符串
    return b2a_hex(cipher_text)


# 解密后,去掉補(bǔ)足的空格用strip() 去掉
def decrypt(text):
    key = '9999999999999999'.encode('utf-8')
    iv = b'qqqqqqqqqqqqqqqq'
    mode = AES.MODE_CBC
    cryptos = AES.new(key, mode, iv)
    plain_text = cryptos.decrypt(a2b_hex(text))
    return bytes.decode(plain_text).rstrip('\0')


if __name__ == '__main__':
    e = encrypt("hello world")  # 加密
    d = decrypt(e)  # 解密
    print("加密:", e)
    print("解密:", d)

2.AES ECB加密

from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex


def add_to_16(text):
    if len(text.encode('utf-8')) % 16:
        add = 16 - (len(text.encode('utf-8')) % 16)
    else:
        add = 0
    text = text + ('\0' * add)
    return text.encode('utf-8')


# 加密函數(shù)
def encrypt(text):
    key = '9999999999999999'.encode('utf-8')
    mode = AES.MODE_ECB
    text = add_to_16(text)
    cryptos = AES.new(key, mode)

    cipher_text = cryptos.encrypt(text)
    return b2a_hex(cipher_text)


# 解密后,去掉補(bǔ)足的空格用strip() 去掉
def decrypt(text):
    key = '9999999999999999'.encode('utf-8')
    mode = AES.MODE_ECB
    cryptor = AES.new(key, mode)
    plain_text = cryptor.decrypt(a2b_hex(text))
    return bytes.decode(plain_text).rstrip('\0')


if __name__ == '__main__':
    e = encrypt("hello world")  # 加密
    d = decrypt(e)  # 解密
    print("加密:", e)
    print("解密:", d)

4.RSA

rsa的加解密需要公鑰私鑰,一般客戶端使用公鑰進(jìn)行加密,服務(wù)器使用私鑰進(jìn)行解密,驗(yàn)證合法性。

在ubuntu上面執(zhí)行上面兩個(gè)命令,即可產(chǎn)生private.key和public.key兩個(gè)文件

openssl genrsa -out private.key 2048
openssl rsa -in private.key -pubout -out public.key

使用上面兩個(gè)文件進(jìn)行加解密測試,如下:

import rsa


if __name__ == '__main__':
    username = "test"
    with open("./public.key", mode="rb") as f:
        public_key = f.read()

    pubkey = rsa.PublicKey.load_pkcs1_openssl_pem(public_key)
    username_rsa = rsa.encrypt(username.encode(), pubkey)
    print(username_rsa.hex())
    print(len(username_rsa))

    with open("./private.key", mode="rb") as f:
        private_key = f.read()

    prikey = rsa.PrivateKey.load_pkcs1(private_key)
    username = rsa.decrypt(username_rsa, prikey)
    print(username)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容