使用SHA256哈希加密JSON,返回512个字符而不是64个

时间:2019-05-27 13:52:58

标签: python encryption hash cryptography rsa

基于Google documentcryptography.io

我尝试对查询结果进行加密,该查询结果的格式为{{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处发生错误。我实际上将加密的数据传递给此函数。而且我认为不是因为有密钥,因为它不应该提供这样的错误结果

1 个答案:

答案 0 :(得分:3)

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

RSA密文的大小由RSA密钥大小确定。在这种情况下,您可能使用的是4096位RSA密钥,这将导致4096/8 = 512字节消息。较小的消息可以,可以进行填充。较大的邮件将不起作用。

最后,您尝试在字符串上调用decrypt,这不是问题。您需要改为将数据传递到decrypt_rsa函数,这与显示的encrypt_rsa函数相反。

编辑,在对问题添加了crypto_rsa函数之后:错误消息显示private_key实际上不是应有的私钥,而是字符串。为什么不能这样说,因为未显示初始化private_key的代码。