2013-06-04 77 views
2

我正試圖編寫一個簡單的程序來使用AES algortihm加密和解密文件。我有加密,解密,但沒有問題..Java文件加密

public static void main(String[] args) throws NoSuchAlgorithmException, FileNotFoundException, InvalidKeyException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException { 

    // Инициализация секретных ключей 
    KeyGenerator keyGenS = KeyGenerator.getInstance("AES"); 
    keyGenS.init(128); 
    SecretKey sKey1 = keyGenS.generateKey(); 
    SecretKey sKey2 = keyGenS.generateKey(); 
    // Перевод секретных ключей в строку и запись в файл 
    String key1 = SecretKeyToString(sKey1); 
    String key2 = SecretKeyToString(sKey2); 

    spreader.write(fileName1, key1); 
    spreader.write(fileName2, key2); 
    spreader.write(fileNameS1, key1); 
    spreader.write(fileNameS2, key2); 


    // Чтение секретных ключей из файла и перевод обратно в тип SecretKey 
    key1 = spreader.read(fileName1); 
    System.out.println("Секретный ключ 1го пользователя: " +key1); 


    SecretKey seansKey1=getKeyInstance(key1); 

    key2 = spreader.read(fileName2); 
    System.out.println("Секретный ключ 2го пользователя: " +key2); 

    SecretKey seansKey2=getKeyInstance(key2); 


    //инициализация и зашифрование сеансового ключа с помощью секретных 
    Cipher aesCipher = Cipher.getInstance("AES"); 
    aesCipher.init(Cipher.ENCRYPT_MODE,seansKey1); 

    KeyGenerator keyGen = KeyGenerator.getInstance("AES"); 
    keyGen.init(128); 
    SecretKey secretKey = keyGen.generateKey(); 

    String stringsecretKey = SecretKeyToString(secretKey); 
    byte[] byteKey = stringsecretKey.getBytes(); 
    byte[] byteCipherKey1 = aesCipher.doFinal(byteKey); 
    String encryptedKey = new BASE64Encoder().encode(byteCipherKey1); 
    System.out.println("Зашифрованный сеансовый ключ с помощью секретного ключа 1: " +encryptedKey); 





    aesCipher = Cipher.getInstance("AES"); 
    aesCipher.init(Cipher.ENCRYPT_MODE,SeansKey2); 


    byteKey = etringsecretKey.getBytes(); 
    byte[] byteCipherKey2 = aesCipher.doFinal(byteKey); 
    encryptedKey = new BASE64Encoder().encode(byteCipherKey2); 
    System.out.println("Зашифрованный сеансовый ключ с помощью секретного ключа 2: " +encryptedKey); 
    spreader.write(fileNameEK2, encryptedKey); 

    //Чтение данных из файла 
    String text =spreader.read(fileName); 
    System.out.println(text); 

    // Зашифрование данных 


      aesCipher.init(Cipher.ENCRYPT_MODE,secretKey); // константная переменная 

      byte[] byteText = text.getBytes(); 
      byte[] byteCipherText = aesCipher.doFinal(byteText); 
      encryptedText = new BASE64Encoder().encode(byteCipherText); 
      System.out.println("Зашифрованный текст: " +encryptedText); 

      spreader.write(fileNameOK, encryptedText); 





} 

這裏的解密部分:

public static void main(String[] args) throws NoSuchAlgorithmException, FileNotFoundException, InvalidKeyException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException, UnsupportedEncodingException { 

    String encryptedText = user.read(fileNameOK); 
    String key1 = user.read(fileName1); 
    String key2 = user.read(fileName2); 
    String encryptedSeanceKey1 = user.read(fileNameEK1); 
    String encryptedSeanceKey2 = user.read(fileNameEK2); 




    SecretKey secretKey1=getKeyInstance(key1); 
    SecretKey secretKey2=getKeyInstance(key2); 



    Cipher aesCipher = Cipher.getInstance("AES"); 
    aesCipher.init(Cipher.DECRYPT_MODE,secretKey1,aesCipher.getParameters()); 




    //byte[] byteKey = encryptedSeanceKey1.getBytes(); 

     byte[] byteDecryptedKey = aesCipher.doFinal(encryptedSeanceKey1.getBytes()); 
     String decryptedKey1 = new String(byteDecryptedKey); 
     System.out.println("Расшифрованный сеансовый ключ с помощью секретного ключа 1: " +decryptedKey1); 

    aesCipher.init(Cipher.DECRYPT_MODE,secretKey2,aesCipher.getParameters()); 




    byte[] byteKey2 = encryptedSeanceKey2.getBytes(); 
     byteDecryptedKey = aesCipher.doFinal(byteKey2); 
     String decryptedKey2 = new String(byteDecryptedKey); 
     System.out.println("Расшифрованный сеансовый ключ с помощью секретного ключа 2: " +decryptedKey2); 





     // Расшифрование данных 
     aesCipher.init(Cipher.DECRYPT_MODE,getKeyInstance(decryptedKey1),aesCipher.getParameters()); 

     byte[] byteText = encryptedText.getBytes(); 

     byte[] byteDecryptedText = aesCipher.doFinal(byteText); 
     decryptedText = new String(byteDecryptedText); 
     System.out.println(" Расшифрованный текст " +decryptedText); 



} 

}

現在的問題是解密部分:輸入長度必須多16用密碼密碼解密

我知道一個錯誤,我錯誤地保持會話密鑰和字節丟失。但我如何才能正確地做到這一點?

+4

您能否遵守Java命名約定?也就是說,變量名和方法名應該以小寫字母開頭('SKey1'應該是'sKey1',僅舉第一個例子)。這樣可以更容易突出顯示文本,並且最終更容易爲經驗豐富的Java開發人員提供幫助;) – fge

+0

謝謝。我是Java的初學者,所以我不要嚴格評判我。 – user2450578

回答

7

您的代碼有一點點混亂,可能是因爲您調用的某種方法丟失了,或者可能是因爲您正在使用您的密鑰來加密......您的密鑰(!!!)
讓我們嘗試加密並解密簡單的方法,刪除所有不是你的代碼中嚴格需要的東西(比如編碼你的密鑰並保存到一個文件,然後恢復密鑰而不解碼,等等)。

讓我們來看看根據您的以下簡化代碼:

KeyGenerator keyGenS = KeyGenerator.getInstance("AES"); 
    keyGenS.init(128); 
    SecretKey sKey1 = keyGenS.generateKey(); 

    Cipher aesCipher = Cipher.getInstance("AES"); 
    aesCipher.init(Cipher.ENCRYPT_MODE,sKey1); 

    byte[] byteText = "Insert here whatever you want to crypt".getBytes(); 

    byte[] byteCipherText = aesCipher.doFinal(byteText); 

我們已經產生了與的KeyGenerator鍵,然後我們用該密鑰初始化密碼我們的實例。在這一點上,我們簡單地調用doFinal()傳遞我們想要加密的plainText。
這就是加密部分。當然,如果你願意,你可以將你的密鑰和byteCipherText保存到一個文件中,但是所有其他員工(至少)是無用的。

解密部分與加密一樣容易。邏輯是一樣的。 如果您將密鑰保存在文件中,只需將其讀取到byte[]中,然後將其用於初始化密碼實例。事情是這樣的:

aesCipher.init(Cipher.DECRYPT_MODE, sKey1); 
    byte[] plainText = aesCipher.doFinal(byteCipherText); 

如果你把所有的上述代碼爲main()並運行它,你應該有到plainText相同的文字作爲byteText
您可以用

System.out.println(new String(plainText)); 

試圖從這裏開始,然後添加你需要的所有其他東西驗證。
希望這會有所幫助。
Regards

+0

感謝您的幫助。 – user2450578