4

据我了解,数字签名是通过使用您自己的私钥和收件人的公钥加密(消息摘要)来获得的。

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

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

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

4

4 回答 4

6

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

于 2012-04-09T19:30:51.950 回答
3

在公钥密码学中:

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

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

请参阅TLS 规范的词汇表

公钥密码术:一类使用双密钥密码的密码技术。用公钥加密的消息只能用相关的私钥解密。相反,用私钥签名的消息可以用公钥来验证。

尽管 RSA 用于签名的数学运算与用于加密的数学运算非常相似(因为签名或多或少与“加密”摘要相同),但并非所有算法(例如 DSA)都是如此。此外,混合术语会导致您的整体安全推理出现问题。

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

于 2012-04-09T19:39:30.350 回答
2

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

所以,是的(不知道 Java 的细节),我并不感到惊讶 API 只提供创建一个需要你的私有 RSA 密钥的函数,而接收者需要你的公共 RSA 密钥来检查你的签名,这是第二部分你提到的API。

于 2012-04-09T19:31:29.970 回答
0

“第二阶段”是什么意思,用私钥加密哈希或验证签名?

调用后粘贴的代码已经给你签名update()。签名对象已经进行了散列(MD5)并使用私钥(RSA)加密。

要验证签名,您只需遵循此处描述的对称步骤

于 2012-04-09T19:32:52.607 回答