Python 通过JSON发送字节编码数据

Python 通过JSON发送字节编码数据,python,json,encryption,byte,rsa,Python,Json,Encryption,Byte,Rsa,我正在开发Python RESTful API,我需要通过JSON表单通过网络发送字节编码的数据(特别是使用包中的公钥加密的数据) 下面是它的外观: >>> import rsa >>> pubkey, privkey = rsa.newkeys(512, True) # Create a pair of public/private rsa keys ; 512 is for the example >>> encStr = rsa.enc

我正在开发Python RESTful API,我需要通过JSON表单通过网络发送字节编码的数据(特别是使用包中的公钥加密的数据)

下面是它的外观:

>>> import rsa
>>> pubkey, privkey = rsa.newkeys(512, True) # Create a pair of public/private rsa keys ; 512 is for the example
>>> encStr = rsa.encrypt(b"Test string", pubkey) # Encrypt a bytes object using the public key
>>> encStr
b'r\x10\x03e\xc6*\xa8\xb1\xee\xbd\x18\x0f\x7f\xecz\xcex\xabP~\xb3]\x8f)R\x9b>i\x03\xab-m\x0c\x19\xd7\xa5f$\x07\xc1;X\x0b\xaa2\x99\xa8&\xfc/\x9f\x05!nk\x93%\xc0\xf5\x1d\xf8C\x1fo'
“encStr”是我需要发送的,但是,我不知道它是什么编码,包文档也没有提到它。如果您有任何想法,请分享:)

现在我只需要发送这个,但是,我想知道是否有更有效的方法(更短的字符串;更少的操作,考虑到客户端必须编码和服务器解码,等等)

谢谢


Shawn

Base64是一种相对有效的以文本形式发送字节的方法(每个字符6位,或者对于正常的单字节字符编码,每个字节8位)。这些字节可以有任何值,如密文中的值。有更有效的编码,例如,但由于其带来的复杂性,它们只提供很少的优势

然而,我经常看到密文在没有必要的情况下被“字符串化”。文件、HTTP、套接字等都能很好地处理任何字节值。如果您想在GET请求中使用它,那么应该使用base64url而不是普通的Base64编码。开发人员通常不必要地对字符串进行编码,以便在跟踪等中容易看到值,但在这种情况下,只需要对跟踪打印输出本身进行编码


请注意,我建议您使用PKCS#1而不是PKCS,密钥大小至少为3072位,特别是如果您希望加密传输的数据而不是“就地”加密的数据。

这不是文本编码。Base 64是以字符串形式发送二进制数据的合理方式。请注意,您不是在加密“字节编码字符串”,而是在加密一个字节对象,它根本不是字符串。命名不正确,明白了!更正。实际上,在本例中,它并不是一个字符串,但在我的项目中是:)base64编码是一种有效的方法,可以为面向文本的传输编码二进制数据。一直都是这样。构建二进制传输(抛弃json、http等)是可能的,但考虑到互联网上其他99%的应用程序都不能做到这一点,您不必担心。
>>> encStr.decode("utf-8")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec cannot decode byte 0x8e in position 0: invalid start byte
>>> encStr.decode("latin1")
'\x8eM\x96Æ\'zÈZ\x89\x85±\x98Z¯Ûzùæ¯;£zñ8\x9b§Ù\x9dÏ\x8eâ0®\x89ó(*?\x92ªg\x12ôsä\x1d\x96\x19\x82\x19-3\x15SBýh"3òÖß\x91Ô' # This could be it
>>> encStr.decode("latin1").encode("latin1")
b'\x8eM\x96\xc6\'z\xc8Z\x89\x85\xb1\x98Z\xaf\xdbz\xf9\xe6\xaf;\xa3z\xf18\x9b\xa7\xd9\x9d\xcf\x8e\xe20\xae\x89\xf3(*?\x92\xaag\x12\xf4s\xe4\x1d\x96\x19\x82\x19-3\x15SB\xfdh"3\xf2\xd6\xdf\x91\xd4' # Nop, garbage
>>> import base64
>>> b64_encStr = base64.b64encode(encStr)
>>> b64_encStr
b'jk2Wxid6yFqJhbGYWq/bevnmrzujevE4m6fZnc+O4jCuifMoKj+SqmcS9HPkHZYZghktMxVTQv1oIjPy1t+R1A=='
>>> b64_encStr.decode("utf-8")
'jk2Wxid6yFqJhbGYWq/bevnmrzujevE4m6fZnc+O4jCuifMoKj+SqmcS9HPkHZYZghktMxVTQv1oIjPy1t+R1A=='