2016-07-05 19 views
-1

Ich habe versucht, eine Datei an denselben Speicherort im externen Speicher mit einem anderen Dateinamen zu verschlüsseln und zu speichern. Aber die Art, wie ich sie benutzt habe, scheint falsch zu sein. Bitte helfen Sie jemandem.Wie schreibe ich eine Datei auf externen Speicher?

 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(); 
    }*/ 
} 

Manifestdatei, die Lese- und Schreibberechtigungen enthält.

+0

Welchen Dateipfad übergeben Sie an diese Methode? –

+1

'zum selben Ort im externen Speicher' ????? – greenapps

+0

Sie schreiben auf dieselbe Weise in alle Dateien in eine Datei. Also, wo liegt das Problem? – greenapps

Antwort

1

Sie geben "AES/ECB/NoPadding" an.

Mit EZB gibt es keine iv und somit keine Notwendigkeit, eine auf den Aufruf der encrypt Methode zu liefern. Der ECB-Modus ist unsicher, siehe ECB mode, scrollen Sie nach unten zum Penguin.

AES ist eine Blockchiffre und als solche verschlüsselt es blockweise Teile auf einmal, so dass die Eingabe ein Vielfaches der Blockgröße sein muss. Padding erreicht dies transparent, aber Sie haben "NoPadding" angegeben, so dass die Größe der Eingabedatei, genau ein Vielfaches der Blockgröße, für AES 16 Byte beträgt. Verwenden Sie stattdessen PKCS # 7 (einige als PKCS # 5 bezeichnet).

Die einfachste Lösung besteht darin, eine Bibliothek zu verwenden, die alle Elemente der sicheren Verschlüsselung zusammenführt, einschließlich Passwortableitung, zufälliges iv, Padding, Verschlüsselungsauthentifizierung. Betrachten Sie RNCryptor, bietet es all dies plus Versionierung. Weitere Informationen finden Sie unter RNCryptor README und RNCryptor-Spec.

+0

Danke für die Antwort, aber hier um die Sicherung der Datei nicht über die Polsterung – Tharindu

+0

AES ist eine Blockchiffre, muss die Eingabe ** ein Vielfaches der Blockgröße für ECB, CBC und andere Modi sein. Also entweder sorgen Sie sich um Polsterung oder hoffen Sie, dass Sie Glück haben, Ihre Wahl. – zaph