天天看點

python 實作的長文本RSA加密(Crypto實作)

本來要寫一個C/S架構的東西,那麼資料傳輸就是個問題,總不能明文傳輸8,于是采取RAS加密算法加密,但是RAS加密的長度有限,需要采取分片的方法,對資料進行分片加密。

需要使用Crypto包。

Crypto下載下傳安裝:

這可能是我安裝的最無語的一個包了

有Crypto,pyCrypto,pyCryptome幾個版本

本質上是一個東西

建議安裝pyCryPtome,然後吧小寫的c改成大寫C,即可正常使用。

長文本RSA加密代碼如下:

from Crypto import Random
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
import base64

class Encryption(object):
    def __init__(self):
        # 僞随機數生成器
        self.random_generator = Random.new().read

    def getKey(self):
        # rsa算法生成執行個體
        rsa = RSA.generate(1024, self.random_generator)
        # master的秘鑰對的生成
        private_pem = rsa.exportKey()
        public_pem = rsa.publickey().exportKey()
        key={}
        key["private"]=private_pem
        key["public"] =public_pem
        return key

    def rsa_long_encrypt(self,msg,pub_key_str,  length=100):
        """
        單次加密串的長度最大為 (key_size/8)-11
        1024bit的證書用100, 2048bit的證書用 200
        """
        pubobj = RSA.importKey(pub_key_str)
        pubobj = Cipher_pkcs1_v1_5.new(pubobj)
        res = []
        for i in range(0, len(msg), length):
            res.append(
                str(
                    base64.b64encode(pubobj.encrypt(
                        msg[i:i + length].encode(encoding="utf-8"))), 'utf-8'
                )
            )
        for r in res:
            print(len(r))
        return "".join(res)

    def rsa_long_decrypt(self,msg,priv_key_str,  length=172):
        """
        1024bit的證書用128,2048bit證書用256位
        """
        privobj = RSA.importKey(priv_key_str)
        privobj = Cipher_pkcs1_v1_5.new(privobj)
        res = []
        for i in range(0, len(msg), length):
            res.append(
                str(
                    privobj.decrypt(
                        base64.b64decode(msg[i:i + length])
                        , 'xyz'), 'utf-8'
                )
            )
        print(res)
        return "".join(res)

if __name__ == '__main__':
    str1="""{"ans": [{"id": 5, "sno": "6", "name": "121", "brithday": "1234-01-02", "sex": "1", "tel": "2"}, {"id": 9, "sno": "99, "name": "121", "brithday": "1234-01-02", "sex": "1", "tel": "2"}"""*5
    a = Encryption()
    # key = a.getKey()
    prikey = '-----BEGIN RSA PRIVATE KEY-----\nMIICXAIBAAKBgQC5GOlknwPrENofdQcu5oXBrVcyPkjkjXIry7Lp3NKwSRqCue+7\nNrfnJ6qoihTu79Ux4i/8F8PwOTub12FfiR6+4Uo8PeLk4l3plriZUPyuLVM2Qjoh\n8VPEF9E5eggN9CmGWdlCcvgNrag0RoO5gWkG4sadtTAep3Z0xVsY+jevbwIDAQAB\nAoGACBvORaktq8OOOqiOywAwRd7JHhtaaCDGKqL+0H3rAOwC7E0m8mWgQtEbCc0a\nw6jgBxJolbuYytJHCTmzO1MvdIwd1iRfYBqkZT71GxRvsPwN014/TleRRtPR14/s\nyzShjQFxX+QSerF6UYZqWVk8zQm4aWBQ8m5mMd/4ImkLRckCQQDLICMNeNf5QrpI\nFAGZuHYK6Nf/RJHy95O4pd7V8RQ4M3e3nd1VTBKsK8u09lN0SiFtBpH//cDU/Sv9\nR6L52IurAkEA6UdpVQQW5VENTYqkPXvpVUIG3vE62ZFjAqSWfkA/mouIyzcVzl5s\n9zsMZJ+FS/hwyEd7jFRFziNNZ1QS1MwHTQJAJTe2NHm32MwJJbvEr03FEyqmqPb/\nZu1F+8colTqe4c1MWjBqpX5SzYkYwgeAMwaCKV/S0HzGIEBjFv1RN0YeEQJBALmL\nylULtqZZDIqzjqU0zMe6h7qGBvgMcsMkZGsw8SYcfAae3uJRKryOo/HZC+38QsCa\nUsOwOAGZBLT+IyhMzDUCQAm6uJ07t9msJ6IBbp7VvscX9yAGiIvfMEmLWuUkmZXx\nluoyK+3fcPyloPFXp1IfGO+i8oDFjKzmQ9PlaP29aPk=\n-----END RSA PRIVATE KEY-----'
    pubkey = '-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5GOlknwPrENofdQcu5oXBrVcy\nPkjkjXIry7Lp3NKwSRqCue+7NrfnJ6qoihTu79Ux4i/8F8PwOTub12FfiR6+4Uo8\nPeLk4l3plriZUPyuLVM2Qjoh8VPEF9E5eggN9CmGWdlCcvgNrag0RoO5gWkG4sad\ntTAep3Z0xVsY+jevbwIDAQAB\n-----END PUBLIC KEY-----'
    print(prikey)
    print(pubkey)
    print(str1)
    cipher_text = a.rsa_long_encrypt(str1,pubkey)
    print(cipher_text)
    plaintext   = a.rsa_long_decrypt(cipher_text,prikey)
    print(plaintext)