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

问题描述 投票:0回答:1

我正在使用Python RESTful API,我需要通过JSON形式通过网络发送字节编码的数据(特别是使用rsa包中的公共RSA密钥加密的数据。

这里是它的样子:

>>> 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”是我需要发送的,但是,我无法确定它是什么编码,并且程序包文档中没有提及它。如果您有任何想法,请分享:)

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

操纵了一段时间后,我找到了一种使用base64来获取正确字符串的方法。

>>> 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=='

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

谢谢!

肖恩

python json encryption byte rsa
1个回答
0
投票

Base64是一种将字节作为文本发送的相对有效的方法(每个字符6位,或者对于普通的单字节字符编码,每个字节8位)。这些字节可以具有任何值,例如在密文中找到的值。有更有效的编码,例如basE91,但是它们带来的复杂性仅提供了很少的优势。

但是,我经常在不需要的情况下看到密文被“字符串化”。文件,HTTP,套接字等都可以很好地处理任何字节值。如果要在GET请求中使用它,则应使用base64url而不是常规的base 64编码。开发人员通常会不必要地对字符串进行编码,以便可以在跟踪等中轻松看到值,但是在那种情况下,仅需要对跟踪打印输出本身进行编码。

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

© www.soinside.com 2019 - 2024. All rights reserved.