EDIT ::: Код в вопросе работает, но для возврата к активности после съемки изображения требуется около 10 секунд. Я отказался от этого подхода и использовал библиотеку Facebook для скрытия и шифрования изображений. Ссылка на решение Facebook,: Facebook Conceal - Image Encryption and DecryptionПравильный способ шифрования и дешифрования изображения с использованием AES
Я посмотрел на много примеров, но все еще не мог придумать способ, чтобы получить шифрование и дешифрование право. Я думал, что правильно понял, когда использовал какой-то случайный код в Интернете, но при декодировании я получаю исключение BadPadding.
Итак, я пытаюсь это исправить. Я следую приведенному ниже вопросу, как это было предложено большинством людей на SO (но этот код показывает, как зашифровать строку). Может ли кто-нибудь помочь мне в шифровании и расшифровке изображения? Будет ли код в вопросе работать для изображений?
Ссылка на вопрос: Java 256-bit AES Password-Based Encryption
Вот что я сделал до сих пор:
// Глобальный ArrayList для хранения IV и шифра
static ArrayList<byte[]> ivandcipher = new ArrayList<byte[]>();
// Генерация ключа
public static SecretKey generateKey() throws NoSuchAlgorithmException {
char[] password = { 'a', 'b', 'c', 'd', 'e' };
byte[] salt = { 1, 2, 3, 4, 5 };
SecretKeyFactory factory = SecretKeyFactory
.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(password, salt, 65536, 256);
SecretKey tmp = null;
try {
tmp = factory.generateSecret(spec);
} catch (InvalidKeySpecException e) {
e.printStackTrace();
}
yourKey = new SecretKeySpec(tmp.getEncoded(), "AES");
return yourKey;
}
// Кодирующий файл
// байт [] FileData, содержит растровое изображение (изображение) преобразуется в байт []
public static ArrayList<byte[]> encodeFile(SecretKey yourKey, byte[] fileData)
throws Exception {
byte[] encrypted = null;
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, yourKey);
AlgorithmParameters params = cipher.getParameters();
byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();
encrypted = cipher.doFinal(fileData);
ivandcipher.clear();
ivandcipher.add(iv);
ivandcipher.add(encrypted);
return ivandcipher;
}
Почему я и добавление IV зашифрованное байт [] S в ivandcipher. Потому что, как показывает ответ в ссылке, я должен использовать один и тот же iv при расшифровке.
// Decode файл
// Я называю перегруженный метод decodeFile внутри этого метода .. обратите внимание
private Bitmap decodeFile(String filename) {
try {
yourKey = generateKey();
} catch (NoSuchAlgorithmException e1) {
e1.printStackTrace();
}
try {
byte[] decodedData = decodeFile(yourKey, readFile(filename));
Bitmap bitmap = bytesToBitmap(decodedData);
return bitmap;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
// перегруженный метод decodeFile
public static byte[] decodeFile(SecretKey yourKey, byte[] fileData)
throws Exception {
byte[] decrypted = null;
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, yourKey, new IvParameterSpec(ivandcipher.get(0)));
decrypted = cipher.doFinal(fileData);
return decrypted;
}
Я думаю, проблема с fileData [], что я не могу зашифровать и дешифровать правильно. Для строк, как показано в ответе приведенной выше ссылке, т.е.
byte[] ciphertext = cipher.doFinal("Hello, World!".getBytes("UTF-8"));
, что должно быть дано в качестве параметра для cipher.doFinal()?
Сообщите мне, если вам нужен какой-либо другой код.
любая причина для downvote? Я понимаю, что это было задано много раз, но я не мог получить правильное кодирование и дешифрование для моих изображений. –
Причина в том, что вы скопировали «некоторый случайный код в Интернете», не получили его на работу, и теперь мы должны его исправить. – ntoskrnl
@ntoskrnl, я не прошу никого исправить это. Я прошу вас помочь в понимании этого и заставить его работать. И, кстати, код, который я разместил в вопросе, не является случайным, его из ссылки, которую я разместил в вопросе. –