Last active
June 21, 2024 19:48
-
-
Save syedrakib/241b68f5aeaefd7ef8e2 to your computer and use it in GitHub Desktop.
An example of asymmetric encryption in python using a public/private keypair - utilizes RSA from PyCrypto library
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Inspired from http://coding4streetcred.com/blog/post/Asymmetric-Encryption-Revisited-(in-PyCrypto) | |
# PyCrypto docs available at https://www.dlitz.net/software/pycrypto/api/2.6/ | |
from Crypto import Random | |
from Crypto.PublicKey import RSA | |
import base64 | |
def generate_keys(): | |
# RSA modulus length must be a multiple of 256 and >= 1024 | |
modulus_length = 256*4 # use larger value in production | |
privatekey = RSA.generate(modulus_length, Random.new().read) | |
publickey = privatekey.publickey() | |
return privatekey, publickey | |
def encrypt_message(a_message , publickey): | |
encrypted_msg = publickey.encrypt(a_message, 32)[0] | |
encoded_encrypted_msg = base64.b64encode(encrypted_msg) # base64 encoded strings are database friendly | |
return encoded_encrypted_msg | |
def decrypt_message(encoded_encrypted_msg, privatekey): | |
decoded_encrypted_msg = base64.b64decode(encoded_encrypted_msg) | |
decoded_decrypted_msg = privatekey.decrypt(decoded_encrypted_msg) | |
return decoded_decrypted_msg | |
########## BEGIN ########## | |
a_message = "The quick brown fox jumped over the lazy dog" | |
privatekey , publickey = generate_keys() | |
encrypted_msg = encrypt_message(a_message , publickey) | |
decrypted_msg = decrypt_message(encrypted_msg, privatekey) | |
print "%s - (%d)" % (privatekey.exportKey() , len(privatekey.exportKey())) | |
print "%s - (%d)" % (publickey.exportKey() , len(publickey.exportKey())) | |
print " Original content: %s - (%d)" % (a_message, len(a_message)) | |
print "Encrypted message: %s - (%d)" % (encrypted_msg, len(encrypted_msg)) | |
print "Decrypted message: %s - (%d)" % (decrypted_msg, len(decrypted_msg)) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
PyCrypto is written and tested using Python version 2.1 through 3.3. Python
1.5.2 is not supported. My POC resolves that pycrypto is obsoleted in python3.7. Pycryptodome is working alternative of it, but unfortunately it doesn't support plain RSA cryptography.