Python中使用RSA算法


# -*- coding: utf-8 -*-
# Author: areful

import base64

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


class RSACipher(object):
    _private_pem = None
    _public_pem = None

    def __init__(self):
        _random_generator = Random.new().read
        _rsa = RSA.generate(1024, _random_generator)
        self._private_pem = _rsa.exportKey()
        self._public_pem = _rsa.publickey().exportKey()

    def get_public_key(self):
        return self._public_pem

    def get_private_key(self):
        return self._private_pem

    # def load_keys(self):
    #     with open('master-public.pem', "r") as f:
    #         self._public_pem = f.read()
    #     with open('master-private.pem', "r") as f:
    #         self._private_pem = f.read()
    #
    # def save_keys(self):
    #     with open('master-public.pem', 'wb') as f:
    #         f.write(self._public_pem)
    #     with open('master-private.pem', 'wb') as f:
    #         f.write(self._private_pem)

    def decrypt_with_private_key(self, _cipher_text):
        _rsa_key = RSA.importKey(self._private_pem)
        _cipher = Cipher_pkcs1_v1_5.new(_rsa_key)
        _text = _cipher.decrypt(base64.b64decode(_cipher_text), "ERROR")
        return _text.decode(encoding="utf-8")

    def encrypt_with_public_key(self, _text):
        _rsa_key = RSA.importKey(self._public_pem)
        _cipher = Cipher_pkcs1_v1_5.new(_rsa_key)
        _cipher_text = base64.b64encode(_cipher.encrypt(_text.encode(encoding="utf-8")))
        return _cipher_text

    # encrypt with private key & decrypt with public key is not allowed in Python
    # although it is allowed in RSA
    def encrypt_with_private_key(self, _text):
        _rsa_key = RSA.importKey(self._private_pem)
        _cipher = Cipher_pkcs1_v1_5.new(_rsa_key)
        _cipher_text = base64.b64encode(_cipher.encrypt(_text.encode(encoding="utf-8")))
        return _cipher_text

    def decrypt_with_public_key(self, _cipher_text):
        _rsa_key = RSA.importKey(self._public_pem)
        _cipher = Cipher_pkcs1_v1_5.new(_rsa_key)
        _text = _cipher.decrypt(base64.b64decode(_cipher_text), "ERROR")
        return _text.decode(encoding="utf-8")


if __name__ == "__main__":
    cipher = RSACipher()
    # cipher.save_keys()
    # cipher.load_keys()

    text = 'Encrypt with public key, and decrypt with private key'

    # 公鑰加密
    cipherText = cipher.encrypt_with_public_key(text)
    print(cipherText)

    # 私鑰解密
    plainText = cipher.decrypt_with_private_key(cipherText)
    print(plainText)

    # # RSA算法本身允許私鑰加密公鑰解密,實際python不允許
    # # raise TypeError("No private key")
    # cipherText = cipher.encrypt_with_private_key(text)
    # plainText = cipher.decrypt_with_public_key(cipherText)

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM