1. 程式人生 > >加密 解密 RSA & AES & DES

加密 解密 RSA & AES & DES

class 進制 its app 需要 aes a算法 參與 rsa加密

git: https://github.com/XHTeng/XHCryptorTools

  • rsa

RSA加解密中必須考慮到的密鑰長度、明文長度和密文長度問題。明文長度需要小於密鑰長度,而密文長度則等於密鑰長度。因此當加密內容長度大於密鑰長度時,有效的RSA加解密就需要對內容進行分段。

這是因為,RSA算法本身要求加密內容也就是明文長度m必須0<m<密鑰長度n。如果小於這個長度就需要進行padding,因為如果沒有padding,就無法確定解密後內容的真實長度,字符串之類的內容問題還不大,以0作為結束符,但對二進制數據就很難,因為不確定後面的0是內容還是內容結束符。而只要用到padding,那麽就要占用實際的明文長度,於是實際明文長度需要減去padding字節長度。我們一般使用的padding標準有NoPPadding、OAEPPadding、PKCS1Padding等,其中PKCS#1建議的padding就占用了11個字節。

這樣,對於1024長度的密鑰。128字節(1024bits)-減去11字節正好是117字節,但對於RSA加密來講,padding也是參與加密的,所以,依然按照1024bits去理解,但實際的明文只有117字節了。

import base64
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
from Crypto.Hash import SHA, MD5


def rsa_md5_sign(data, pri_key):
    h = MD5.new(data.encode())
    signer = PKCS1_v1_5.new(RSA.importKey(pri_key))
    signature = signer.sign(h)
    return base64.b64encode(signature).decode()


def rsa_md5_verify(data, sign, pub_key):
    key = RSA.importKey(pub_key)
    signer = PKCS1_v1_5.new(key)
    h = MD5.new(data.encode())
    return signer.verify(h, base64.b64decode(sign))


def rsa_en(msg, pub):
    pubkey = RSA.importKey(pub)
    pubobj = PKCS1_v1_5.new(pubkey)
    res = []
    data = msg.encode()
    check_len = (pubkey.size() + 1) // 8 - 11
    for i in range(0, len(data), check_len):
        res.append(pubobj.encrypt(data[i:i + check_len]))
    a = b"".join(res)
    return base64.b64encode(a).decode()


def rsa_de(msg, pri):
    prikey = RSA.importKey(pri)
    priobj = PKCS1_v1_5.new(prikey)
    res = []
    data = base64.b64decode(msg)
    length = len(data)
    check_len = (prikey.size() + 1) // 8
    for i in range(0, length, check_len):
        res.append(priobj.decrypt(data[i:i+check_len], b‘‘).decode())
    return "".join(res)

 

加密 解密 RSA & AES & DES