2014-04-26 72 views
0

我需要驗證我的數據到數字簽名中的數據,我如何在它們之間進行比較。 在此代碼中驗證由公鑰和原始簽名解密的簽名。如何在數字簽名中驗證我的數據?

  1. 代公鑰和女貞密鑰和簽名。
  2. 閱讀我的數據。
  3. 對此代碼進行哈希處理。
  4. 讀取簽名。
  5. 比較簽名和我的數據//我在這一步有問題想要比較我的數據和簽名。

    public static void verify() { 
         BufferedReader in = new BufferedReader(new FileReader("EndSignatuer.txt")); 
         FileInputStream keyfis = new FileInputStream("EndSignatuer.txt"); 
         byte[] Signen = new byte[keyfis.available()]; 
         keyfis.read(Signen); 
         keyfis.close(); 
         String signatureString = new String(Signde); 
         System.out.println("SignatureString:" + signatureString); 
         len = Signde.length; 
         X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encKey); 
         KeyFactory keyFactory = KeyFactory.getInstance("DSA", "SUN"); 
         PublicKey pubKey = keyFactory.generatePublic(pubKeySpec); 
         Signature sig = Signature.getInstance("SHA1withDSA", "SUN"); 
         sig.initVerify(pubKey); 
    

    }

我需要:

public static void verify (byte[] mydata) { 
........ 
sig.initVerify(mydata); 
} 

回答

0

首先,驗證簽名不涉及 「通過公共密鑰解密」。對於RSA來說,簽名和驗證確實會使用類似類似的操作來進行加密和解密,這讓很多人困惑地描述它們,但實際上它們是不同的。對於這裏使用的DSA和ECDSA,差別更大:沒有涉及加密或解密的內容,只有簽名和驗證。另外,與許多加密對象一樣,簽名實際上是隨機字節,而不是有效字符。轉換爲字符串並嘗試顯示它最多會產生垃圾,並且可能會弄亂顯示。在需要限制爲有效字符(如S/MIME和XML)的情況下,通常將其轉換爲base64或hex,並在需要時轉換爲二進制。

這就是說,你很近。您可以像使用公鑰一樣使用publickey調用sig.initVerify。然後你可以用數據調用sig.update,數據可以是單個緩衝區或一系列數據(特別是當你有更多數據而不是一次裝入內存時)。最後你用簽名值調用sig.verify,它返回true或false。詳情請參閱http://docs.oracle.com/javase/7/docs/api/java/security/Signature.html

+0

謝謝,我需要什麼 – MohammadTofi