An example of asymmetric encryption in python using a public/private keypair - utilizes RSA from PyCrypto library
Crypto Key Generate Rsa 1024
RSA_example.py
# 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/ |
fromCryptoimportRandom |
fromCrypto.PublicKeyimportRSA |
importbase64 |
defgenerate_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() |
returnprivatekey, publickey |
defencrypt_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 |
returnencoded_encrypted_msg |
defdecrypt_message(encoded_encrypted_msg, privatekey): |
decoded_encrypted_msg=base64.b64decode(encoded_encrypted_msg) |
decoded_decrypted_msg=privatekey.decrypt(decoded_encrypted_msg) |
returndecoded_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)) |
Let's demonstrate in practice the RSA sign / verify algorithm. We shall use the pycryptodome package in Python to generate RSA keys.After the keys are generated, we shall compute RSA digital signatures and verify signatures by a simple modular exponentiation (by encrypting and decrypting the message hash). Here is an example of creating a Java KeyPairGenerator instance: KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance('RSA'); The getInstance method takes the name of the encryption algorithm to generate the key pair for. In this example we use the name RSA. RSA the Key Generation Example 1. Randomly choose two prime numbers pand q. We choose p= 11 and q= 13. Compute n= pq. We compute n= pq= 1113 = 143. Randomly choose an odd number ein the range 1 coprime to ’(n) (i.e., e2Z ’(n)). ’(n) = ’(p) ’(q) = 1012 = 120. Thus, we choose e= 7 (e2Z 120). The following are code examples for showing how to use Crypto.PublicKey.RSA.They are from open source Python projects. You can vote up the examples you like or vote down the ones you don't like.
commented Aug 11, 2018
I ran this code but got an error. It is python 3.7 running the latest PyCryptodome Would you mind helping? I am a little lost... File 'C:(the file location and name but i'm not going to list it).py', line 29 print '%s - (%d)' % (privatekey.exportKey() , len(privatekey.exportKey())) ^ SyntaxError: invalid syntax |
Generate Rsa Key Pair
commented Aug 15, 2018
@maxharrison These print statements indicate it was written for python 2. It could be easily fixable by making use of the print function instead of the print statement., however, no guarantees. |
commented Aug 31, 2018
I am trying to learn this stuff. When I run this, I get the following error. return (self.key._encrypt(c),) TypeError: argument 1 must be int, not str I googled and found a bit on b64encode to be imported or encrypt(hash_pass, 32)[0] to include .encode('hex') but to no avail. Can you help? |
commented Sep 18, 2018 • edited
edited
Hi @anoopsaxena76, Just change the encryption line as this: encrypted_msg = encrypt_message(a_message.encode('utf-8'), publickey) I just did it myself, it works like a charm |
commented Aug 28, 2019
Hey, I'm trying to run this code on Python 3.7 too. What did you change apart from that print statement to adapt the code to Pycrytodome? I get the error:
Please help! |
commented Sep 13, 2019
Hi @GavinAren, I hope you've already solved your issue but if not: Look in your python directory for /Lib/site-packages/crypto and change it to Crypto. (Capital C) |
commented Oct 2, 2019
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. |
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment