我有一段数据['payload'],它是Base64编码的。 然后我有一个'签名',其中包含有效载荷的签名。 我有一把公钥。 签名算法是SHA512withRSA
如何在Python中验证数据的真实性? 我使用以下代码进行检查,但它似乎没有工作
import base64
import hashlib
from Crypto.PublicKey import RSA
from Crypto.Signature import SHA512
from Crypto.Hash import SHA512
from base64 import b64decode
# Public Key
key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEpFwIarbm48m6ueG+jhpt2vCGaqXZlwR/HPuL4zH1DQ/eWFbgQtVnrta8QhQz3ywLnbX6s7aecxUzzNJsTtS8VxKAYll4E1lJUqrNdWt8CU+TaUQuFm8vzLoPiYKEXl4bX5rzMQUMqA228gWuYmRFQnpduQTgnYIMO8XVUQXl5wIDAQAB"
# Base64 Encoded payload
payload = "some_string_payload"
decoded_payload = base64.b64decode(payload)
signature = "gw5K+WvO43673XBinZOmwgrZ3ttVuZ17/7SBnzqAAD4pgiwzYbZuEwn2lev6FW01f6TL0d9cNH4WtT53bQnTlhLQOZi4mHTTtM64O7MNljSA5zjJTUl77wXK/cJM+/G6R4YgYAnjydXAZjbMKY4Z9kV0qz2spdnS7Je7Q8I1xaU="
signature_algorithm = "SHA512withRSA"
keytype = "RSA"
m = hashlib.sha512()
m.update( key )
m.update( decoded_payload )
print m
m.hexdigest()
print m
keyDER = b64decode(key)
rsakey = RSA.importKey(keyDER)
signer = SHA512.new(rsakey)
if signer.verify(m, b64decode(signature)):
print "Verified"
else:
print "Not Verified"
答案 0 :(得分:0)
问题中的代码出现了几个错误:
signature_algorithm
和keytype
个变量; key
不应进行哈希处理以实现正常的PSS签名方案; m.hexdigest()
的结果; SHA512.new(rsakey)
; 相反,您可以使用任何其他PSS示例代码。例如,使用代码here并注意到这是我正在指出的问题。这是一个最小的文档更改,但似乎没有人想要修复它半年。
from Crypto.Signature import PKCS1_PSS
from Crypto.Hash import SHA512
from Crypto.PublicKey import RSA
from Crypto import Random
message = 'To be signed'
key = RSA.importKey(open('privkey.der').read())
h = SHA512.new()
h.update(message)
signer = PKCS1_PSS.new(key)
signature = PKCS1_PSS.sign(h)
请注意,PSS也可以在内部使用散列 ,如果签名验证失败,您可能必须定义自己的可调用代码,更多信息here。可能最好在代码中查找MGF1的默认实现,复制它然后更改哈希...