【问题标题】:How to implement RSA encryption/decryption on python dictionary?如何在 python 字典上实现 RSA 加密/解密?
【发布时间】:2019-10-03 08:47:34
【问题描述】:

我正在实施 RSA 加密/解密。要加密的数据包含不同的数据类型。因此我在python中使用了字典。但是我遇到了错误。我附上代码sn-p。请提供解决方案!!谢谢。

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()

payload 中的secret_keys 是一个包含字节格式键的列表。运行代码后出现以下错误:

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

有没有办法解决这个问题?

【问题讨论】:

  • 你没有提到你遇到了什么错误,在哪一行
  • 有效载荷中的secret_keys 是包含字节格式密钥的列表。运行代码后,我收到以下错误: Traceback (last recent call last): ....... chunks = self.iterencode(o, _one_shot=True) File "/usr/lib/python3.5/json/encoder .py”,第 256 行,在 iterencode 返回 _iterencode(o, 0) 文件“/usr/lib/python3.5/json/encoder.py”,第 179 行,默认提高 TypeError(repr(o) + " 不是JSON 可序列化") TypeError: b'Vm3pb7XRJ4W_8M1ShKHAGiuDa2PT1DN_0ncjf0hmNJU=' is not JSON serializable 它是说字节不是 JSON 可序列化的。
  • 谁能分享在python字典上实现RSA的逻辑或方法
  • 您可能想查看this answer。使用 type() 确认对象实际上是 JSON 可序列化的,如果不是,则将它们转换为可序列化的类型。
  • 另外,虽然您的错误消息不是TypeError: Object of type bytes is not JSON serializable,但它们通常不可序列化。那么您可以尝试将bytes 对象转换为普通字符串然后尝试吗?您需要使用bytes.decode(),我假设使用“utf-8”编码。

标签: python-3.x rsa


【解决方案1】:

如果问题不在于bytes,如下所述,您可以通过关注this answer 并找出哪些变量不可序列化来缩小导致问题的范围。


secret_keys 中的项目是 bytes,它们不是 JSON 可序列化的。因此,您必须将它们转换为普通的 str 对象。您可以通过decode 方法执行此操作,如下所示:

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

同样,您可以将encodestr 转换为bytes,如下所示:

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

【讨论】:

  • 谢谢!得到了预期的输出
猜你喜欢
  • 2019-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
  • 2020-11-25
  • 1970-01-01
相关资源
最近更新 更多