2017-04-02 18 views
0

実際に暗号化/復号化するためにthisポストやthisのようにランダムキーを生成するためのシード暗号化は私のファイルサイズを3MBから16バイトに減らし、復号化はそれをさらに0バイトに減らします。私はまた、トピック上でthis YouTube videoを見て、私のコードは、彼の仕事がうまくいっている間に、復号化プロセスでファイルサイズがゼロになるという同じ問題を抱えていました。AESとハッシュパスワードをキーにした画像ファイルのJava暗号化と復号化

これは、SHA256ハッシュに基づいて、鍵を生成する私の機能ではkとして渡さ:

public static Key keyGen(String k) throws Exception { 
    SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256"); 
    KeySpec spec = new PBEKeySpec(k.toCharArray(), k.getBytes(), 12, 128); 
    SecretKey tmp = factory.generateSecret(spec); 
    return new SecretKeySpec(tmp.getEncoded(), "AES"); 
} 

はこれらは私が暗号化と復号化に使用しています関数です:機能

public static void encrypt(Key key, byte[] content) throws Exception { 
     Cipher cipher; 
     byte[] encrypted = null; 
     try { 
      cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
      cipher.init(Cipher.ENCRYPT_MODE, key); 
      encrypted = cipher.doFinal(content); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     saveFile(encrypted); 
     JOptionPane.showMessageDialog(null, "Encryption complete"); 
    } 


public static void decrypt(Key key, byte[] textCryp) throws Exception { 
     Cipher cipher; 
     byte[] decrypted = null; 
     try { 
      cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
      cipher.init(Cipher.DECRYPT_MODE, key); 
      decrypted = cipher.doFinal(textCryp); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     saveFile(decrypted); 
     JOptionPane.showMessageDialog(null, "Decryption complete"); 
    } 

I内容をファイルに書き戻すために使用します:

public static void saveFile(byte[] bytes) throws IOException { 
     FileOutputStream fos = new FileOutputStream("filepath/test.jpg"); 
     fos.write(bytes); 
     fos.close(); 
    } 

最終LY、暗号化に渡された画像ファイルのバイト表現を取得する機能は、/「コンテンツ」としての機能を解読:

public static byte[] getFile() { 

    File f = new File("filepath/test.jpg"); 
    InputStream is = null; 
    try { 
     is = new FileInputStream(f); 
    } catch (FileNotFoundException e2) { 
     // TODO Auto-generated catch block 
     e2.printStackTrace(); 
    } 
    byte[] content = null; 
    try { 
     content = new byte[is.available()]; 
    } catch (IOException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    try { 
     is.read(content); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return content; 
} 

そして、これらの関数を呼び出す主な機能:

public static void main(String[] args) throws Exception { 
    Key key = keyGen("1234567812345678"); 
    byte[] fileContents = getFile(); 
    //I change to decrypt after I call encrypt 
    encrypt(key,fileContents); 

} 

エラーなしまたは例外がスローされ、このコードを書いている間に私が参照した投稿とビデオは正常に動作しているようです。

これは私が長年取り組んできたプロジェクトの最終的な部分であるため、これに関するアドバイスを本当に感謝します。

+3

available()は使用しないでください。それはあなたが思っていることをしません。ファイルを読み取るには、https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#readAllBytes-java.nio.file.Path-を使用します。 –

+0

これらのメソッドを呼び出すコードは表示されないため、取得すると主張する結果が得られる理由を特定することは不可能です。 –

+0

私はそれを呼び出すmain関数を追加しました。 – CS2016

答えて

0

さらに多くの試行を経て、コードを実行しようとしていたテストファイルがクラウドドライブに入っていることに気付きました。ファイルをローカルディレクトリにコピーし、コードを書き直しても問題はありません。

+0

あなたのコードはまだ間違っています。実際、 'getFile()'メソッドはアンチパターンデモに似ています。 –

関連する問題