2016-07-05 21 views
-1

ファイルを別のファイル名で外部記憶域の同じ場所に暗号化して保存しようとしました。しかし、私が使った方法は間違っているようです。助けてください。外部ストレージにファイルを書き込む方法は?

 public static void encrypt(SecretKey secretKey, String filePath, IvParameterSpec iv){ 
    try { 

     String file = ""; 
     // Here you read the cleartext. 
     FileInputStream fis = new FileInputStream(filePath); 
     // This stream write the encrypted text. This stream will be wrapped by another stream. 
     //String filePath2 = filePath+"enc"; 

     file = filePath.substring(0,filePath.length()-5)+"enc.jpeg"; 

     FileOutputStream fos = new FileOutputStream(file); 
     Log.i(TAG, "Uri = "+file); 

     // Create cipher 
     Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding"); 
     cipher.init(Cipher.ENCRYPT_MODE, secretKey); 
     // Wrap the output stream 
     CipherOutputStream cos = new CipherOutputStream(fos, cipher); 

     // Write bytes 
     int b; 
     byte[] d = new byte[8]; 
     while ((b = fis.read(d)) != -1) { 
      cos.write(d, 0, b); 
     } 

     // Flush and close streams. 
     cos.flush(); 
     cos.close(); 
     fis.close(); 

    }catch(IOException e){ 
     e.printStackTrace(); 
    }catch (NoSuchAlgorithmException e){ 
     e.printStackTrace(); 
    }catch(NoSuchPaddingException e){ 
     e.printStackTrace(); 
    }catch(InvalidKeyException e){ 
     e.printStackTrace(); 
    }/*catch (InvalidAlgorithmParameterException e){ 
     e.printStackTrace(); 
    }*/ 
} 

読み取りと書き込みの両方のアクセス許可を含むマニフェストファイル。

+0

どのファイルパスをこのメソッドに渡しますか? –

+1

'を外部記憶装置の同じ場所に格納する。 – greenapps

+0

すべての場所と同じ方法でファイルに書き込みます。それで問題は何ですか? – greenapps

答えて

1

「AES/ECB/NoPadding」を指定します。

ECBでは、ivがないため、encryptメソッドを呼び出す際に、それを提供する必要はありません。 ECBモードは安全ではありません。ECB modeを参照して、ペンギンまでスクロールしてください。

AESはブロック暗号であるため、ブロックサイズの部分を一度に暗号化するため、入力はブロックサイズの倍数にする必要があります。パディングはこれを透過的に達成しましたが、 "NoPadding"を指定したので、16バイトのAESの入力ファイルサイズはブロックサイズの倍数になります。その代わりに、PKCS#7(PKCS#5と呼ばれるもの)パディングを使用します。

最も簡単な解決策は、パスワードの派生、ランダムなiv、パディング、暗号化の認証など、安全な暗号化のすべての要素をまとめたライブラリを使用することです。 RNCryptorを考えてみましょう。詳細については、RNCryptor READMEおよびRNCryptor-Specを参照してください。

+0

答えはありがたいですが、ここではパディングについてではなくファイルを保存することを心配しています – Tharindu

+0

AESはブロック暗号です。入力**はECB、CBCおよびその他のモードのブロックサイズの倍数でなければなりません。パッディングやラッキーになることを心配してください。 – zaph

関連する問題