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

如何解决验证给定证书、签名和初始消息的签名

我获得了一个证书 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.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?