加密 解密 RSA & AES & DES

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

  • rsa

RSA加解密中必须考虑到的密钥长度、明文长度和密文长度问题。明文长度须要小于密钥长度,而密文长度则等于密钥长度。所以当加密内容长度大于密钥长度时,有效的RSA加解密就须要对内容进行分段。git

这是由于,RSA算法自己要求加密内容也就是明文长度m必须0<m<密钥长度n。若是小于这个长度就须要进行padding,由于若是没有padding,就没法肯定解密后内容的真实长度,字符串之类的内容问题还不大,以0做为结束符,但对二进制数据就很难,由于不肯定后面的0是内容仍是内容结束符。而只要用到padding,那么就要占用实际的明文长度,因而实际明文长度须要减去padding字节长度。咱们通常使用的padding标准有NoPPadding、OAEPPadding、PKCS1Padding等,其中PKCS#1建议的padding就占用了11个字节。github

PKCS#1  - 11算法

 

OAEP  - 42app

k-2hLen-2加密

sha1 (size+1)//8-2*20-2code

这样,对于1024长度的密钥。128字节(1024bits)-减去11字节正好是117字节,但对于RSA加密来说,padding也是参与加密的,因此,依然按照1024bits去理解,但实际的明文只有117字节了。blog

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)
相关文章
相关标签/搜索