algorithm - sencillos - tipos de cifrados
Forma de cifrar una sola int (10)
Eche un vistazo a: proyecto github.com/msotoodeh/integer-encoder. Admite números enteros de 32 y 64 bits.
¿Cómo se puede encriptar de manera económica y bidireccional un int de 32 bits, de modo que cada número se correlaciona con algún otro int en ese espacio y viceversa de una manera difícil de predecir?
Y no requiere pre-almacenamiento de 4.29 mil millones de ints en una tabla de mapeo, por supuesto.
Hay dos operaciones simples y reversibles que puede usar para codificar un valor entero. Puede usar la operación xor, y puede intercambiar bits en el número.
Si usa ambos, entonces no será tan trivial descubrir el método utilizado. De alguna manera se protegerán el uno al otro.
Lo que quiere es un cifrado de bloque de 32 bits. Desafortunadamente, la mayoría de las cifras de bloque son de 64 bits o más debido a las debilidades de un tamaño de bloque corto . Si puede manejar el int encriptado el doble de grande que la entrada, entonces puede usar Blowfish, TDES o cualquier otro cifrado de bloque de 64 bits bien revisado.
Si realmente necesita 32 bits y no le importa la disminución de la seguridad, entonces es bastante fácil recortar un cifrado de red Feistel como Blowfish a cualquier longitud de bloque que sea un múltiplo de 2 y menor que el cifrado inicial. Para Blowfish , solo divide el número de entrada de manera uniforme entre los dos medios bloques, y recorta la salida de la función F y los valores P hasta la mitad del tamaño del bloque objetivo. Todo esto se puede hacer después de teclear el algoritmo como de costumbre.
Obviamente, necesitas algún tipo de clave aleatoria para que sea segura. En ese caso:
int original = 42;
int key = give_me_a_random_int();
int encrypted = original ^ key;
int unencrypted = encrypted ^ key;
// now, unencrypted == original == 42
Esto es solo un simple XOR. XORing nuevamente revertirá este proceso.
Además, debo tener en cuenta que esto solo es seguro para un solo uso. Se llama la almohadilla de una sola vez . Si usa la misma clave dos veces en datos no aleatorios, es posible que un atacante la descifre.
Si todo lo que quiere es algo realmente simple que el usuario promedio no notará, utilice una serie de XOR y operadores de turno.
El problema de no usar una matriz para almacenar los 4 mil millones de INTs es que se necesita una función que realice un mapa aleatorio de uno a uno en un dominio de 4 mil millones de INT. Puedes mezclar varios XOR y operadores de desplazamiento para crear los tuyos, pero no será difícil descifrarlos. Incluso si hubiera un conocido mapa de uno a uno, también fallaría. Sin una sal, alguien podría generar una simple tabla de arcoiris para romperla.
El problema con una sal en la comunicación bidireccional es que tienes que comunicarlo de forma segura. Las sales deben ser secretas y una vez que sepas cuáles son, no tienen sentido.
Si desea configurar un canal de comunicación seguro, consulte el Protocolo de mensajería fuera de registro versión 2 . Le dará un ejemplo de cómo se puede convertir el cifrado de comunicación complejo. Sugeriría que encuentres algo bien conocido que alguien más ya haya creado y probado. Incluso si usa algo que alguien más ha creado si lo usa incorrectamente, fallará.
Solía usar XOR + ADD con una clave secreta de 64 bits. También solía cambiar la clave cada par de minutos y tratar de descifrar con la clave actual o anterior. (En mi dominio, el número entero no necesita ser seguro durante más de cuatro minutos).
Tome su entrada de 32 bits, córtela en dos mitades de 16 bits L y R, luego repita los siguientes pasos: calcule una función pseudoaleatoria de R, xo el resultado de esta función pseudoaleatoria a L e intercambie L y R. Este es un Construcción Rackoff . La función pseudoaleatoria no necesita ser invertible. De modo que podría, por ejemplo, tomar un cifrado de bloques, cifrar 16 bits y cortar el resultado a 16 bits. Asegúrese de que no todas las rondas usen la misma función pseudoaleatoria (rsp. Use diferentes teclas redondas).
Una forma es XOR con un número secreto de 32 bits. Cuando vuelva a XOR con este número secreto, volverá al número original. Esto es rápido pero no muy seguro. Si se necesita un método seguro, me gustaría ver otros métodos aquí también.
Use un algoritmo estándar y un pad aleatorio (suponiendo que el texto cifrado no necesita tener la misma longitud que el texto del plano).
Así que, básicamente, use un algoritmo estándar que usa encadenamiento y conecte cuatro números aleatorios de 32 bits delante de él. Eso debería ayudar a disfrazar cualquier regularidad / redundancia en su mensaje de 32 bits. Infierno, almohadilla al final también, si te agrada.
Básicamente, cuanto menos escribas, mejor estás. Todo el mundo atornilla esto.
Use un cifrado de bloque de 32 bits, skip32 es el único que encontré: http://www.qualcomm.com.au/PublicationsDocs/skip32.c