验证给定证书、签名和初始消息的签名

问题描述

我获得了一个证书 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

所以我然后

  1. 使用证书文件 Test.pem 导出运行的公钥:

    openssl x509 -pubkey -noout -in Test.pem > public_key.pem
    
  2. 然后我解码了最初看起来像这样的 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
  1. 鉴于我已将初始消息(即 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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...