# -*- 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)