Source code for soma.crypt
# -*- coding: utf-8 -*-
'''
Functions to manage private/public keys encryption.
This module needs Crypto module.
'''
from __future__ import absolute_import
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
from base64 import b64decode, b64encode
import Crypto
import six
from six.moves import range
if [int(x) for x in Crypto.__version__.split('.')] < [2, 1]:
# pyrypro <= 2.0.x is not suitable since it is missing needed functions
# such as exportKey() and importKey()
raise ImportError('Crypto module (pycrypto) is too old for soma.crypt '
'- please install pycryptodome')
[docs]def generate_RSA(bits=2048):
'''
Generate an RSA keypair with an exponent of 65537 in PEM format
param: bits The key length in bits
Return private key and public key
'''
if [int(x) for x in Crypto.__version__.split('.')] < [2, 1]:
import random
def gen_func(n):
return ''.join([chr(random.randrange(0, 256, 1))
for i in range(n)])
new_key = RSA.generate(bits, gen_func)
else:
new_key = RSA.generate(bits)
public_key = new_key.publickey().exportKey("PEM")
private_key = new_key.exportKey("PEM")
return private_key, public_key
[docs]def encrypt_RSA(public_key_loc, message):
'''
param: public_key_loc Path to public key
param: message String to be encrypted
return base64 encoded encrypted string
'''
key = open(public_key_loc, "rb").read()
rsakey = RSA.importKey(key)
if not isinstance(message, six.binary_type):
message = message.encode()
encryptor = PKCS1_OAEP.new(rsakey)
encrypted = encryptor.encrypt(message)
#encrypted = rsakey.encrypt(message, None)[0]
return b64encode(encrypted)
[docs]def decrypt_RSA(private_key_loc, package):
'''
param: public_key_loc Path to your private key
param: package String to be decrypted
return decrypted string
'''
key = open(private_key_loc, "rb").read()
rsakey = RSA.importKey(key)
decryptor = PKCS1_OAEP.new(rsakey)
decrypted = decryptor.decrypt(b64decode(package))
#decrypted = rsakey.decrypt(b64decode(package))
return decrypted