0

I'm trying to encrypt some files in my python web server and decrypt them in android app after downloading. I used python AES encryption java decryption question methods like this but I got padding exception in android code what can I do? my python code:

from Crypto.Cipher import AES
import os, random, struct

key = '0123456789abcdef'
mode = AES.MODE_CBC
chunksize = 64*1024

iv = ''.join(chr(random.randint(0,0xFF)) for i in range(16))
encryptor = AES.new(key,mode,iv)
filesize = os.path.getsize('sample.jpg')

with open('sample.jpg','rb') as infile:
    with open('sample.enc','wb') as outfile:
        outfile.write(struct.pack('<Q',filesize))
        outfile.write(iv)

        while True:
            chunk = infile.read(chunksize)
            if len(chunk) == 0:
                break
            elif len(chunk) % 16 != 0:
                chunk += ' ' * (16 - len(chunk) % 16)

            outfile.write(encryptor.encrypt(chunk))

## decrypt
with open('sample.enc', 'rb') as infile:
    origsize = struct.unpack('<Q', infile.read(struct.calcsize('Q')))[0]
    iv = infile.read(16)
    print('test',iv.hexdigest())
    decryptor = AES.new(key, AES.MODE_CBC, iv)
    with open('sample2.jpg', 'wb') as outfile:
        while True:
            chunk = infile.read(chunksize)
            if len(chunk) == 0:
                break
            outfile.write(decryptor.decrypt(chunk))
        outfile.truncate(origsize)

And android code:

package com.example.crypto;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.os.Build;

public class MainActivity extends ActionBarActivity {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);

       Button encryptButton = (Button) findViewById(R.id.button1);
       Button DecryptButton = (Button) findViewById(R.id.button2);


       encryptButton.setOnClickListener(new OnClickListener() {

              @Override
              public void onClick(View v) {
                    // TODO Auto-generated method stub
                    try {
                           encrypt();
                    } catch (InvalidKeyException e) {
                           // TODO Auto-generated catch block
                           e.printStackTrace();
                    } catch (NoSuchAlgorithmException e) {
                           // TODO Auto-generated catch block
                           e.printStackTrace();
                    } catch (NoSuchPaddingException e) {
                           // TODO Auto-generated catch block
                           e.printStackTrace();
                    } catch (IOException e) {
                           // TODO Auto-generated catch block
                           e.printStackTrace();
                    }
              }
       });
 public void decryptFile(){

       String inFile = "sample.enc";
       String outFile = "sample.jpg";
       String dir = Environment.getExternalStorageDirectory() +"/Books/";
       InputStream is = null ;

       byte[] filesize = new byte[8];
       byte[] iv = new byte[16];
       try {
           is = new FileInputStream(dir+inFile);

           is.read(filesize);
           is.read(iv);

       } catch (FileNotFoundException e1) {
           // TODO Auto-generated catch block
           Log.d("D1","no file found");
       } catch (IOException e) {
           // TODO Auto-generated catch block
           Log.d("D-2","no file found");
           e.printStackTrace();
       }

       byte[] k = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};

       Key key = new SecretKeySpec(k,"AES");




       try {
           Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
           cipher.init(Cipher.DECRYPT_MODE, key,new IvParameterSpec(iv));
           OutputStream outs = new FileOutputStream(dir+outFile);
           //is = new FileInputStream(dir+inFile);

           while(true){
               byte[] chunk = new byte[64*1024];

               is.read(chunk);
               if(chunk.length == 0){

                   break;

               }
               outs.write(cipher.doFinal(chunk));              
           }


       } catch (NoSuchAlgorithmException e) {
           // TODO Auto-generated catch block
           Log.d("D","1");

           e.printStackTrace();
       } catch (NoSuchPaddingException e) {
           // TODO Auto-generated catch block
           Log.d("D","2");
           e.printStackTrace();
       } catch (InvalidKeyException e) {
           // TODO Auto-generated catch block
           Log.d("D","3");
           e.printStackTrace();
       } catch (InvalidAlgorithmParameterException e) {
           // TODO Auto-generated catch block
           Log.d("D","4");
           e.printStackTrace();
       } catch (FileNotFoundException e) {
           // TODO Auto-generated catch block
           Log.d("D","5");
           e.printStackTrace();
       } catch (IOException e) {
           // TODO Auto-generated catch block
           Log.d("D","6");
           e.printStackTrace();
       } catch (IllegalBlockSizeException e) {
           // TODO Auto-generated catch block
           Log.d("D","7");
           e.printStackTrace();
       } catch (BadPaddingException e) {
           // TODO Auto-generated catch block
           Log.d("D","8");
           e.printStackTrace();
       }


   }

I fixed some bugs like file size and ... in base code but still padding problem exists. In python for decryption we use file size and truncate the file but in java I don't know how to do this!

Community
  • 1
  • 1
hamidfzm
  • 4,595
  • 8
  • 48
  • 80

1 Answers1

0

That python code that you copied from this question in really not suitable for anything. It performs padding as a side effect of having a hard-coded constant CHUNKSIZE being a multiple of 16. If for some reason you didn't know this and changed the CHUNKSIZE to 1000 the code would fail in a hard-to-understand way.

The padding used by the python code is also non-standard. To use something standard like PKCS5/7 padding, see this answer.

Community
  • 1
  • 1
President James K. Polk
  • 40,516
  • 21
  • 95
  • 125