2012-04-09 85 views
4

据我所知,数字签名是通过用你自己的私钥和接收者的公钥加密(信息摘要)来获得的。用公钥数字签名

在Java中,我无法弄清楚如何使用公钥来执行第二阶段的签名。

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

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

回答

6

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

2

没有采用收件人公钥加密数字签名的步骤;在这种情况下,它不会是(通用)数字签名,因为只有收件人才能解密(并检查)它。因此,是的(不知道Java的具体细节),我并不感到惊讶,API只提供创建一个需要你的私有RSA密钥的函数,而接收者需要你的公共RSA密钥来检查你的签名,这是是你提到的API的第二部分。

0

你是指“第二阶段”,用私钥加密散列或验证签名是什么意思?

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

要验证你只要按照对称步骤签名描述here

3

在公钥密码:

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

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

the glossary of the TLS specification

公钥加密:一类使用两个密钥密码加密技术。使用公钥加密的邮件只能使用关联的私钥解密 。相反, 用私钥签名的消息可以使用公钥 密钥进行验证。

虽然与RSA用于签名的数学运算非常类似于用于加密(在签署或多或少一样的“加密”摘要),这是不是所有的算法的情况下(例如DSA)。另外,混用术语会导致整体安全推理出现问题。

您在这里所做的是唯一的签署阶段。除此之外,您可能想要加密邮件(使用收件人的公钥),但这是一项独立操作。你可能想看看Cipher来做到这一点。当然,这不仅仅是你以前想要加密的签名,而是初始消息和签名的连接。 (我不确定只有加密签名会有任何意义。)