2011-08-04 9 views
0

私はAndroidのアプリケーションでデータ(画像)を復号化していますが、IOExceptionをスローします。私は本当にそれを修正する方法はわかりません.PNG画像ファイルを暗号化しているときは、例外はスローされず、アプリケーションはリストビューで画像を読み込むことができます。しかし、jpgファイルを暗号化しているとき私は、この例外をスロー:PHPでの暗号化、Javaでの暗号化:IOException:ブロックサイズが一致していないデータ

08-04 06:36:54.734: WARN/System.err(254): java.io.IOException: data not block size aligned 
08-04 06:36:54.734: WARN/System.err(254):  at javax.crypto.CipherInputStream.read(CipherInputStream.java:97) 
08-04 06:36:54.734: WARN/System.err(254):  at javax.crypto.CipherInputStream.read(CipherInputStream.java:152) 
08-04 06:36:54.734: WARN/System.err(254):  at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:183) 
08-04 06:36:54.734: WARN/System.err(254):  at java.io.BufferedInputStream.read(BufferedInputStream.java:346) 
08-04 06:36:54.734: WARN/System.err(254):  at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) 
08-04 06:36:54.734: WARN/System.err(254):  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:459) 
08-04 06:36:54.734: WARN/System.err(254):  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:515) 
08-04 06:36:54.734: WARN/System.err(254):  at com.custom.lazylist.ImageLoader.getBitmap(ImageLoader.java:105) 
08-04 06:36:54.734: WARN/System.err(254):  at com.custom.lazylist.ImageLoader.access$0(ImageLoader.java:75) 
08-04 06:36:54.734: WARN/System.err(254):  at com.custom.lazylist.ImageLoader$PhotosLoader.run(ImageLoader.java:228) 

私はそれは問題はおそらくcode.Hereは、JavaコードとPHPのコードで暗号化および復号化でNoPaddingを使用しているということ、インターネット上で読みます

JAVA

try { 

    Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); 
    SecretKeySpec keySpec = new SecretKeySpec("abcde".getBytes(), "AES"); 
    IvParameterSpec ivSpec = new IvParameterSpec("fedcba".getBytes()); 
    cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec); 

    AssetManager is = this.getAssets(); 
    InputStream fis = is.open("card2_encrypted.jpg"); 

    CipherInputStream cis = new CipherInputStream(fis, cipher); 
    FileOutputStream fos = new FileOutputStream(
       new File(Environment.getExternalStorageDirectory(), "card2_decrypted.jpg")); 




    byte[] b = new byte[8]; 
    int i; 

    while ((i = cis.read(b)) != -1) { 
     fos.write(b, 0, i); 
    } 
    fos.flush(); fos.close(); 
    cis.close(); fis.close(); 

    } 
    catch(Exception e){ 
     e.fillInStackTrace(); 
     Log.v("Error","Error "+e); 
    } 
    } 

PHPコード:

<?php 
    $secret_key = "abcde"; 
    $iv   = "fedcba"; 
    $infile  = "ss1.jpg"; 
    $outfile  = "ss1_encrypted.jpg"; 

    $crypttext = file_get_contents($infile); 
    $plaintext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, 
    $secret_key, $crypttext, MCRYPT_MODE_CBC, $iv); 

    header('Content-Type: application/octet-stream'); 
    header('Content-Length: ' . strlen($plaintext)); 
    header('Content-Disposition: attachment; filename=' . ($outfile)); 
    echo $plaintext; 
?> 

だから私のquesionは、私はPHPのパディングとJavaコードとその原料を修正することができる方法ですので、私は私のイメージをロードすることができます私のapp.Thanks助けをたくさんありがとう!

+0

こちらを参照してくださいhttp://stackoverflow.com/questions/4217920/java-des-in-phpとhttp://tsrini.blogspot.com /2009/12/encrypt-in-java-and-decrypt-in-php.htmlこれらはあなたを助けるかもしれません –

答えて

2

パディングを削除できるように、暗号化の端にパディングを指定し、復号化の端に同じパディングを指定する必要があります。ブロックサイファーAESを使用しているので、すべてのメッセージをブロックサイズの複数の倍数にパディングする必要があります。したがって、エラーメッセージ "データはブロックサイズではありません"。

両端で利用できるパディングを確認し、両方のパディングがサポートされているかを確認します。 PKCS#5は、両方のシステムで使用可能な一般的なパディング規則です。私はPHPを知らないが、Javaでは、あなたは、必要があるでしょう:

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
+0

実際には私はJavaでそれを行う方法を知っていますが、PHPが私の問題です。 – hardartcore

+0

そして、奇妙なことは、pngファイルを解読するときに例外はありませんが、jpgファイルを解読しようとすると例外がスローされます。 – hardartcore

+0

@ psychenaut:申し訳ありませんが、私はPHPを手伝っていません。 .pngファイルに関しては、ファイルが正確なブロック数である可能性があります。異なるサイズの.pngファイルを試しましたか? – rossum