如何解决验证给定证书、签名和初始消息的签名
我获得了一个证书 Test.pem
,其中包含 p12
公钥的证书。
这是用于创建和导出密钥/证书的命令(我没有运行它们)
$ keytool -genkeypair -alias senderKeyPair -keyalg RSA -keysize 2048 -dname "CN=Test" -validity 365 -storetype PKCS12 -keystore sender_keystore.p12 -storepass changeit
$ keytool -exportcert -alias senderKeyPair -storetype PKCS12 \
-keystore sender_keystore.p12 -file \
sender_certificate.cer -rfc -storepass changeit
所以我然后
-
使用证书文件
Test.pem
导出运行的公钥:openssl x509 -pubkey -noout -in Test.pem > public_key.pem
-
然后我解码了最初看起来像这样的 base64 签名:
UmuM2m2gWBQVzNzMhd9trppSuUupgbn8WuHj1HDSwGe + Es037QEJHcFm08x6jz4USwvDoAP2fML0papsyUCKdGT + KI / Oeo75irYZYSjNlRlBNSMRy4WqERYUIQcfhyagzDcRuEKcIGGm6RoLu1Tqe3h + OL + Z / 8lgVZKwG5dwxwlzFQqgDRwWx8cFTA2qgvcEAur1sRLS7OqnSWH + 3osh30QsBOSzWxmiPskNIww + 4DoUgUIed2i55ImpujQrqHDH8J4Xc4JyrkBO + eHB254l2kkVcrOEyveMoPlIYL3 / vZHc7nw7HcNY2I2zknGFykXCqQDk2CvgoiDDpAJ / AF57UQ ==
使用以下命令:
openssl enc -base64 -d -in signed_message.sha256.base64 -out signed_message.sha256
-
鉴于我已将初始消息(即 WCtNjKEW)保存到文件中,我尝试使用以下命令验证签名:
openssl dgst -sha256 -verify public_key.pem -signature signed_message.sha256 initial_message.txt
我得到的是 Verification Failure
此外,我尝试使用 python 和 pyCrypto 模块使其自动化,但结果相同。
from Crypto.PublicKey import RSA
from base64 import b64decode,b64encode
from hashlib import sha256
from Crypto.Hash import SHA256
from Crypto.Signature import PKCS1_PSS,PKCS1_v1_5
signedTID = "UmuM2m2gWBQVzNzMhd9trppSuUupgbn8WuHj1HDSwGe+Es037QEJHcFm08x6jz4USwvDoAP2fML0papsyUCKdGT+kI/Oeo75irYZYSjNlRlBNSMRy4WqERYUIQcfhyagzDcRuEKcIGGm6RoLu1Tqe3h+oL+Z/8lgVZKwG5dwxwlzFQqgDRwWx8cFTA2qgvcEAur1sRLS7OqnSWH+3osh30QsBOSzWxmiPskNIww+4DoUgUIed2i55ImpujQrqHDH8J4Xc4JyrkBO+eHB254l2kkVcrOEyveMoPlIYL3/vZHc7nw7HcNY2I2zknGFykXCqQDk2CvgoiDDpAJ/AF57UQ=="
TID = b'WCtNjKEW'
pubkey = """-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgLhgbMUDS9BPOTG01z34
ygukIzDeEqzON80IpnlfZuFsbgA3T0O5yEmokdD3s3jxFZAHgRPb45QsSw2ggeb2
oTwzSGSjsdoYFNGYUyVuj6FWlCFAe9/xrHPx2svU4G/+1NWjoQhbee4c/HwNn0id
FYsHbOtfcibkBGZPtWeFp6S7q3EMoWlkc5a1bERjefkh+5irGrkZyLErc4bZYlaT
...
-----END PUBLIC KEY-----"""
# Read the public key
key = RSA.importKey(pubkey)
# Read test message
message = TID
# Create SHA1 hash object
h = SHA.new(message)
# Create PKCS1 handler
cipher = PKCS1_PSS.new(key)
# Read the signature
signature = signedTID
# Verify signature
print(cipher.verify(h,signature))
我错过了什么?
编辑
现在在 python 中似乎可以通过将脚本更改为以下内容来工作。
public_key = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgLhgbMUDS9BPOTG01z34ygukIzDeEqzON80IpnlfZuFsbgA3T0O5yEmokdD3s3jxFZAHgRPb45QsSw2ggeb2oTwzSGSjsdoYFNGYUyVuj6FWlCFAe9/xrHPx2svU4G/....'
sigature = 'UmuM2m2gWBQVzNzMhd9trppSuUupgbn8WuHj1HDSwGe+Es037QEJHcFm08x6jz4USwvDoAP2fML0papsyUCKdGT+kI/Oeo75irYZYSjNlRlBNSMRy4WqERYUIQcfhyagzDcRuEKcIGGm6RoLu1Tqe3h+oL+Z/8lgVZKwG5dwxwlzFQqgDRwWx8cFTA2qgvcEAur1sRLS7OqnSWH+3osh30QsBOSzWxmiPskNIww+4DoUgUIed2i55ImpujQrqHDH8J4Xc4JyrkBO+eHB254l2kkVcrOEyveMoPlIYL3/vZHc7nw7HcNY2I2zknGFykXCqQDk2CvgoiDDpAJ/AF57UQ=='
origin_data = 'WCtNjKEW'
key_bytes = bytes(public_key)
key_bytes = b64decode(key_bytes)
key = RSA.importKey(key_bytes)
hash_value = SHA256.new(bytes(origin_data))
verifier = PKCS1_v1_5.new(key)
print(verifier.verify(hash_value,b64decode(signature)))
但是为什么我不能使用 openssl 命令重现它似乎很奇怪。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。