Java 使用公钥进行数字签名

Java 使用公钥进行数字签名,java,Java,据我所知,数字签名是通过使用您自己的私钥和收件人的公钥加密(邮件摘要)获得的 在Java中,我不知道如何使用公钥执行签名的第二阶段 Signature sig = Signature.getInstance("MD5WithRSA"); sig.initSign(privateKey); sig.update(data); byte[] signatureBytes = sig.sign(); 我检查了API,唯一使用公钥的方法是验证…消息签名中没有收件人。如果您想阻止其他人验证签名,可以将签

据我所知,数字签名是通过使用您自己的私钥和收件人的公钥加密(邮件摘要)获得的

在Java中,我不知道如何使用公钥执行签名的第二阶段

Signature sig = Signature.getInstance("MD5WithRSA");
sig.initSign(privateKey);
sig.update(data);
byte[] signatureBytes = sig.sign();

我检查了API,唯一使用公钥的方法是验证…

消息签名中没有收件人。如果您想阻止其他人验证签名,可以将签名加密到收件人的公钥,但这通常不被视为邮件签名的一部分。

没有使用收件人公钥加密数字签名的步骤;在这种情况下,它不是一个(通用的)数字签名,因为只有接收者才能解密(从而检查)它

因此,是的(不知道Java的细节),我并不奇怪API只提供了创建一个需要您的私有RSA密钥的函数,而收件人需要您的公共RSA密钥来检查您的签名,这是您提到的API的第二部分。

您所说的“第二阶段”是什么意思,用私有密钥加密散列,还是验证签名

调用
update()
后,粘贴的代码已经为您提供了签名。签名对象已执行哈希(MD5)并使用私钥(RSA)加密


要验证签名,只需遵循公钥加密中描述的对称步骤:

  • 私钥用于签名和解密/解密

  • 公钥用于验证签名和加密/加密

见:

公钥密码术:一种使用两个密钥密码的密码技术。使用公钥加密的消息可以 只能使用关联的私钥解密。相反地 使用私钥签名的消息可以通过公钥进行验证 钥匙

尽管对于RSA,用于签名的数学运算与用于加密的数学运算非常相似(签名或多或少与“加密”摘要相同),但并非所有算法都是如此(例如DSA)。此外,混合使用这些术语会在整体安全性推理中产生问题

你在这里所做的是唯一的签约阶段。除此之外,您可能还需要加密邮件(使用收件人的公钥),但这是一个独立的操作。为此,您可能需要查看
密码。当然,要加密的不仅仅是您之前获得的签名,而是初始消息及其签名的串联。(我不确定只加密签名有什么意义。)