基于Google document和cryptography.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
处发生错误。我实际上将加密的数据传递给此函数。而且我认为不是因为有密钥,因为它不应该提供这样的错误结果
答案 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
的代码。