基本的に私はassesフォルダから画像を暗号化しています。その後、復号化します。コードをいくつかの場所に入れて、実際のInputStreamバイト私はプログラムを実行すると、私はLogCatでこれを取得します:私が使用しているAndroidのAES暗号化/復号化 - 入力ストリームとbytearrayoutputstream
07-27 13:41:08.091: VERBOSE/Size(10546): Size of inputstream 29199
07-27 13:41:17.340: WARN/ActivityManager(52): Launch timeout has expired, giving up wake lock!
07-27 13:41:17.670: WARN/ActivityManager(52): Activity idle timeout for HistoryRecord{44defa50 com.example.pbe/.PBEencryptdecryptActivity}
とit.Theコードのthatsは次のとおりです。
package com.example.aes;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import android.app.Activity;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class PBEencryptdecryptActivity extends Activity {
private int IO_BUFFER_SIZE;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
KeyGenerator keygen;
try {
keygen = KeyGenerator.getInstance("AES");
SecretKey aesKey = keygen.generateKey();
Cipher aesCipher,aesCipherDec;
AssetManager am = this.getAssets();
InputStream is = am.open("007FRAMESUPERIOR.jpg"); // get the encrypted image from assets folder
Log.v("Size","Size of inputstream "+is.available());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] b = new byte[IO_BUFFER_SIZE];
int read;
while ((read = is.read(b)) != -1) { //convert inputstream to bytearrayoutputstream
baos.write(b, 0, read);
}
Log.v("Size","Size of b "+b.length);
aesCipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); // Create the cipher
aesCipher.init(Cipher.ENCRYPT_MODE, aesKey); // Initialize the cipher for encryption
byte[] ciphertext = aesCipher.doFinal(b); // Encrypt the cleartext
Log.v("Size","Size of image encrypted "+ciphertext.length);
aesCipherDec = Cipher.getInstance("AES/ECB/PKCS5Padding");
aesCipherDec.init(Cipher.DECRYPT_MODE, aesKey); // Initialize the same cipher for decryption
byte[] cleartext1 = aesCipher.doFinal(ciphertext); // Decrypt the ciphertext
//Bitmap bitmap = BitmapFactory.decodeByteArray(cleartext1 , 0, cleartext1.length); //decoding bytearrayoutputstream to bitmap
Log.v("Size","Size of image decrypted "+cleartext1.length);
} catch (Exception e) {
e.printStackTrace();
Log.v("Error", "Error Occured "+e);
}
}
}
実際には私はprivate int IO_BUFFER_SIZE;
のサイズをどのように設定することができるのかと考えています。すべての入力ストリームを出力ストリームにコピーできるので、データを失うことなく使用できます。
:画像の画像暗号化された29200サイズのB 29199サイズの入力ストリーム29199サイズの大きさは29216.そして、いずれかを復号化し復号化されたイメージが暗号化されたイメージ以上のバイトを持つ理由 – hardartcore
AESはブロック暗号であるため、8バイトのブロックで動作します。したがって、出力は8で割り切れる必要があります。データが暗号化される前に、復号時に自動的に削除されるパディングバイトが追加されます。 – Robert