2017-06-21 81 views
-2

我試圖將數字簽名應用於.txt文件。數字簽名已成功應用,但每當我嘗試驗證它時,都會顯示已驗證:false。 這裏是我的簽名代碼:使用SHA1withRSA的Java數字簽名

public void signData(){ 
    Signature rsa = Signature.getInstance("SHA1withRSA"); 
    rsa.initSign(privateKey); 
    File f= new File(path); 

//read from file 
    FileInputStream fis = new FileInputStream(f); 
    byte[] buffer = new byte[(int) f.length()]; 
    fis.read(buffer); 
    fis.close(); 
    rsa.update(buffer); 
//write to file 
    byte[] toWrite=rsa.sign(); 
    String signPath; 
    signPath="Signed-"+f.getName(); 
    File output=new File(signPath); 
    FileOutputStream fos = new FileOutputStream(output); 
    fos.write(toWrite); 
    fos.flush(); 
    fos.close(); 
    System.out.printf("File: %s is now signed in: %s\n\n",path,signPath); 
} 

讀取和驗證:

public void verify(){ 
    Signature sig = Signature.getInstance("SHA1withRSA"); 
    sig.initVerify(publicKey); 
    File f= new File(path); 
    FileInputStream fis = new FileInputStream(f); 
    byte[] buffer = new byte[(int) f.length()]; 
    fis.read(buffer); 
    fis.close(); 
    sig.update(buffer); 
    System.out.println("Verified: "+sig.verify(buffer)); 
} 

沒有錯誤顯示。 KeyPair算法使用的是「RSA」。 預先感謝您。

+0

您的文件閱讀完全錯誤。 – Kayaman

+0

但是爲什麼?我使用相同的方法來加密和解密密碼和密鑰對,它的工作原理。 – Alb

+0

因爲你寫錯了。打印出'fis.read(buffer)'的結果,看看你有多少讀。這可能不是你的代碼唯一的問題,但它是最明顯和最基本的問題。 – Kayaman

回答

2

要進行簽名,您需要輸入私鑰和要簽名的數據。輸出是簽名。

對於驗證,您有輸入公鑰和簽名數據(實際上是從第一步簽名的數據)。您錯過了簽名作爲輸入。它應該看起來像這樣:

sig.update(signedData); 
System.out.println("Verified: "+sig.verify(signature)); 

不要忘記從文件中讀取簽名。

+0

應該優化文件讀取。請參見['class Files'](http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html) –