2012-10-09 36 views
1

所以我一直在編碼這個程序,它對文件進行加密然後對其進行解密,並且我希望僞隨機密鑰生成器將用戶輸入作爲種子,以便密鑰可以從中創建。請注意,我希望密鑰依賴於字符串(即:如果我多次輸入種子「hello」,則每次都會使用相同密鑰加密文件),因爲最終我會將加密解密函數分解爲兩個文件。Java中用於AES加密的用戶輸入種子

這是我第一次嘗試,基於SecureRandom。還有更多的代碼,但只有主要是相關的:

protected static final String ALGORITHM = "AES"; 

public static void main(String args[]) { 

    String stringKey = args[1]; 
    byte[] seedArray = stringKey.getBytes(); 
    SecureRandom sRandom = new SecureRandom(seedArray); 
    byte[] keyArray = new byte[16]; 
    SecretKey sKey = new SecretKeySpec(keyArray, ALGORITHM); 

    try 
    { 

     Encrypter2 encrypter = new Encrypter2(sKey); 

     FileInputStream efis = new FileInputStream(args[0]); 
     FileOutputStream efos = new FileOutputStream("Encrypted"); 
     encrypter.encrypt(efis, efos); 

     FileInputStream dfis = new FileInputStream("Encrypted"); 
     FileOutputStream dfos = new FileOutputStream("Decrypted.txt"); 
     encrypter.decrypt(dfis, dfos); 

    } catch (FileNotFoundException e1) { 
     System.out.println("File not found."); 
     e1.printStackTrace(); 
    } catch (Exception e) { 
     System.out.println(e); 
    } 
} 

現在,這將創建在Java 1.7字符串輸入一個唯一的關鍵,但它在Java 1.6的隨機化。是否有另一種方法來生成依賴於用戶輸入的字符串的用戶種子密鑰?提前致謝!

回答

0

你真正想要的AES加密是用作密鑰的16(或32)字節的數據。在這裏,你正在使用用戶提供的字節,將它們用作隨機字節發生器的種子,然後生成一些隨機字節。

相反,您可以直接從用戶提供的字符串生成字節,而無需使用SecureRandom。使用「單向」散列算法(如SHA,代表安全散列算法),您可以將用戶提供的字符串轉換爲您需要的字節數。不管JVM如何,如果用戶提供的字符串是相同的,則生成的字節總是相同的。