Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Cómo cifrar archivos de tarjeta SD con AES en Android?

Quiero cifrar la imagen de la tarjeta del sd y almacenarla otra vez en tarjeta del SD otra vez usando AES. La idea principal es la aplicación de navegar por una imagen, a continuación, cifrarlo cuando presiono un botón, a continuación, almacenarlo en la tarjeta SD. Así que mi imagen sería segura.

Ya tengo éxito hacer cifrado de cadena utilizando AES de este tutorial http://www.androidsnippets.com/encryptdecrypt-strings , pero no tengo idea de cómo hacer esto con una imagen, no cadena.

Así es como lo hago con una cadena:

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

¿Puede alguien ayudarme a dar código de ejemplo cómo cifrar una imagen con AES?

Tal vez debe usar I / O archivo de flujo, pero no tengo una idea de cómo implementar con este código.

    One Solution collect form web for “Cómo cifrar archivos de tarjeta SD con AES en Android?”

    Si usted toma la entrada del usuario para la contraseña asegúrese de leer esta respuesta .

    Usted debe echar un vistazo a: CipherInputStream y CipherOutputStream . Se utilizan para cifrar y descifrar secuencias de bytes.

    Tengo un archivo llamado cleartext . El archivo contiene:

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

    Ahora, tiene una función 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(); } 

    Después de ejecutar esta función, debe haber un nombre de archivo encrypted . El archivo contiene los caracteres cifrados.

    Para el descifrado usted tiene la función de 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(); } 

    Después de la ejecución de descifrar, debe haber un archivo llamado decrypted . Este archivo contiene el texto libre.

    Usted escribe que es un "noob", pero dependiendo del caso de uso de la encriptación podría hacer mucho daño si no lo está haciendo de la manera correcta. Conozca sus herramientas!

    Uso de la documentación de 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(); 

    Por lo tanto, el cifrado debería funcionar. Cuando invierte el proceso, debería ser capaz de leer los bytes descifrados.

      FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.