【问题标题】:Encrypt JSON with SHA256 hash, got 512 characters back instead of 64使用 SHA256 哈希加密 JSON,得到 512 个字符而不是 64 个字符
【发布时间】:2019-10-13 02:37:04
【问题描述】:

基于Google documentcryptography.io

我尝试加密一个 JSON 格式的查询结果,类似于 {"data":"abc"}。据我所知,使用 SHA256 加密时,加密的数据将采用 64 个字符的形式,但在我查看并尝试使用链接中的代码和一些修改后,我得到的结果是 512 个字符而不是 64 个字符。

这是我的代码:

def encrypt_rsa(_rsa_pub, plaintext):
    key_txt = _rsa_pub.encode()
    public_key = serialization.load_pem_public_key(key_txt, default_backend())

    # encrypt plaintext
    pad = padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),
                       algorithm=hashes.SHA256(),
                       label=None)
    return public_key.encrypt(plaintext, pad)

pk = ....#public key
message = .... #query result (JSON)
x = json.dumps(message).encode('utf-8')
enc = encrypt_rsa(pk , x)
enc = base64.b64encode(enc).decode()
dec = decrypt_rsa(enc)

没有错误,但我得到了一个包含 512 个字符的长加密数据,这真的很奇怪。我尝试使用cryptography.io 的代码对其进行解密,但出现错误:

AttributeError: 'str' object has no attribute 'decrypt'

我认为这个错误可能是因为错误的加密数据应该是 64 个字符,但输入是 512 个字符。那么,根据我的情况,我忘记了什么或者应该在这段代码中添加什么以使其成为可以解密的 64 个字符的加密数据?

编辑:解密函数

def decrypt_rsa(ciphertext):
    private_key = .....
    pad = padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),
                   algorithm=hashes.SHA256(),
                   label=None)
    return private_key.decrypt(ciphertext, pad)

错误发生在返回结果的行decrypt。我实际上将加密的数据传递给了这个函数。而且我认为这不是因为密钥,因为它不应该提供这样的错误结果

【问题讨论】:

  • 在这一行algorithm=hashes.SHA256(), 你确定不应该是algorithm=hashes.SHA256, 吗?
  • 我从谷歌文档中复制了所以..是的(上面的链接)
  • @Nullman:一个合理的猜测,但我对这个包很熟悉,他的那部分是正确的。

标签: python encryption hash cryptography rsa


【解决方案1】:

您正在使用 RSA 加密数据。 (不是 SHA256,这只是 RSA 加密的一个参数。)请注意,RSA 通常仅用于加密/解密非常少量的数据。通常它用于加密/解密另一个对称密钥,例如对于 AES,然后使用 AES 完成批量加密/解密。

RSA 密文的大小由 RSA 密钥大小决定。在这种情况下,您可能正在使用 4096 位 RSA 密钥,这会产生 4096 / 8 = 512 字节的消息。较小的消息是可以的,那些是填充的。较大的消息将不起作用。

最后,您尝试在字符串上调用decrypt,这不是一回事。您需要将数据传递给 decrypt_rsa 函数,它与您显示的 encrypt_rsa 函数相反。

编辑,在问题中添加了decrypt_rsa 函数后:错误消息显示private_key 实际上并不是应有的私钥,而是一个字符串。为什么我们不能说,因为初始化private_key的代码没有显示。

【讨论】:

  • 多大会使这不起作用?我实际上必须加密一个比这个例子更大的 JSON。顺便说一句,我根据您关于解密功能的最后一段更新了问题。我真的把加密数据传给解密函数了
  • 大于 512 字节的消息将不起作用。 (限制实际上可能会小一些,填充可能会增加一些开销。此外,对于不在较低 ASCII 集中的字符,utf-8 将占用每个字符超过一个字节。)
  • 对于在这种情况下使用 sha256 的 OAEP,消息最大值为 512 - 2*32 - 2 = 446 字节。
  • 在您的编辑中,您的意思是密钥错误或我如何声明变量错误?我使用private_key = 'randomblahblah' 来声明一个变量。我不是创建私钥的人,但我认为密钥是合法的
  • @Jamiewp:不,该密钥不是合法的私钥。字符串可以是 base64 或其他可用于或提供用于反序列化私钥的数据编码,但私钥是加密模块中特定类的实例。请参阅serialization 模块。
猜你喜欢
  • 2011-03-05
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
  • 2019-04-04
  • 1970-01-01
  • 2018-08-19
相关资源
最近更新 更多