首页 > 解决方案 > 使用 RSA 验证消息的真实性

问题描述

我有来自我的服务器的 JSON 数据,我想在我的客户端上进行验证。我要传输的数据只是一个布尔值,但我已经包含了一个 uuid 作为哈希的一部分。

以下是来自服务器的消息示例:

response = {
    "encrypted": "kgbh6RN2XRHAU1QyjEJXqkr5DmNpnkaS/bdNG7nKoLBCK8V4xzv12ScMii8GJEgpNYbY5oH2gtGBgZxDo3DwkRmzFdomUkDDbpospomTRRCdU7bko8/Ix0MFvm9Dwh6KG3D4AIBW36O9RJ95WsErwox4fwMRR7Qes/anS9dVoVh5nswtyjAjtrDB+dCgTfFbOCqx/cZHpWJWUJ8Rv4Sx/oN+tAOw2ibU4SiLlsF/YYqkesk6spHwB9ud/4kZc8Xfb+QV6t31xZPXwjCgvrySiv/bgGyZl4irPihBAtoD3sM/QEwVpPsUs2zKqALR8rD6LwBUa5gAVrnGU++5kV6RoA==",
    "message_id": "203e4e58-30cf-11ea-8f5b-7085c257599e",
    "valid": False
}

"encrypted"生成如下:

import uuid
from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.backends import default_backend
import hashlib
from cryptography.hazmat.primitives.asymmetric import padding
import base64


message_id = uuid.uuid1()
with open("public_key.pem", "rb") as key_file:
    public_key = serialization.load_pem_public_key(
        key_file.read(),
        backend=default_backend()
    )
message = bytes(hashlib.sha3_256((str(message_id) + str(valid)).encode("utf-8")).hexdigest(), "utf-8")
encrypted_data = public_key.encrypt(
    message,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)
encrypted_data = str(base64.b64encode(encrypted_data), "utf-8")

然后在客户端上,我想一起散列"message_id""valid"如果消息来自我,那么结果应该与"encrypted"解密相同。所以我尝试了:

from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.backends import default_backend
import hashlib
from cryptography.hazmat.primitives.asymmetric import padding
import base64

encrypted = response["encrypted"]
message_id = response["message_id"]
valid = response["valid"]
with open("private_key.pem", "rb") as key_file:
    private_key = serialization.load_pem_private_key(
        key_file.read(),
        password=None,
        backend=default_backend()
    )
encrypted = base64.b64decode(encrypted)
decrypted = private_key.decrypt(
    encrypted,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)
new_hash = bytes(hashlib.sha3_256((str(message_id) + str(valid)).encode("utf-8")).hexdigest(), "utf-8")
if new_hash == decrypted:
    print("Yes")
else:
    print("No")

我的问题是这会打印“否”,并且代码非常混乱。特别是所有的编码和解码以及将字符串转换为字节对象等。

有人可以帮我修复此代码吗?

谢谢。

编辑:

我的代码现在产生“是”。但是,我认为它不是很干净,我想改进它。你有什么建议?

标签: pythoncryptographyrsa

解决方案


推荐阅读