2012-04-09 84 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來做到這一點。當然,這不僅僅是你以前想要加密的簽名,而是初始消息和簽名的連接。 (我不確定只有加密簽名會有任何意義。)