Python AES шифрование Java расшифровка - PullRequest
2 голосов
/ 23 февраля 2012

У меня есть более 1000 изображений и видео, которые необходимо зашифровать. Ничто сверх того, просто что-то простое, я думал об использовании AES, но я не могу понять, как зашифровать на моем компьютере, а затем расшифровать элемент на устройстве.

Я буду зашифровывать все элементы на моем компьютере, вероятно, используя python. Затем по запросу будет дешифровать элемент с помощью Java (Android-приложение)

Псевдокод тоже подойдет для любого простого объяснения.

Основная проблема, с которой я сталкиваюсь, - как использовать один и тот же ключ для шифрования и дешифрования. Я генерировал ключ и не могу перенести его на другое устройство для расшифровки.

Спасибо

Код Python. Работает шифрует и дешифрует.

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)
       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)

Как мне сделать расшифровку в Java? Вот мой быстрый небрежный код Java, который не работает. Я думаю, что это заполнение мешает.

  public void decryptFile(){

    String inFile = "sample.enc";
    String outFile = "sample.jpg";
    String dir = Environment.getExternalStorageDirectory() +"/Android/data/HOT/";
    InputStream is ;
    byte[] iv = new byte[16];
    try {
        is = new FileInputStream(dir+inFile);

        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();
    }

    ImageView im = (ImageView)findViewById(R.id.imageView2);

    Bitmap mainBitmap = BitmapFactory.decodeFile(dir+outFile);

    im.setImageBitmap(mainBitmap);

}

1 Ответ

0 голосов
/ 24 февраля 2012

В версии Java вы, кажется, не читаете в размере файла перед чтением в IV, в отличие от версии Python.

Вы также открываете вторую FileInputStream и затем не пропускаете размер файла и IV перед чтением кусками для Cipher.

Еще одна вещь, которую нужно проверить, это то, что ключи интерпретируются одинаково в Java и Python, то есть строка в Python приводит к той же последовательности байтов, что и байтовый массив в Java.

...