• 加密 解密 RSA & AES & DES


    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个字节。

    PKCS#1  - 11

    OAEP  - 42

    k-2hLen-2

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

    这样,对于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)
    

     

  • 相关阅读:
    常用的正则表达式
    vue多页面应用
    webpack + jquery + bootstrap 环境配置
    Goroutine的几个例子
    设置css通用字体
    简单的gulpfile.js参数配置
    1:时间戳转换成年月日函数,2:url截取参数方法,3:弹窗自定义方法 4:点击按钮加入购物车
    github上比较全的知识
    秒杀倒计时
    正则校验手机号码并获取手机验证码倒计时的实例
  • 原文地址:https://www.cnblogs.com/dzhs/p/7662363.html
Copyright © 2020-2023  润新知