2012-07-24 162 views
1

我在驗證我剛剛創建的簽名時遇到了問題。簽名後,我首先使用Base64將簽名轉換爲文本,然後作爲測試,我想驗證是否可以解碼Base64並驗證簽名。這失敗了。這裏是一些沒有錯誤處理的代碼。Android:DSA簽名 - 簽名並驗證

我有我的密鑰對:

DSAPrivateKey privateKey = (DSAPrivateKey) keyPair.getPrivate(); 
DSAPublicKey publicKey = (DSAPublicKey) keyPair.getPublic(); 

現在我籤一些文本,打印記錄輸出 - 這似乎很動聽:

String text = "test"; 
Signature signer = null; 
signer = Signature.getInstance(privateKey.getAlgorithm()); 
SignedObject signedObject = null; 
signedObject = new SignedObject(text, privateKey, signer); 
String print_signature = Base64.encodeToString(signedObject.getSignature(), Base64.DEFAULT); 
System.out.println("Base64 Signature: " + print_signature); 

現在我使用上面創建的SignedObject中的對象驗證簽名和不是Base64。這是成功的:

Signature verifier = null; 
verifier = Signature.getInstance(publicKey.getAlgorithm()); 
boolean b = signedObject.verify(publicKey, verifier)); 

對於我的應用我只會有簽名者的公證書和Base64編碼字符串,所以我只能用這些參數驗證簽名,因此不能AFAIK使用SignedObject中的對象。我使用了簽名對象:

Signature verifier1 = null; 
verifier1 = Signature.getInstance(publicKey.getAlgorithm()); 
verifier1.initVerify(publicKey); 
verifier1.update(text.getBytes()); // sorry I forgot this in original posting 
byte[] sig1 = Base64.decode(print_signature, Base64.DEFAULT); 
b = verifier1.verify(sig1)); 

此驗證總是失敗(b = false)。

+0

我已經添加了一個測試,以驗證由BaseObject編碼器之前的signedObject.getSignature()返回的簽名(字節數組),以及Base64解碼之後的簽名sig1(字節數組),以及它們匹配。看來Base64工作正常,所以問題必須與我的verifier1對象(恕我直言)。 – LJB 2012-07-25 10:00:41

回答

0

爲什麼您首先使用SignedObject?它會給你買什麼?至於驗證失敗,請確保在傳輸/接收後獲得相同的字節。您是否使用相同的編碼發送/接收?有人修改字符串嗎?

+0

那麼我使用SignedObject對象來簽署數據。這個帶有數據的簽名假設會被傳輸到另一臺PC上,但我決定在傳輸之前首先驗證簽名。所以我使用SignedObject和Base64格式對其進行驗證,最終將其傳遞給它。 所以對於你的問題:我還沒有傳輸任何東西。仍在測試將會傳輸的功能。編碼已被驗證爲UTF-8。沒有人修改字符串,因爲它仍然處於相同的功能。 – LJB 2012-07-25 09:54:02

+0

你爲什麼使用SignedObject的問題讓我想到了。由於遺留代碼,我擁有它。我刪除它,並將其更改爲使用Signature類,現在驗證工作!仍然不明白爲什麼,但至少我可以繼續 - thx – LJB 2012-07-25 10:34:27