Шифрование Android AES с нулевым заполнением

Мне нужно зашифровать файл с помощью AES, с размером блока CBC 16 байт и ключом 256 бит. И файл должен быть дополнен нулями до кратного 16 байтам. И после шифрования файла количество заполненных нулей необходимо добавить в конец.

Например, если у меня есть файл размером 9 байт, будут добавлены 7 нулевых байтов. 16 байтов будут зашифрованы, а затем к концу будет добавлена ​​длина прочитанных данных, равная 9. Таким образом, общая длина должна составлять 17 байтов, причем последний байт не зашифрован.

Я использую класс Cipher и знаю, что нужно использовать "AES/CBC/", но я не знаю, есть ли метод заполнения, описывающий то, что я хочу.

РЕДАКТИРОВАТЬ: последний байт должен указывать, сколько байтов являются реальными данными в последней 16-байтовой заполненной ячейке.


person Hank    schedule 29.07.2011    source источник
comment
Я понимаю утверждение, не уверен, что понимаю вашу проблему, вы спрашиваете, как построить буфер с правильным заполнением или?   -  person Idistic    schedule 29.07.2011
comment
Я просто хочу знать, есть ли имя для метода заполнения или мне нужно сделать это вручную? И если есть имя, оно поддерживается?   -  person Hank    schedule 29.07.2011
comment
Как указано в ответе timothyjc, у него есть доступные механизмы заполнения, так что заполнение позаботится о вас. AES/ECB/PKCS7Padding заботится о размерах блоков до 255 байтов.   -  person Idistic    schedule 30.07.2011


Ответы (2)


Не уверен, что вы уже решили свою проблему, но я думаю, что тип заполнения, который вы ищете, это ZeroBytePadding. Этот код работает для меня на симуляторе 2.3.3:

String stringKey = "60380131061660211660380426804995";
String message = "This is a secret message";
try {
    SecretKeySpec sks = new SecretKeySpec(stringKey.getBytes(),"AES");
    Cipher c = Cipher.getInstance("AES/ECB/ZeroBytePadding"); // Change to CBC and use appropriate IV
    c.init(Cipher.ENCRYPT_MODE, sks);
    c.update(message.getBytes());
    byte[] ciphertext = c.doFinal();
    Log.i("CE", new String(ciphertext));

    } catch (NoSuchAlgorithmException e) {
        Log.e("CE",e.getMessage());
    } catch (NoSuchPaddingException e) {
        Log.e("CE",e.getMessage());
    } catch (InvalidKeyException e) {
        Log.e("CE",e.getMessage());
    } catch (IllegalBlockSizeException e) {
        Log.e("CE",e.getMessage());
    } catch (BadPaddingException e) {
        Log.e("CE",e.getMessage());
}
person Chopstick    schedule 01.09.2011
comment
Я перечитал ваш вопрос и думаю, что ZeroBytePadding - это не то, что вам нужно. Если ANSI X.923 также не то, что вам нужно (потому что вы не хотите, чтобы последний байт был зашифрован), вам придется написать процедуру заполнения самостоятельно. Поэтому дополните сообщение X.923, скопируйте последний байт, зашифруйте, а затем добавьте в файл последний байт с длиной нуля. - person Chopstick; 01.09.2011
comment
Cipher cipher = Cipher.getInstance("AES/ECB/ZeroBytePadding"); дает 'Cannot Find any provider supporting "AES/ECB/ZeroBytePadding". Вы случайно не знаете, какого провайдера мне следует использовать? - person One Two Three; 02.05.2012
comment
@OneTwoThree ZeroBytePadding должен работать в Android, поскольку он основан на коде Bouncy Castle, но не в JRE. Если он недоступен, добавьте и настройте провайдера Bouncy Castle или используйте Spongy Castle. - person Maarten Bodewes; 22.08.2013

Вам не нужно ничего делать вручную, поскольку в Android есть все необходимые библиотеки (через JCE), чтобы сделать это безболезненно.

Я разместил некоторый код шифрования AES, который я написал для приложения Android, здесь: http://pocket-for-android.1047292.n5.nabble.com/Encryption-method-and-reading-the-Dropbox-backup-td4344194.html#a4454327

Возможно, вы захотите обратить внимание на схемы заполнения, в моем случае это PKCS5Padding.

person timothyjc    schedule 29.07.2011
comment
Что я конкретно ищу, так это название схемы заполнения, которую я описал выше в своем вопросе. - person Hank; 01.08.2011
comment
Вы можете попробовать ANSI X.923... stackoverflow.com/questions/ 1329730/java-ansi-x923-padding, en.wikipedia.org/ wiki/Padding_%28cryptography%29. - person timothyjc; 01.08.2011
comment
ANSI X.923 похож, но отличается, поскольку байт длины также зашифрован. - person Hank; 01.08.2011