2015-12-03 94 views
0

第一個程序應該將兩個輸入作爲參數:directory1和directory2。程序應該爲文件夾directory1中的每個文件計算散列值(使用HMAC),並將該散列值存儲在將保存在文件夾directory2下的新文件中。 (b)。第二個程序應該執行驗證過程。它也採用與第一個程序相同的兩個輸入參數。它應該再次生成散列(你可以在這裏重用第一個程序中的一些代碼),並檢查它們是否與directory2中存儲的對應值相匹配。對於每個文件,這個程序應該輸出兩個字符串:文件名和YES/NO(表示散列匹配與否)java.io.file幫助從文件夾中選擇多個文件並列出散列值

我已經完成了一些工作,它將從一個文件夾生成單個文件的散列值,我需要幫助從該文件夾生成所有文件的哈希值,這些代碼如下。

功能

import java.io.FileInputStream; 
import java.io.FileWriter; 
import java.io.PrintWriter; 
import java.security.MessageDigest; 

public class HMAC { 

public static void main(String args[]) throws Exception { 


    String datafile = "/Users/Samip/Desktop/crypto1"; 

MessageDigest md = MessageDigest.getInstance("SHA1"); 
FileInputStream fis = new FileInputStream(datafile); 
byte[] dataBytes = new byte[1024]; 

int nread = 0; 

while ((nread = fis.read(dataBytes)) != -1) { 
    md.update(dataBytes, 0, nread); 
}; 

byte[] mdbytes = md.digest(); 

//convert the byte to hex format 
StringBuffer sb = new StringBuffer(""); 



for (int i = 0; i < mdbytes.length; i++) { 
    sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1)); 
} 

//System.out.println("SHA-1 value is :: " + sb.toString()); 





    FileWriter file = new FileWriter("/Users/Samip/Desktop/crypto/output.txt"); 
    PrintWriter output = new PrintWriter(file); 
    output.println(sb.toString());  
    output.close(); 
    System.out.println(sb.toString()); 

} 
} 

我希望有人能幫助我與此有關。

+0

用什麼?請問一個問題。 – Jan

+0

我想生成一個文本文件,它已經獲得了特定文件夾中所有隨機文件的所有散列值。我有一個單一文件的功能,我需要爲整個文件夾實現它。 – Raju

+0

因此,對於每個文件,您希望將一個散列寫入文件。你已經有** ** **文件的代碼。 File.listFiles()可以列出目錄中的所有文件。那麼你面臨的確切問題/錯誤/問題在哪裏? – Jan

回答

0

您可以使用this迭代所有文件並在其上使用散列函數。存儲在他們\n(換行符)分離文件

String stringout = "" 
Files.walk(Paths.get("/path/to/dir1")).forEach(filePath -> { 
    if (Files.isRegularFile(filePath)) { 
     //create your hash 
     stringout += hash + "\n" 
    } 
}); 
// write stringout to your output file 

因爲你可以利用這些代碼和使用this文件中讀取您的哈希第二個程序的結果。然後將它們拆分爲\n以獲得您的散列並將它們與您的散列函數的輸出進行比較。

+0

我不知道如何添加這兩個東西。我對JAVA很陌生。 – Raju

0

基本佈局/自上而下的方法

開始與你所知道並將它放入方法。你從名字和他們需要執行的東西開始。不要只考慮邏輯流程,不要考慮實施。

在你的情況,你需要這樣的:

public void createHash(File sourceDir, File targetDir) 

public String createHash(File file) 

public void writeHash(File toFile, String hash) 

把它包在main()

你需要在你的類名,以填補在那裏。

public static void main(String[] args) { 
    new YourClass().createHash(new File(args[0]), new File(args[1])); 
} 

與最外層的方法,實施自上而下

啓動,並得到這一權利。你可以從其他的虛擬代碼開始。現在

public void createHash(File sourceDir, File targetDir) { 
    for(File f : sourceDir.listFiles()) { 
    String hash = createHash(f); //That you almost have 
    File target = new File(targetDir, f.getName()+".hash"); 
    writeHash(target, hash); 
    } 
} 

public String createHash(f) { 
    return f.getName(); //This is where your existing code will go later 
} 

public String writeHash(File target, String hash) { 
    System.out.println("I'd write " + hash + " to File " + file.getName()); 
} 

你的程序應該能夠通過源文件夾進行迭代,創建啞散列和打印到System.out哪些文件會寫。

瑞風方法

現在一步完成剩下的一步 - 一個方法一次。直到你完成或某件事情中斷 - 在這種情況下,你會回來尋求幫助。

public String createHash(File datafile) throws IOException { 
    //SNIP - YOUR CODE BEGINS 
    MessageDigest md = MessageDigest.getInstance("SHA1"); 
    FileInputStream fis = new FileInputStream(datafile); 
    byte[] dataBytes = new byte[1024]; 

    int nread = 0; 

    while ((nread = fis.read(dataBytes)) != -1) { 
     md.update(dataBytes, 0, nread); 
    } 

    byte[] mdbytes = md.digest(); 

    //convert the byte to hex format 
    StringBuffer sb = new StringBuffer(""); 
    for (int i = 0; i < mdbytes.length; i++) { 
     sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1)); 
    } 
    //SNAP - YOUR CODE ENDS 
    } 
    public void writeFile(File target, String hash) { 
    try(FileOutputStream fo = new FileOutputStream(target)) { 
     fo.write(hash.getBytes()); 
    } catch(IOException e) { 
     System.err.println("No Hash Written for " + target.getName()); 
    } 
    } 

工作實例

import java.io.*; 
import java.security.MessageDigest; 

public class Checksums { 

    public static void main(String[] args) { 
     String sourceDir = "/Users/Jan/Desktop/Folder1"; 
     String targetDir = "/Users/Jan/Desktop/Folder2"; 
     try { 
      new Checksums().createHash(new File(sourceDir), new File(targetDir)); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    private void createHash(File sourceDir, File targetDir) throws Exception { 
     for (File f : sourceDir.listFiles()) { 
      String hash = createHash(f); // That you almost have 
      File target = new File(targetDir, f.getName() + ".hash"); 
      writeHash(target, hash); 
     } 
    } 

    public String createHash(File datafile) throws Exception { 
     // SNIP - YOUR CODE BEGINS 
     MessageDigest md = MessageDigest.getInstance("SHA1"); 
     FileInputStream fis = new FileInputStream(datafile); 
     byte[] dataBytes = new byte[1024]; 

     int nread = 0; 

     while ((nread = fis.read(dataBytes)) != -1) { 
      md.update(dataBytes, 0, nread); 
     } 

     byte[] mdbytes = md.digest(); 

     // convert the byte to hex format 
     StringBuffer sb = new StringBuffer(""); 
     for (int i = 0; i < mdbytes.length; i++) { 
      sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1)); 
     } 
     // SNAP - YOUR CODE ENDS 
     return sb.toString(); 
    } 

    public void writeHash(File target, String hash) { 
     try (FileOutputStream fo = new FileOutputStream(target)) { 
      fo.write(hash.getBytes()); 
      System.out.println("Hash written for " + target.getAbsolutePath()); 
     } catch (IOException e) { 
      System.err.println("No Hash Written for " + target.getName()); 
     } 
    } 

} 
+0

我正在研究如何遍歷文件,但得到了很多錯誤。 – Raju

+0

我應該在哪裏放置路徑/ Users/Samip/Desktop/crypto以上代碼。?請解釋 – Raju

+0

讓我在我的工作空間中設置這個項目 - 我們會讓這個工作。 – Jan