2011-08-04 56 views
0

我正在使用PHP加密数据,并且我在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) 

我读了它的问题可能是使用NoPadding在加密和解密code.Here是Java代码和PHP代码的互联网:

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