Bhushan Mahajan
Bhushan Mahajan

Reputation: 171

How to implement RSA encryption/decryption on python dictionary?

I am implementing RSA encryption/decryption. The data which is to be encrypted contains different data types. Hence I have used dictionary in python. However I am getting errors. I am attaching code snippet. Please provide solution !! Thank you.

import base64
from cryptography.fernet import Fernet
import os
import hashlib
from cryptography.hazmat.backends import default_backend
from Crypto.PublicKey import RSA
from cryptography.hazmat.primitives.asymmetric import padding
from Crypto import Random


class SplitStore:
....

  def encrPayload(self, payload):

    modulus_length = 256 * 13  # use larger value in production
    privatekey = RSA.generate(modulus_length, Random.new().read)
    public_key = privatekey.publickey()

    private_pem = privatekey.exportKey().decode()
    with open('private_pem.pem', 'w') as pr:
    pr.write(private_pem)

    byte_payload = payload.encode('utf-8', 'strict')
    #print("Byte Payload:{} ".format(byte_payload))

    encrypted_payload = public_key.encrypt(byte_payload, 32)[0]
    #print("type:{}".format(type(encrypted_payload)))
    #print("\nEncrpted METADATA: {}".format(encrypted_payload))

    bchain_file = open("blockchain/file.dat", "wb")
    bchain_file.write((encrypted_payload))

  def createMetaData(self):
    time_stamp = os.stat("/home/pc-01/sample.pdf").st_ctime
    #print("\nTIMESTAMP: {}".format(time_stamp))

    hash_data = hashlib.sha512(self.pdfReader).hexdigest()
    #print("\nHASHDATA : {}".format(hash_data))

    secret_keys = self.j   #j is a list of keys
    #print("List of secret keys: {}".format(self.j))
    #print("String conv: " + str(secret_keys[0]))

    #Creating a dictionary
    payload = {
      "time_stamp" : time_stamp, #int
      "hash" : hash_data, #string
      "keys" : secret_keys #list
    }
    #print("\nPAYLOAD: " + payload)
    return payload 
    ...


def main():

  s1 = SplitStore()
  s1.initializeData()
  ...


if __name__ == "__main__":
  main()

secret_keys in payload is a list containing keys in bytes format. After running the code I get following error:

Traceback (most recent call last): 
....... chunks = self.iterencode(o, _one_shot=True) 
File "/usr/lib/python3.5/json/encoder.py", line 256, in iterencode return _iterencode(o, 0) 
File "/usr/lib/python3.5/json/encoder.py", line 179, in default raise TypeError(repr(o) + " is not JSON serializable") 
TypeError: b'Vm3pb7XRJ4W_8M1ShKHAGiuDa2PT1DN_0ncjf0hmNJU=' is not JSON serializable

Is there any way to solve this issue?

Upvotes: 0

Views: 1520

Answers (1)

shriakhilc
shriakhilc

Reputation: 3000

If the problem isn't with the bytes as described below, you can narrow down on what causes the issue by following this answer and figuring out which of your variables are not serializable.


Your items in secret_keys are bytes, which are not JSON serializable. So you'll have to convert them to normal str objects. You can do so via the decode method as follows:

plainstr = bytestr.decode("utf-8") 
# The encoding passed need not be "utf-8", but it is quite common

Similarly, you can encode a str to bytes as follows:

encodedstr = plainstr.encode("utf-8")

Upvotes: 1

Related Questions