据我了解,数字签名是通过使用您自己的私钥和收件人的公钥加密(消息摘要)来获得的。
在 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,唯一使用公钥的方法是用于验证......
消息签名中不涉及收件人。如果您想阻止其他人验证签名,您可以将签名加密为收件人的公钥,但这通常不被视为签名消息的一部分。
在公钥密码学中:
私钥用于签名和解密/解密。
公钥用于验证签名和加密/加密。
请参阅TLS 规范的词汇表:
公钥密码术:一类使用双密钥密码的密码技术。用公钥加密的消息只能用相关的私钥解密。相反,用私钥签名的消息可以用公钥来验证。
尽管 RSA 用于签名的数学运算与用于加密的数学运算非常相似(因为签名或多或少与“加密”摘要相同),但并非所有算法(例如 DSA)都是如此。此外,混合术语会导致您的整体安全推理出现问题。
您在这里所做的是唯一的签名阶段。除此之外,您可能还想加密消息(使用收件人的公钥),但这是一个独立的操作。你可能想看看Cipher
这样做。当然,您想要加密的不仅仅是您之前获得的签名,还有初始消息及其签名的串联。(我不确定仅加密签名是否有任何意义。)
没有使用收件人公钥加密数字签名这样的步骤;在这种情况下,它不会是(通用)数字签名,因为只有接收者才能解密(并因此检查)它。
所以,是的(不知道 Java 的细节),我并不感到惊讶 API 只提供创建一个需要你的私有 RSA 密钥的函数,而接收者需要你的公共 RSA 密钥来检查你的签名,这是第二部分你提到的API。