Шифрование с помощью PHP, дешифрование с помощью Java: IOException: данные не выровнены по размеру блока - PullRequest
0 голосов
/ 04 августа 2011

Я использую PHP-шифрование данных, а затем дешифрую данные (изображения) в своем приложении для Android, но иногда это вызывает у меня IOException, и я не совсем уверен, как это исправить. Когда я шифрование файла изображения PNG, все в порядке, исключение не выдается, и мое приложение может загрузить изображение в виде списка. Но когда я шифрую файл jpg, оно выдает мне это исключение:

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 для шифрования и дешифрования кода. Вот код Java и код PHP:

JAVA

    try {

    Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
    SecretKeySpec keySpec = new SecretKeySpec("01234567890abcde".getBytes(), "AES");
    IvParameterSpec ivSpec = new IvParameterSpec("fedcba9876543210".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   = "01234567890abcde";
    $iv           = "fedcba9876543210";
    $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;
?>

Итак, мой вопрос: как мне исправить это с помощью отступов в php и java-коде, чтобы я мог загружать свои изображения в свое приложение. Большое спасибо за помощь!

1 Ответ

2 голосов
/ 04 августа 2011

Необходимо указать заполнение в конце шифрования и такое же заполнение в конце расшифровки, чтобы заполнение можно было удалить. Вы используете блочный шифр AES, поэтому все сообщения должны быть дополнены множеством блоков. Отсюда ваше сообщение об ошибке «данные не выровнены по размеру блока».

Проверьте, какие отступы имеются на обоих концах, и выберите тот, который они оба поддерживают. PKCS # 5 - это общее соглашение о заполнении, которое, вероятно, будет доступно в обеих системах. Я не знаю PHP, но в Java вам понадобится:

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...