Colección de citas famosas - Colección de consignas - Principios algorítmicos para cifrar y descifrar cadenas

Principios algorítmicos para cifrar y descifrar cadenas

A menudo necesitamos una medida para proteger nuestros datos de ser vistos o destruidos por alguien con intenciones maliciosas. En la era de la información, la información puede ayudar a grupos o individuos y beneficiarlos. Asimismo, la información puede utilizarse para plantear amenazas y causarles daño. En las empresas grandes y competitivas, el espionaje industrial a menudo obtiene información de los demás. Por lo tanto, objetivamente se necesita una fuerte medida de seguridad para proteger los datos confidenciales contra el robo o la manipulación. El cifrado y descifrado de datos es muy simple y fácil de entender desde una perspectiva macro. Algunos métodos de cifrado y descifrado son muy sencillos y fáciles de dominar, lo que facilita cifrar y descifrar datos confidenciales.

1: Métodos de cifrado de datos

Tradicionalmente, tenemos varios métodos para cifrar flujos de datos. Estos métodos se pueden implementar fácilmente en software, pero cuando solo conocemos el texto cifrado, no es fácil descifrar estos algoritmos de cifrado (cuando hay texto original y texto cifrado, no es fácil descifrar el algoritmo de cifrado. Pero ya está bien ). Los mejores algoritmos de cifrado tienen poco impacto en el rendimiento del sistema y aportan otras ventajas inherentes. Por ejemplo, todos conocemos pkzip, que comprime datos cifrados. Otro ejemplo es que algunos paquetes de software dbms siempre incluyen algunos métodos de cifrado, lo que invalida la función de copiar archivos para algunos datos confidenciales o requiere la contraseña del usuario. Todos estos algoritmos de cifrado deben tener capacidades de cifrado y descifrado eficientes.

Afortunadamente, entre todos los algoritmos de cifrado, el más simple es el algoritmo de "tabla de reemplazo", que también puede satisfacer las necesidades de cifrado. Cada segmento de datos (siempre un byte) corresponde a un desplazamiento en la "tabla de reemplazo" y el valor correspondiente al desplazamiento se genera como un archivo cifrado. Tanto los programas de cifrado como los de descifrado requieren este tipo de "tablas de reemplazo". De hecho, la serie de CPU 80x86 tiene una instrucción "XLAT" a nivel de hardware para realizar tal trabajo. Este algoritmo de cifrado es relativamente simple y la velocidad de cifrado y descifrado es muy rápida. Sin embargo, una vez que la otra parte obtenga la "tabla de reemplazo", este esquema de cifrado se entenderá por completo. Además, este algoritmo de cifrado es muy sencillo para los piratas informáticos, siempre que encuentren una "tabla de reemplazo". Este método se usaba ampliamente antes de la llegada de las computadoras.

Una mejora en este enfoque de "tabla de permutación" es utilizar dos o más "tablas de permutación", ambas basadas en posiciones de bytes en el flujo de datos o en el flujo de datos mismo. En este punto, la decodificación se vuelve más difícil porque el hacker tiene que realizar varias transformaciones correctamente. Este método de cifrado mejorado se vuelve más difícil de descifrar al utilizar más "tablas de permutación" y utilizar cada tabla de forma pseudoaleatoria. Por ejemplo, podemos usar la tabla A para todos los datos pares y la tabla B para todos los datos impares. Incluso si un pirata informático obtiene el texto sin formato y el texto cifrado, le resultará difícil descifrar este esquema de cifrado a menos que sepa exactamente que se utilizan dos tablas.

De manera similar al uso de "tablas de reemplazo", la "ubicación de datos transformados" también se utiliza en el cifrado de computadoras. Sin embargo, esto requiere más tiempo de ejecución. Lea el texto sin formato de la entrada en un búfer, luego reordenelos en el búfer y envíelos en ese orden. El programa de descifrado recupera los datos en orden inverso. Este método siempre se combina con algún otro algoritmo de cifrado, lo que hace que el descifrado sea extremadamente difícil y casi imposible. Por ejemplo, hay una palabra que se puede cambiar a escuchar cambiando el orden de las letras, pero no todas las letras cambian, ni aumentan ni disminuyen, pero sí cambia el orden entre las letras.

Pero hay un algoritmo de cifrado mejor que sólo las computadoras pueden hacer, y es el desplazamiento circular palabra/byte y la operación XOR. Si desplazamos circularmente una palabra o un byte en el flujo de datos y utilizamos direcciones múltiples o variables (izquierda o derecha), podemos generar rápidamente un flujo de datos cifrados. ¡Este método es genial y más difícil de descifrar! Y, además, si utilizamos operaciones XOR, haciendo las operaciones XOR poco a poco, hará que la contraseña sea más difícil de descifrar. Si volvemos a utilizar un método pseudoaleatorio, que implica generar una serie de números, podemos utilizar la secuencia de Fibonacci. Realizar una operación de módulo (como módulo 3) en los números generados por la secuencia para obtener un resultado y luego cambiar circularmente el resultado varias veces hará que sea casi imposible decodificar el cifrado secundario. Sin embargo, es muy fácil para nuestro programa de descifrado generar contraseñas utilizando el método pseudoaleatorio de las secuencias de Fibonacci.

En algunos casos, queremos saber si los datos han sido manipulados o dañados, por lo que necesitamos generar algunas sumas de verificación e insertarlas en el flujo de datos. Hacerlo es bueno tanto para la seguridad de los datos como para el programa en sí. Pero a los virus que infectan programas informáticos no les importa si los datos o los programas están cifrados o firmados digitalmente. Por lo tanto, cada vez que el programa de cifrado se carga en la memoria y comienza a ejecutarse, se debe verificar si está infectado por un virus. ¡Esta verificación se debe realizar en los archivos que deben cifrarse y descifrarse! Naturalmente, un sistema de este tipo debe mantenerse en secreto, porque los creadores de programas de virus lo utilizarán para destruir los programas o datos de otras personas. Por lo tanto, se debe utilizar tecnología de cifrado en algún antivirus o software antivirus.

La verificación de redundancia cíclica es un método típico de verificación de datos. Para cada bloque de datos, utiliza rotación de bits y operaciones XOR para generar una suma de verificación de 16 o 32 bits, de modo que la falta de uno o dos bits definitivamente resultará en un error de suma de verificación. Este método se ha utilizado durante mucho tiempo para la transferencia de archivos, como xmodem-crc. Este enfoque se ha convertido en un estándar y está bien documentado. Sin embargo, los algoritmos mejorados basados ​​en el algoritmo CRC estándar son muy eficaces para encontrar errores en bloques de datos cifrados y determinar si los archivos están infectados por virus.

2. Algoritmo de cifrado basado en clave pública

Una característica importante de un buen algoritmo de cifrado es su capacidad para especificar una contraseña o clave y utilizarla para cifrar texto sin formato. Diferentes contraseñas o claves producen diferentes textos cifrados. Esto se divide en dos métodos: algoritmo de clave simétrica y algoritmo de clave asimétrica. El llamado algoritmo de clave simétrica significa que se usa la misma clave para cifrar y descifrar, mientras que el algoritmo de clave asimétrica significa que se usan claves diferentes para cifrar y descifrar. Los famosos métodos de cifrado de clave pública pgp y rsa son algoritmos de cifrado asimétricos. La clave de cifrado (clave pública) es muy diferente de la clave de descifrado (clave privada). Matemáticamente hablando, existen pocos algoritmos que sean verdaderamente irreversibles. Por ejemplo, si se realiza una operación en la entrada 'a' y el resultado es 'b', entonces podemos realizar la operación correspondiente basada en 'b' y derivar la entrada 'a'. En algunos casos, podemos obtener cada operación para un valor determinado, o la operación no está definida (por ejemplo, el divisor es 0). Para operaciones no definidas, según el algoritmo de cifrado, es posible evitar con éxito que la clave pública se convierta en una clave privada. Por lo tanto, la única forma de descifrar un algoritmo de cifrado asimétrico y encontrar una clave única es por prueba y error, lo que requiere mucho tiempo de procesamiento.

El algoritmo de cifrado Rsa utiliza dos números primos muy grandes para generar claves públicas y privadas. Incluso si es posible obtener una clave privada a partir de una clave pública mediante factoring, la cantidad de cálculo involucrada en tal operación es tan grande que en la realidad no es factible. El algoritmo de cifrado en sí es muy lento, lo que hace inviable cifrar grandes cantidades de datos utilizando el algoritmo RSA. Esto crea algunos algoritmos de cifrado reales basados ​​en el algoritmo de cifrado RSA. El algoritmo PGP (y la mayoría de los métodos de cifrado basados ​​​​en el algoritmo RSA) utilizan la clave pública para cifrar la clave de un algoritmo de cifrado simétrico y luego utilizan un algoritmo de cifrado simétrico rápido para cifrar los datos. La clave de este algoritmo simétrico se genera aleatoriamente y se mantiene confidencial. Por tanto, la única forma de obtener esta clave es descifrarla utilizando la clave privada.

Tomemos un ejemplo: supongamos que queremos cifrar algunos datos ahora, usando la clave '12345'. Utilice la clave pública RSA, cifre la clave '12345' usando el algoritmo RSA y colóquela delante de los datos a cifrar (puede ir seguida de un delimitador o longitud de archivo para distinguir los datos y la clave). Luego, el texto se cifra mediante un algoritmo de cifrado simétrico utilizando la clave "12345". Cuando la otra parte lo recibe, el programa de descifrado encuentra la clave de cifrado, la descifra con la clave privada rsa, luego determina la posición inicial de los datos y los descifra con la clave '12345'. De esta manera, los datos cifrados se pueden transmitir y descifrar de forma segura, fiable y eficiente.

Algunos algoritmos de cifrado simples basados ​​en el algoritmo rsa se pueden encontrar en el siguiente sitio:

ftp://ftp.funet.fi/pub/crypt/cryptography/ametric/rsa

3. Un nuevo algoritmo de cifrado de varios pasos

Ahora hay un nuevo algoritmo de cifrado, que se dice que es casi imposible de descifrar.

Este algoritmo se anunció oficialmente en junio de 1998. El algoritmo se describe en detalle a continuación:

Utiliza una secuencia de números (como una clave de 128 bits) para generar una secuencia repetible pero altamente aleatoria de números pseudoaleatorios. Usando 256 entradas a la vez, genere una tabla de conversión de contraseñas con una secuencia de números aleatorios, como se muestra a continuación:

Coloque los 256 números aleatorios en una matriz y luego ordénelos, usando la posición inicial en tal manera (Tenemos que recordar la posición inicial) para generar una tabla, que se ordena aleatoriamente. Los números de la tabla están entre 0 y 255. Si no sabes cómo hacerlo, puedes dejarlo en paz. Sin embargo, también se proporciona algo de código original a continuación (a continuación) para que podamos entender cómo hacerlo. Ahora se ha generado una tabla específica de 256 bytes. Luego deja que este generador de números aleatorios genere el resto de los números de esta tabla para que cada tabla sea diferente. A continuación, se utiliza una técnica de "escopeta" para generar la tabla de decodificación. Básicamente, si A se asigna a B, entonces B debe asignarse a A, por lo que b[a[n]] = n (n es un número entre 0 y 255). Asigne en un bucle, utilizando una tabla de decodificación de 256 bytes, que corresponde a la tabla de cifrado de 256 bytes que acabamos de generar en el paso anterior.

Es posible generar una tabla de este tipo utilizando este método, y el orden de la tabla es aleatorio, por lo que el número aleatorio de 256 bytes se genera utilizando pseudoaleatoriedad secundaria y se generan dos números de 16 bits. contraseña utilizada. Ahora hay dos tablas de traducción y el cifrado y descifrado básicos funcionan de la siguiente manera. El byte anterior de texto cifrado es el índice de esta tabla de 256 bytes. Alternativamente, para mejorar el cifrado, se pueden usar 8 bits de valor adicionales, o incluso se puede usar una suma de verificación o un algoritmo crc para generar el byte de índice. Suponiendo que esta tabla es una matriz de 256*256, se verá así:

crypto1 = a [crypto 0][valor]

La variable "crypto1" son los datos cifrados, "crypto0" son los datos previamente cifrados (o el valor de función de los datos previamente cifrados). Naturalmente, el primer dato requiere una "semilla", que debemos recordar. Si se utiliza una tabla de 256*256, esto aumentará la longitud del texto cifrado. Alternativamente, puede usar la contraseña que utilizó para generar la secuencia de números aleatorios o su suma de verificación crc. Por cierto, hice una prueba: utilicé 16 bytes para generar el índice de la tabla y utilicé la clave de 128 bits como "semilla" inicial de estos 16 bytes. Luego, una vez generada la tabla de estos números aleatorios, se puede utilizar para cifrar datos a una velocidad de 100 kbytes por segundo. Al cifrar y descifrar, el valor cifrado debe usarse como índice de la tabla y los dos tiempos deben coincidir.

La secuencia pseudoaleatoria generada durante el proceso de cifrado es muy aleatoria y puede diseñarse en cualquier secuencia deseada. Sin información detallada sobre esta secuencia aleatoria, descifrar el texto cifrado no es realista. Por ejemplo, algunas secuencias de códigos ASCII, como "eeeeeeee", pueden convertirse en códigos aleatorios sin sentido. Cada byte depende del texto cifrado de su byte anterior, en lugar del valor real. Para esta conversión de cualquier carácter, se oculta la longitud real efectiva de los datos cifrados.

Si realmente no entiendes cómo generar una secuencia de números aleatorios, puedes considerar la secuencia de Fibbonacci, usando dos números de palabras dobles (64 bits) como semillas para generar números aleatorios y agregando un tercero. palabra doble para realizar la operación XOR. Este algoritmo genera una serie de números aleatorios.

El algoritmo es el siguiente:

Entero largo sin signo tipo dw1, dw2, dw3, dwmask

int I 1;

Entero largo sin signo tipo arandom[256]

dw 1 = { semilla # 1 };

dw2 = { semilla # 2 }

dw máscara = { semilla # 3 }; p >

//Esto te da 3 "semillas" de 32 bits, o 96 bits en total

for(I 1 = 0;I 1 lt;256;i1)

{

dw3 =(dw 1 dw2)^ dw máscara;

arandom[I 1]= dw3;

dw 1 = dw2;

p>

dw2 = dw3

}

Si desea generar un rango de números aleatorios, por ejemplo, algún número entre 0 y todos los números aleatorios números en la lista, puede utilizar los siguientes métodos:

int _ _ cdecl mysortproc(void * p 1, void *p2)

{

Unsigned long **pp1 =( Sin firmar largo * *)p 1;

Sin firmar largo **pp2 = (Sin firmar largo * *)p2;

if(* * PP 1 lt; * *Página 2)

return(-1);

else if(* * PP 1 gt; *Página 2)

return(1);

return(0);

}

...

int I 1;

Long sin firmar * arandom[256];

Unsigned long arandom[256]; //La misma matriz que antes, en este caso

int result[256] //Muestra el resultado aquí

for(I 1 = 0; I 1 lt; 256; i1)

{

aprandom[ I 1]= arandom I 1;

}

//Ordenar ahora

qsort(aprandom, 256, sizeof(*aprandom), mysortproc);

//El último paso - coloque el desplazamiento del puntero en la matriz de salida

for(I 1 = 0; I 1 lt; 256; i1)

{

un resultado[ I 1]=(int)(aprandom[I 1]-arandom);

}

...

El valor en la variable "aresultado" debe ser una matriz ordenada que consta únicamente de una serie de números enteros, con valores enteros que oscilan entre 0 y 255. Una matriz de este tipo es útil, por ejemplo, para que una tabla de traducción de byte a byte genere de manera fácil y confiable una clave corta (generalmente como semilla para algunos números aleatorios). Existen otros usos para este tipo de tablas, como generar un carácter aleatorio, una posición aleatoria de un objeto en un juego de computadora, etc. El ejemplo anterior no constituye un algoritmo de cifrado en sí mismo, sino sólo una parte del algoritmo de cifrado.

A modo de prueba, se desarrolló una aplicación para probar el algoritmo de cifrado anterior. El programa en sí también ha sido optimizado y modificado muchas veces para mejorar la verdadera aleatoriedad de los números aleatorios y evitar la generación de algunos números aleatorios breves y repetibles para el cifrado. Si utiliza este programa para cifrar un archivo, descifrarlo puede llevar tanto tiempo que en realidad es imposible.

Cuatro.

Conclusión:

Porque en la vida real, debemos asegurarnos de que algunos datos confidenciales solo puedan ser vistos por personas con los permisos correspondientes y también garantizar que la información no sea manipulada ni interceptada durante la transmisión, lo que requiere Muchos de nuestros sistemas de seguridad se utilizan ampliamente en gobiernos, grandes empresas y sistemas personales. Por supuesto, el cifrado de datos se puede descifrar, pero lo que queremos es seguridad durante un período específico, lo que significa que debe ser bastante difícil descifrar el texto cifrado. En realidad, esto es imposible, especialmente en un corto período de tiempo.