La criptografía es una técnica de seguridad de la información y las comunicaciones mediante el uso de códigos para que solo aquellas personas a las que está destinada la información puedan entenderla y procesarla. Previniendo así el acceso no autorizado a la información. El prefijo «cripta» significa «oculto» y el sufijo grafía significa «escrito».
Descripción del proyecto
En este artículo, crearemos una aplicación de Android que puede cifrar y descifrar un mensaje utilizando el algoritmo de codificación y decodificación respectivamente. La página de inicio de la aplicación le dará al usuario dos opciones:
- Cifrado: Es el proceso de transformar un mensaje legible en uno ilegible. Para ello utilizamos algoritmos de codificación.
- Descifrado: Es el proceso de transformar datos o información de una forma ilegible a una forma legible. Para ello utilizamos algoritmos de decodificación.
qué
Implementación paso a paso
Paso 1: Crear un nuevo proyecto
Para crear un nuevo proyecto en Android Studio, consulte Cómo crear/iniciar un nuevo proyecto en Android Studio . Tenga en cuenta que seleccione Java como lenguaje de programación.
Paso 2: antes de ir a la sección de codificación, primero debe hacer una tarea previa
Modifique el archivo colors.xml:
XML
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="colorPrimary">#6200EE</color> <color name="colorPrimaryDark">#3700B3</color> <color name="colorAccent">#03DAC5</color> <color name="green">#0F9D58</color> </resources>
Modifique el archivo style.xml: cambie AppTheme a NoActionBar
XML
<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.NoActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style> </resources>
Cree una clase Java para el algoritmo de codificación y decodificación:
Necesitamos crear dos clases Java cada una para codificar y decodificar algoritmos. Para hacerlo, haga clic con el botón derecho y seleccione la nueva opción de clase Java y créelos y nombre el archivo como Encode and Decode .
Crear actividades vacías para pantallas de cifrado y descifrado:
Necesitamos crear dos actividades cada una para las pantallas de cifrado y descifrado. Para hacerlo, haga clic con el botón derecho y seleccione la nueva opción Actividad vacía y cree ambas actividades y asígneles el nombre Codificador y Decodificador .
Paso 3: crea la página de inicio de la aplicación
Los códigos XML se utilizan para construir la estructura de la actividad, así como su parte de estilo. En la página de inicio, tendremos dos botones para Cifrado y Descifrado en el centro de la actividad. En la parte superior, tendremos un TextView para el título de la aplicación. A continuación se muestra el código para el archivo activity_main.xml :
XML
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#0F9D58" android:orientation="vertical" tools:context=".MainActivity"> <!--Title of the application--> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="5dp" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Cryptography App" android:textColor="#FFFFFF" android:textSize="40dp" android:textStyle="bold" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_gravity="center" android:layout_marginTop="30dp" android:orientation="vertical"> <!--Button for encryption--> <Button android:id="@+id/btVar1" android:layout_width="280dp" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="50dp" android:background="#000000" android:text="Encryption" android:textColor="#FFFFFF" android:textSize="25dp" android:textStyle="bold" /> <!--Button for decryption--> <Button android:id="@+id/btVar2" android:layout_width="280dp" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="50dp" android:background="#000000" android:text="Decryption" android:textColor="#FFFFFF" android:textSize="25dp" android:textStyle="bold" /> </LinearLayout> </RelativeLayout>
Interfaz de usuario de salida:
Paso 4: trabajar con el archivo MainActivity.java
En el archivo MainActivity , haremos funcionar los dos botones para abrir las nuevas actividades. Para ello utilizaremos una función de Intent que nos permite pasar de una actividad a otra. Los dos parámetros de la función Intent son la clase de la actividad actual y la clase de la siguiente actividad. Llamaremos a esta función dentro de onClickListener de los dos botones. A continuación se muestra el código del archivo MainActivity.java . Se agregan comentarios dentro del código para comprender el código con más detalle.
Java
import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { Button enc, dec; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // link both the button variables with its id enc = findViewById(R.id.btVar1); dec = findViewById(R.id.btVar2); // onClick function for encryption enc.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // Intent function to move to another activity Intent intent = new Intent(getApplicationContext(), Encoder.class); startActivity(intent); } }); // onClick function for decryption dec.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // Intent function to move to another activity Intent intent = new Intent(getApplicationContext(), Decoder.class); startActivity(intent); } }); } }
Paso 5: agregue algoritmos de codificación y decodificación
Los algoritmos de codificación se utilizan para convertir el texto en un formato ilegible, mientras que los algoritmos de decodificación se utilizan para convertir un texto codificado en un formato legible. Hay muchos algoritmos que se pueden utilizar para realizar el cifrado y descifrado. En este algoritmo, convertiremos el texto en un número binario utilizando un algoritmo de cifrado. Para este proyecto, utilizaremos un algoritmo personalizado. También puede usar algoritmos de codificación y decodificación de tipo base en Java . Agregue el siguiente código en la clase Java de codificación y decodificación que creamos en el paso 2.
Encode.java: en esta clase, hemos creado una función de devolución que tomará un solo parámetro de una variable de string y devolverá un código cifrado en forma de string.
Java
public class Encode { public static String encode(String s) { // create a string to add in the initial // binary code for extra security String ini = "11111111"; int cu = 0; // create an array int arr[] = new int[11111111]; // iterate through the string for (int i = 0; i < s.length(); i++) { // put the ascii value of // each character in the array arr[i] = (int) s.charAt(i); cu++; } String res = ""; // create another array int bin[] = new int[111]; int idx = 0; // run a loop of the size of string for (int i1 = 0; i1 < cu; i1++) { // get the ascii value at position // i1 from the first array int temp = arr[i1]; // run the second nested loop of same size // and set 0 value in the second array for (int j = 0; j < cu; j++) bin[j] = 0; idx = 0; // run a while for temp > 0 while (temp > 0) { // store the temp module // of 2 in the 2nd array bin[idx++] = temp % 2; temp = temp / 2; } String dig = ""; String temps; // run a loop of size 7 for (int j = 0; j < 7; j++) { // convert the integer to string temps = Integer.toString(bin[j]); // add the string using // concatenation function dig = dig.concat(temps); } String revs = ""; // reverse the string for (int j = dig.length() - 1; j >= 0; j--) { char ca = dig.charAt(j); revs = revs.concat(String.valueOf(ca)); } res = res.concat(revs); } // add the extra string to the binary code res = ini.concat(res); // return the encrypted code return res; } }
Decode.java: en esta clase, hemos creado una función de devolución que tomará un solo parámetro de una variable de string del código cifrado y devolverá un texto descifrado en forma de string.
Java
import android.util.Log; public class Decode { public static String decode(String s) { String invalid = "Invalid Code"; // create the same initial // string as in encode class String ini = "11111111"; Boolean flag = true; // run a loop of size 8 for (int i = 0; i < 8; i++) { // check if the initial value is same if (ini.charAt(i) != s.charAt(i)) { flag = false; break; } } String val = ""; // reverse the encrypted code for (int i = 8; i < s.length(); i++) { char ch = s.charAt(i); val = val.concat(String.valueOf(ch)); } // create a 2 dimensional array int arr[][] = new int[11101][8]; int ind1 = -1; int ind2 = 0; // run a loop of size of the encrypted code for (int i = 0; i < val.length(); i++) { // check if the position of the // string if divisible by 7 if (i % 7 == 0) { // start the value in other // column of the 2D array ind1++; ind2 = 0; char ch = val.charAt(i); arr[ind1][ind2] = ch - '0'; ind2++; } else { // otherwise store the value // in the same column char ch = val.charAt(i); arr[ind1][ind2] = ch - '0'; ind2++; } } // create an array int num[] = new int[11111]; int nind = 0; int tem = 0; int cu = 0; // run a loop of size of the column for (int i = 0; i <= ind1; i++) { cu = 0; tem = 0; // convert binary to decimal and add them // from each column and store in the array for (int j = 6; j >= 0; j--) { int tem1 = (int) Math.pow(2, cu); tem += (arr[i][j] * tem1); cu++; } num[nind++] = tem; } String ret = ""; char ch; // convert the decimal ascii number to its // char value and add them to form a decrypted // string using conception function for (int i = 0; i < nind; i++) { ch = (char) num[i]; ret = ret.concat(String.valueOf(ch)); } Log.e("dec", "text 11 - " + ret); // check if the encrypted code was // generated for this algorithm if (val.length() % 7 == 0 && flag == true) { // return the decrypted code return ret; } else { // otherwise return an invalid message return invalid; } } }
Paso 6: cree el diseño de cifrado
En el diseño de Cifrado, tendremos un TextView en la parte superior de la actividad para mostrar su título. A continuación, tendremos una Vista para crear una línea de margen. A continuación, habrá TextView y EditText para ingresar el texto que se cifrará. Debajo de eso tendremos un botón para cifrar el texto. Para mostrar el código encriptado tenemos otro TextView con un Botón para copiarlo. A continuación se muestra el código XML para el archivo activity_encoder.xml .
XML
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#0F9D58" android:orientation="vertical" tools:context=".Encoder"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="5dp" android:orientation="vertical"> <!--title of the activity--> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Encrypter" android:textColor="#FFFFFF" android:textSize="40sp" android:textStyle="bold" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="5dp" android:orientation="vertical"> <!--margin--> <View android:id="@+id/viewVar1" android:layout_width="wrap_content" android:layout_height="5dp" android:background="#000000" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="15dp" android:layout_marginTop="10dp" android:layout_marginRight="15dp" android:layout_marginBottom="80dp" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="left" android:layout_marginTop="5dp" android:text="Enter Your Text Here" android:textColor="#FFFFFF" android:textSize="20dp" android:textStyle="bold" /> <!--input text for encryption--> <EditText android:id="@+id/etVar1" android:layout_width="360dp" android:layout_height="60dp" android:layout_gravity="center" android:layout_marginTop="5dp" android:textColor="#FFFFFF" android:textSize="20sp" /> <!--start encryption--> <Button android:id="@+id/btVar1" android:layout_width="230dp" android:layout_height="wrap_content" android:layout_gravity="center" android:background="#000000" android:onClick="enc" android:text="Encrypt" android:textColor="#FFFFFF" android:textSize="20dp" android:textStyle="bold" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="15dp" android:orientation="vertical"> <!--margin--> <View android:id="@+id/viewVar2" android:layout_width="wrap_content" android:layout_height="5dp" android:background="#000000" /> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="15dp" android:layout_marginTop="5dp" android:layout_marginRight="15dp" android:orientation="vertical"> <!--display encrypted text here--> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="left" android:layout_marginTop="5dp" android:text="Your encrypted text here : " android:textColor="#FFFFFF" android:textSize="20dp" android:textStyle="bold" /> <TextView android:id="@+id/tvVar1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="left" android:layout_marginTop="5dp" android:textColor="#FAFAFA" android:textSize="20dp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="5dp" android:layout_marginLeft="15dp" android:layout_marginRight="15dp" android:orientation="vertical"> <!--button to copy encrypted code--> <Button android:id="@+id/btVar3" android:layout_width="230dp" android:layout_height="wrap_content" android:layout_gravity="center" android:background="#000000" android:onClick="cp2" android:text="Copy Text" android:textColor="#FFFFFF" android:textSize="20sp" android:textStyle="bold" /> </LinearLayout> </LinearLayout> </RelativeLayout>
Interfaz de usuario de salida:
Paso 7: crea el diseño de descifrado
En el diseño de Descifrado , tendremos un TextView en la parte superior de la actividad para mostrar su título. A continuación, tendremos una Vista para crear una línea de margen. A continuación, habrá TextView y EditText para ingresar el código cifrado que se va a descifrar. Debajo de eso tendremos un botón para descifrar el texto. Para mostrar el código descifrado tenemos otro TextView con un Botón para copiarlo. A continuación se muestra el código XML para el archivo activity_decoder.xml .
XML
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#0F9D58" android:orientation="vertical" tools:context=".Decoder"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:orientation="vertical"> <!--Textview to display title of the activity--> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Decrypter" android:textColor="#FFFFFF" android:textSize="40dp" android:textStyle="bold" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_margin="5dp" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="5dp" android:orientation="vertical"> <!--view to create margin--> <View android:id="@+id/viewVar1" android:layout_width="wrap_content" android:layout_height="5dp" android:background="#000000" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="15dp" android:layout_marginTop="10dp" android:layout_marginRight="15dp" android:layout_marginBottom="50dp" android:orientation="vertical"> <!--enter the code to be decrypted here--> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="left" android:layout_marginTop="5dp" android:text="Enter Your Text Here" android:textColor="#FFFFFF" android:textSize="20sp" android:textStyle="bold" /> <EditText android:id="@+id/etVar1" android:layout_width="360dp" android:layout_height="60dp" android:layout_gravity="center" android:layout_marginTop="5dp" android:textColor="#FFFFFF" android:textSize="20sp" /> <!--button to decrypt the code--> <Button android:id="@+id/btVar1" android:layout_width="230dp" android:layout_height="wrap_content" android:layout_gravity="center" android:background="#000000" android:onClick="dec" android:text="Decrypt" android:textColor="#FFFFFF" android:textSize="20sp" android:textStyle="bold" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="15dp" android:orientation="vertical"> <!--view to create margin--> <View android:id="@+id/viewVar2" android:layout_width="wrap_content" android:layout_height="5dp" android:background="#000000" /> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="15dp" android:layout_marginTop="5dp" android:layout_marginRight="15dp" android:orientation="vertical"> <!--display the decrypted text here--> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="left" android:layout_marginTop="5dp" android:text="Your decrypted text is here : " android:textColor="#FFFFFF" android:textSize="20sp" /> <TextView android:id="@+id/tvVar2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="left" android:layout_marginTop="5dp" android:textColor="#FFFFFF" android:textSize="20sp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="15dp" android:layout_marginTop="5dp" android:layout_marginRight="15dp" android:orientation="vertical"> <!--button to copy the decrypted text--> <Button android:id="@+id/btVar2" android:layout_width="230dp" android:layout_height="wrap_content" android:layout_gravity="center" android:background="#000000" android:onClick="cpl" android:text="Copy Text" android:textColor="#FFFFFF" android:textSize="20sp" android:textStyle="bold" /> </LinearLayout> </LinearLayout> </RelativeLayout>
Interfaz de usuario de salida:
Paso 8: trabajar con el archivo Encoder.java
En el archivo Encoder.java , llamaremos a la función que creamos en el archivo del Paso 5 ( Encode.java) . Primero, obtendremos la string de EditText y luego pasaremos el valor en la función de codificación. Eso nos devolverá el código encriptado de la string. Después de eso, estableceremos el código en TextView y, si no está vacío, permitiremos que el usuario copie el código en el portapapeles. Para realizar la función de cifrado , se utiliza el método onClick en el botón. Del mismo modo, también hemos configurado la función onClick() para copiar el código en el portapapeles del botón. A continuación se muestra el código para el Encoder.javaexpediente. Se agregan comentarios dentro del código para comprender el código con más detalle.
Java
import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; public class Encoder extends AppCompatActivity { EditText etenc; TextView enctv; ClipboardManager cpb; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_encoder); // link the edittext and textview with its id etenc = findViewById(R.id.etVar1); enctv = findViewById(R.id.tvVar1); // create a clipboard manager variable to copy text cpb = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); } // onClick function of encrypt button public void enc(View view) { // get text from edittext String temp = etenc.getText().toString(); // pass the string to the encryption // algorithm and get the encrypted code String rv = Encode.encode(temp); // set the code to the edit text enctv.setText(rv); } // onClick function of copy text button public void cp2(View view) { // get the string from the textview and trim all spaces String data = enctv.getText().toString().trim(); // check if the textview is not empty if (!data.isEmpty()) { // copy the text in the clip board ClipData temp = ClipData.newPlainText("text", data); cpb.setPrimaryClip(temp); // display message that the text has been copied Toast.makeText(this, "Copied", Toast.LENGTH_SHORT).show(); } } }
Paso 9: trabajar con el archivo Decoder.java
En el archivo Decoder.java , llamaremos a la función que creamos en el archivo del Paso 5 (Decode.java) . Primero, obtendremos el código encriptado de EditText y luego pasaremos el valor en la función de decodificación. Eso nos devolverá el texto descifrado de la string. Después de eso, estableceremos el texto en TextView y, si no está vacío, permitiremos que el usuario copie el código en el portapapeles. Para realizar la función de descifrado , se utiliza el método onClick() en el botón. Del mismo modo, también hemos configurado la función onClick() para copiar el código en el portapapeles del botón. A continuación se muestra el código para el Decoder.javaexpediente. Se agregan comentarios dentro del código para comprender el código con más detalle.
Java
import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; public class Decoder extends AppCompatActivity { EditText etdec; TextView dectv; ClipboardManager cplboard; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_decoder); // link the edittext and textview with its id etdec = findViewById(R.id.etVar1); dectv = findViewById(R.id.tvVar2); // create a clipboard manager variable to copy text cplboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); } // onClick function of encrypt button public void dec(View view) { // get code from edittext String temp = etdec.getText().toString(); Log.e("dec", "text - " + temp); // pass the string to the decryption algorithm // and get the decrypted text String rv = Decode.decode(temp); // set the text to the edit text for display dectv.setText(rv); Log.e("dec", "text - " + rv); } // onClick function of copy text button public void cpl(View view) { // get the string from the textview and trim all spaces String data = dectv.getText().toString().trim(); // check if the textview is not empty if (!data.isEmpty()) { // copy the text in the clip board ClipData temp = ClipData.newPlainText("text", data); // display message that the text has been copied Toast.makeText(this, "Copied", Toast.LENGTH_SHORT).show(); } } }
Producción:
Publicación traducida automáticamente
Artículo escrito por namanjha10 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA