Как зашифровать файл с SD-карты с помощью AES на Android?

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

Мне уже удалось выполнить строковое шифрование с использованием AES из этого учебника http://www.androidsnippets.com/encryptdecrypt-strings , но у меня нет идеи, как это сделать с изображением, а не с строкой.

Вот как я делаю это со строкой:

public static String encrypt(String seed, String cleartext) throws Exception { byte[] rawKey = getRawKey(seed.getBytes()); byte[] result = encrypt(rawKey, cleartext.getBytes()); return toHex(result); } private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception { SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE, skeySpec); byte[] encrypted = cipher.doFinal(clear); return encrypted; } 

Может ли кто-нибудь помочь мне привести пример кода, как зашифровать изображение с помощью AES?

возможно, он должен использовать stream файлов ввода-вывода, но у меня нет идеи, как реализовать этот код.

Если вы берете пользовательский ввод пароля, обязательно прочитайте этот ответ .

Вы должны взглянуть на: CipherInputStream и CipherOutputStream . Они используются для шифрования и дешифрования streamов байтов.

У меня есть файл с именем cleartext . Файл содержит:

 Hi, I'm a clear text. How are you? That's awesome! 

Теперь у вас есть функция encrypt() :

 static void encrypt() throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException { // Here you read the cleartext. FileInputStream fis = new FileInputStream("data/cleartext"); // This stream write the encrypted text. This stream will be wrapped by another stream. FileOutputStream fos = new FileOutputStream("data/encrypted"); // Length is 16 byte // Careful when taking user input!!! https://stackoverflow.com/a/3452620/1188357 SecretKeySpec sks = new SecretKeySpec("MyDifficultPassw".getBytes(), "AES"); // Create cipher Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE, sks); // Wrap the output stream CipherOutputStream cos = new CipherOutputStream(fos, cipher); // Write bytes int b; byte[] d = new byte[8]; while((b = fis.read(d)) != -1) { cos.write(d, 0, b); } // Flush and close streams. cos.flush(); cos.close(); fis.close(); } 

После выполнения этой функции имена файлов должны быть encrypted . Файл содержит зашифрованные символы.

Для дешифрования у вас есть функция decrypt :

 static void decrypt() throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException { FileInputStream fis = new FileInputStream("data/encrypted"); FileOutputStream fos = new FileOutputStream("data/decrypted"); SecretKeySpec sks = new SecretKeySpec("MyDifficultPassw".getBytes(), "AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.DECRYPT_MODE, sks); CipherInputStream cis = new CipherInputStream(fis, cipher); int b; byte[] d = new byte[8]; while((b = cis.read(d)) != -1) { fos.write(d, 0, b); } fos.flush(); fos.close(); cis.close(); } 

После выполнения дешифрования должен быть файл с decrypted . Этот файл содержит свободный текст.

Вы пишете, что вы «нооб», но в зависимости от прецедента шифрования вы можете нанести большой вред, если не делаете это правильно. Знай свои инструменты!

Использование документации CipherOutputStream Oracle :

 SecretKeySpec skeySpec = new SecretKeySpec(y.getBytes(), "AES"); FileInputStream fis; FileOutputStream fos; CipherOutputStream cos; // File you are reading from fis = new FileInputStream("/tmp/a.txt"); // File output fos = new FileOutputStream("/tmp/b.txt"); // Here the file is encrypted. The cipher1 has to be created. // Key Length should be 128, 192 or 256 bit => ie 16 byte SecretKeySpec skeySpec = new SecretKeySpec("MyDifficultPassw".getBytes(), "AES"); Cipher cipher1 = Cipher.getInstance("AES"); cipher1.init(Cipher.ENCRYPT_MODE, skeySpec); cos = new CipherOutputStream(fos, cipher1); // Here you read from the file in fis and write to cos. byte[] b = new byte[8]; int i = fis.read(b); while (i != -1) { cos.write(b, 0, i); i = fis.read(b); } cos.flush(); 

Таким образом, шифрование должно работать. Когда вы меняете процесс, вы должны иметь возможность читать дешифрованные байты.

  • javax.crypto.IllegalBlockSizeException: длина ввода должна быть кратной 16 при расшифровке с дополненным шифрованием
  • Использование SHA1 и RSA с java.security.Signature против MessageDigest и Cipher
  • Шифрование RSA, получение плохой длины
  • Каков самый простой способ зашифровать пароль, когда я сохраняю его в реестре?
  • SQLite с защитой от шифрования / паролей
  • Лучший способ хранения ключей шифрования в .NET C #
  • Как выбрать режим шифрования AES (CBC ECB CTR OCB CFB)?
  • Как использовать AES_ENCRYPT и AES_DECRYPT в mysql
  • Каковы наилучшие методы использования AES-шифрования в Android?
  • Шифровать и расшифровать строку в C #?
  • Учитывая, что последний блок не заполнен неправильно
  • Давайте будем гением компьютера.