2011-07-27 26 views
1

基本的に私は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;のサイズをどのように設定することができるのかと考えています。すべての入力ストリームを出力ストリームにコピーできるので、データを失うことなく使用できます。

答えて

1

私は間違いがあると思います:ファイル全体の内容ではなくバッファだけを暗号化しています。あなたはその後、あなたが望む任意の数にIO_BUFFER_SIZEを減らすことができます

b = baos.tobyteArray(); 

を呼び出す必要が読み取りループ後

。典型的には、4094が良い数字になります。

また、私はあなたが必要とする正確なサイズでbyteArrayOutputStreamを初期化します:実は、私はそれがうまくいくと思う

ByteArrayOutputStream baos = new ByteArrayOutputStream(is.available()); 
+0

:画像の画像暗号化された29200サイズのB 29199サイズの入力ストリーム29199サイズの大きさは29216.そして、いずれかを復号化し復号化されたイメージが暗号化されたイメージ以上のバイトを持つ理由 – hardartcore

+1

AESはブロック暗号であるため、8バイトのブロックで動作します。したがって、出力は8で割り切れる必要があります。データが暗号化される前に、復号時に自動的に削除されるパディングバイトが追加されます。 – Robert