0

学校のプロジェクトとして、私は次のことを達成しようとしています: -フォルダー内のすべてのファイル (写真) を一覧表示します。すべての写真を 1 つずつ確認し、AES を使用してパスワードで暗号化します。

これは、写真を安全に暗号化するためのアプリケーションとして意図されており、正しいパスワードを持っている場合にのみ、写真を復号化して表示できるようにします。

これまでのところ、フォルダー/ディレクトリ内のすべてのファイル名を取得し、指定した 1 つのファイルのみを暗号化できます。問題は、リストを調べて、すべてのファイルを最後まで暗号化する方法がわからないことです。

現在使用しているコードは次のとおりです。

package com.example.secretpictures;
import java.io.File; 
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;


import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;

import javax.crypto.NoSuchPaddingException;

import javax.crypto.spec.SecretKeySpec;

import android.annotation.SuppressLint;
import android.app.Service;
import android.content.Intent;
import android.os.Environment;
import android.os.IBinder;
import android.util.Log;

public class EncryptService extends Service {
private static final String TAG = EncryptService.class.getSimpleName();
@Override
public IBinder onBind(Intent intent) {
    return null;



}
@Override
public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();

Log.d(TAG, "OnCreate");
}


@SuppressLint("SdCardPath")
@Override
public void onStart(Intent intent, int startId) {
    // TODO Auto-generated method stub
    super.onStart(intent, startId);

Log.d(TAG, "OnStart");

File file[] = Environment.getExternalStorageDirectory().listFiles();
recursiveFileFind(file);


try {

FileInputStream fis = new FileInputStream("/mnt/sdcard/secretpictures/yolo.png");
// This stream write the encrypted text. This stream will be wrapped by another stream.
FileOutputStream fos = new FileOutputStream("/mnt/sdcard/secretpictures/yolo2.enc");

// Length is 16 byte
SecretKeySpec sks = new SecretKeySpec("MyDifficultPassw".getBytes(), "AES");
// Create cipher
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.ENCRYPT_MODE, sks);
    // 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) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InvalidKeyException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

@Override
public void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();

Log.d(TAG, "OnDestroy");
}



public void recursiveFileFind(File[] file1){
int i = 0;
String filePath="";
 if(file1!=null){
while(i!=file1.length){
    filePath = file1[i].getAbsolutePath();
        if(file1[i].isDirectory()){
                File file[] = file1[i].listFiles();
            recursiveFileFind(file);
            }
        i++;
        Log.d(i+"", filePath);

}
}
}   
}

ご覧のとおり、非常に見苦しいコードになっていますが、とりあえず作業は完了です。このサービスは、メイン アクティビティが作成されたときに呼び出されます。

この行は、暗号化するファイルを指定します。 FileInputStream fis = new FileInputStream("/mnt/sdcard/secretpictures/yolo.png");

入力ストリームを通過File file[] = file1[i].listFiles();させてすべてのファイルを暗号化するには、どのようにアプローチすればよいでしょうか?

4

1 に答える 1

0

Fileコードに示すように、ファイルを検索するオブジェクトを取得したら、FileInputStreamコンストラクターを使用してそのファイルの を取得できますFileInputStream(File)

暗号システムに関するいくつかのメモ。あまり安全ではありません。順不同

  • キー素材にソルトなしで UTF-8 バイトを直接使用します。PBKDF2のようなキー ストレッチング アルゴリズムを使用し、パスワード バイトをソルトと共にフィードします。暗号化されたイメージを使用して、salt をプレーンテキストとして保存できます。

  • のデフォルトの暗号仕様を使用していますAES。これは に展開されAES/ECB/PKCS5Paddingます。ECBプレーンテキスト (AES の場合は 16 バイト) の複数のブロックを暗号化するための安全なモードではありません。同じ入力平文が同じ出力暗号文になるため、ECB は平文のパターンを隠すことができません。画像はパターンが繰り返されるため、特に脆弱です。ECB の詳細については、このウィキペディアの記事を参照してください。例として、暗号化されたイメージも示されています。使用できる他のほとんどのモード (CBC、CTR など) では IV が必要でした。IV はランダムに生成される必要があり、暗号化されたイメージと共に平文で保存できます。

于 2013-11-03T13:30:56.430 に答える