One Time Pad Cipher Binary Options
De cifrado codificación cifra Vernam (una almohadilla de tiempo) El cifrado vernam, a veces conocido como el pad de una sola vez, es una cifra de flujo, que cumpliendo con ciertos requisitos, pueden ser teóricamente irrompible. Utiliza una clave elegida al azar, que es XORd un bit a la vez con el texto sin formato. Si la clave utilizada es la misma longitud que el mensaje y no contiene redundancia (es decir, repetición), cualquier persona que intente romperla sólo puede adivinar la clave que podría haber sido utilizada, cualquiera de un número potencialmente masivo de cadenas binarias. Por ejemplo, digamos que teníamos un mensaje que tenía 100 caracteres. Suponiendo que fue codificado ascii, cada carácter ocuparía un byte, u ocho bits. Esto nos da un mensaje de 800 bits por lo tanto, la clave también debe ser de 800 bits de largo. Las posibles permutaciones en una cadena binaria de longitud 4 es 2x2x2x2 (16). Para calcular las permutaciones posibles de una cadena binaria de longitud 800, wed tiene que hacer 2x2x2x2x2x2x2x2x2x2x2. Y seguir adelante hasta llegar a 800. Para decir que es un número bastante sizaable es un eufemismo - y thats sólo en un mensaje de 100 caracteres de largo. No es 2 caracteres de longitud - 16 bits. Eso nos daría 131072 posibles cadenas binarias. Incluso con un mensaje tan corto, buena suerte adivinando la clave En la demo. Puede usar el siguiente formulario para probarlo por usted mismo. Introduzca una frase clave y el mensaje en el área de texto. El md5 de la frase clave se utiliza como la semilla en un LFSR, para asegurar una clave de longitud adecuada se puede generar. La clave generada se muestra al final. El texto cifrado no se puede mostrar en ASCII - contendría valores que no están en el hex de la tabla ASCII y se mostrarán representaciones binarias. Para descifrar, copie el texto cifrado hexadecimal en el cuadro de entrada, vuelva a introducir la clave y seleccione descifrar. Al hacer clic en enviar, se generará la misma clave y se descifrará el mensaje. Copia De-Coded - David Wilshaw, estudiante de computación forense seguro de la Universidad de Huddersfield. Email - davidde-codedNecesita un método seguro para cifrar archivos Quieres que sea rápido, fácil e irrompible, siempre y cuando tengas cuidado con él Esta es la herramienta para ti Para obtener información sobre la técnica y las herramientas, te sugiero que vayas a Unbreakable Cifrado con almohadillas de una sola vez (irrompible). Las herramientas que tengo aquí son modeladas después de las diseñadas allí, pero el trabajo de la mina en DOS y no requieren. NET. Si tienes. NET, sugiero no usar mis herramientas y usar Unbreakables en su lugar. Por lo menos utilice Unbreakables programa padgen - Estoy bastante seguro de que genera mejores números al azar que el mío hace. Estas herramientas también funcionan en Linux, para personas como yo. Generación de un bloqueo de tiempo Únicamente como en el sitio Irrompible, se utiliza la siguiente sintaxis: padgen padfilename padfilesize En lugar de utilizar el generador de números aleatorios y en lugar de compilar su propio programa, puede generar un archivo pad desde archivos de entrada. Los buenos candidatos para datos aleatorios de archivos de entrada son archivos comprimidos, archivos de vídeo y audio, archivos. jpg grandes, programas ejecutables y otras fuentes binarias de datos. Sin embargo, puede utilizar archivos de texto si lo desea, pero no se sugiere. Para generar un pad aleatorio a partir de archivos de entrada, utilice el programa padfile: padfile padfilename inputfile1 inputfile2 inputfile3. Usted no necesita especificar más de un archivo de entrada, pero se le permite (no tiene los símbolos y alrededor de sus nombres de archivo). Padfile generará un archivo pad que es sólo un poco más pequeño que la mitad del tamaño de los archivos de entrada. Planificar en consecuencia. Es bueno tener un archivo de pad más grande que el archivo que desea cifrar, pero no 100 necesarios para estas herramientas. Cifrado y descifrado Esta herramienta es similar a la del sitio Irrompible, pero decidí hacer algunos parámetros para ello. Opciones de padgen archivo de entrada archivo de pad archivo de salida Opciones: - s byte. Comience a usar el archivo de pad en el byte especificado - l. Bucle del archivo de pad cuando está fuera de los datos - b. Muestra el byte que se utilizó por última vez en el fichero pad - r. Inicia un byte aleatorio en el archivo de pad - x num. XOR todo con el número (0 a 255) - i. Incremento - x al usar - l Muchas de estas opciones son una IDEA MALA, pero las incluí porque eran divertidas de jugar con .. - s byte Esto comenzará a usar el padfile en el byte especificado. Esto es bueno si usted envía un padfile grande a alguien, después usted desea enviar archivos encriptados minúsculos adelante y hacia atrás. Puede utilizar una sección del archivo de pad para cada archivo que envíe. - l Encierra el archivo de pad cuando lo usas. Normalmente, el programa padxor dejará de ejecutarse si se queda sin bytes para codificar un archivo con. Looping le permitirá utilizar un archivo de 1 meg para cifrar un archivo de 10 meg, pero hacerlo es malo para la seguridad. Si usted es ultra-paranoico, no utilice esto. Si sólo trata de esconder un archivo grande de miradas indiscretas (padres, compañeros de trabajo, hijos), entonces puede pegar su clave en algún tipo de medios removibles y cifrar los archivos con una clave más pequeña y simplemente mantener el bucle a través de él. - b Imprime cuál fue el último byte utilizado en el cifrado / decripción. Para el totalmente paranoico, entonces usar - s para comenzar en el último byte utilizado 1. - r Comenzar en un byte aleatorio en un archivo de pad. Vea la sección Funky Ideas abajo. - x núm Cifre el resultado una vez más con otro xor estático. Vea la sección Funky Ideas abajo. - i Cambiar el valor - x cada vez que se realiza un bucle a través del archivo de claves. Vea la sección Funky Ideas abajo. Ejemplo Este ejemplo está diseñado para ser igual que el de Unbreakable, pero para mis herramientas. O, si usted quería usar una llave pre-generada grande, comience en el medio de la línea de comandos, haga clic en El archivo y obtener el byte que utilizó por última vez en el archivo codificado, utilice algo como: padxor - s 12047 - b otp. cs mypad. bin otp. cs. enc padxor - s 12047 - b otp. cs mypad. bin otp. cs. enc Eliminación segura de la almohadilla de un solo paso La herramienta de borrado sólo escribe datos aleatorios una y otra y otra vez en el archivo. Esto puede no funcionar, dependiendo del sistema de archivos: algunos sistemas de archivos se registran en diario, por lo que los datos antiguos no se sobreescriben realmente en el disco. Sin embargo, para DOS, esto funcionaría bien. Generación de almohadillas alternativas Puesto que padgen utiliza la función rand (), y que se ha comprobado que no es una buena fuente para datos aleatorios, es posible que desee editar el programa y utilizar un generador de números aleatorios diferente. Si utiliza. NET, sugeriría el programa padgen del sitio Unbreakables. Si no lo hace, hay muchas otras maneras de obtener una almohadilla aleatoria de un tiempo, como el programa que está en el sitio One Time Pad (consulte la sección Enlaces). Si utiliza Linux, sólo puede usar dd para crear un archivo de 1 meg (1024 bytes por leer 1024 lecturas): dd si / dev / random ofmypad. bin bs1024 count1024 Hay otras herramientas y sitios web que le darán datos estadísticamente aleatorios. Para asegurarse de que usted se sienta seguro con su archivo clave, puede utilizar el programa padtest para ver cuán aleatorio es el dato. Las entrañas de este programa son en realidad desde el programa One Time Pad (ver la sección de Enlaces). Sólo incluye las pruebas estadísticas que el programa otp. c contiene - no el resto de las cosas. Tenga en cuenta que ningún programa puede verificar que los datos son aleatorios - sólo puede probar ciertas cosas que indican la no aleatoriedad. Además, las pruebas en padtest no son las mejores - son sólo pequeñas pruebas rápidas. Un mejor probador está disponible en la sección Enlaces. Si no decide cambiar la función de generación de números aleatorios de rand () en padgen, podría ser vulnerable. Si una persona utiliza herramientas especiales que están diseñadas para encontrar su llave, usted está en problemas. Si el cracker puede averiguar los primeros cuatro bytes de la clave de la cabecera del archivo, la semilla srand se puede encontrar con findpad. Luego, si conoce la longitud del archivo de claves, padseed hará un pad con la semilla especificada. No es bueno para la seguridad, pero bueno para la seguridad simple de la que puede recuperarse. Padfile es una solución mucho mejor que padgen. Heck, generar cientos de archivos pad y sólo padxor juntos para crear un buen archivo pad. Si xor dos fuentes de datos aleatorios, el resultado será datos aleatorios que son tan buenos como la mejor fuente. Por lo tanto, si usted tiene muchos programas diferentes generar archivos de pad para usted y usted xor juntos, la fuerza del archivo resultante será tan fuerte, poco a poco, como la mejor fuente de datos. Funky ideas Esto no es una buena seguridad. Estas cosas fueron implementadas para hacer la recuperación de los datos por un visitante aleatorio imposible, pero la NSA se reiría de lo que hacemos aquí. Hay una situación en la que necesitamos un archivo zip codificado con una clave. La clave no se puede cambiar y será menor que el archivo zip, por lo que necesitamos usar - l para realizar un bucle a través del archivo de clave. Esto funciona muy bien para mantenerlo fuera de vista casual y daría cualquier problema de hacker debido al tamaño del archivo de clave y que estamos tratando de decodificar un archivo zip. Sin embargo, si la clave se filtró, sería trivial decodificar el archivo zip, por lo que mediante el uso de - r, se hace un poco más difícil. El archivo zip ahora está cifrado con la clave, pero en uno de un millón de puntos de partida. Esto probablemente daría al hacker una molestia para un poco. La desventaja (y la parte que hace que la recuperación del archivo zip con la clave posible) es que los archivos zip tienen un encabezado de 4 bytes al principio del archivo. El hacker podría descifrar el encabezado de 4 bytes con cada uno de los millones de lugares iniciales, anotar los que tienen el encabezado correcto y probarlos manualmente. Por lo tanto, el número de posibles lugares de inicio en la clave está limitado a tal vez 10 en pocos segundos de la decodificación. Por lo tanto, ahora usando las opciones - x y maybe - i, y usando un número aleatorio para - x (no codificado en padxor), cualquier punto en el archivo podría ser un punto de partida potencial. El hacker necesitaría generar el - x e intentarlo en comparación con los siguientes tres bytes. Eventualmente, la persona obtendría 30-50 puntos de partida potenciales con las teclas - x, y será capaz de hackear su camino en el archivo de nuevo. Debido a que la seguridad a través de la oscuridad no es seguridad real, decidimos que las opciones - x, - i y - r no serían útiles para nuestros propósitos. Por lo tanto, el desarrollo se detuvo con ellos, pero los dejé en el programa por si acaso quería usarlos. Descargar padxor. zip contiene el código fuente que se compila en varias plataformas, e incluye ejecutables de DOS. Este programa de cifrado de almohadilla de tiempo que he escrito (básicamente sólo un programa de cifrado XOR) parece estar funcionando bien, compilando muy bien (gcc - o ./ OTP. c), y haciendo lo que su supuesto. Sin embargo me gustaría mejorarlo tanto como sea posible, por lo que estoy publicando esto. Estoy particularmente inseguro acerca de la asignación de memoria. Cualquier sugerencia sobre mejoras es más que bienvenida El código en su totalidad se encuentra a continuación y también se puede encontrar en Github: PrivacyProject / OTP-Encryption. Pregunta: Feb 15 14 at 19:54 Usted intenta hacer la experiencia del usuario lo más suave posible, imprimiendo una gran cantidad de información útil. Cosas que podría mejorar: Algunas notas que otros no han cubierto: Ejecutar su programa a través de Valgrind. No vi ningún escape de la memoria además de donde sus condiciones si fallan y usted sale main (). La mayoría de los sistemas operativos modernos (y todos los principales) liberarán la memoria no liberada por el programa cuando termine. Sin embargo, confiar en esto es una mala práctica y es mejor liberarlo explícitamente. Confiar en el sistema operativo también hace que el código menos portátil. Su método de encriptación es seguro. Banca en el hecho de que todas las condiciones para su programa se cumplen. Pero siempre pienso en el peor de los casos, donde el usuario no sigue sus condiciones óptimas de los programas. Si desea utilizar técnicas de cifrado seguro, puede beneficiarse de un trabajo de expertos de criptografía. Esto significa que tendrá que implementar una biblioteca externa (como OpenSSL). Aquí está un ejemplo si usted quiere ir esa ruta. Tiene una declaración implícita de función geteuid (). Que no es válido en la norma C99. Fopen (). Un ampliamente utilizado las funciones de E / S de archivos que está utilizando, obtuvo un lavado de cara en C11. Ahora admite un nuevo modo exclusivo de creación y apertura (.x). El nuevo modo se comporta como OCREATOEXCL en POSIX y se utiliza comúnmente para archivos de bloqueo. Los . X familia de modos incluye las siguientes opciones: wx crear archivo de texto para escribir con acceso exclusivo. Wbx crea un archivo binario para escribir con acceso exclusivo. Wx crear archivo de texto para actualizar con acceso exclusivo. Wbx o wbx crear un archivo binario para la actualización con acceso exclusivo. Abrir un archivo con cualquiera de los modos exclusivos anteriores falla si el archivo ya existe o no se puede crear. De lo contrario, el archivo se crea con acceso exclusivo (no compartido). Además, una versión más segura de fopen () llamada fopens () también está disponible. Eso es lo que usaría en su código si fuera usted, pero dejaré eso para que usted decida y cambie. Puede reducir algunas líneas de código inicializando tipos similares en una línea. Esto le mantendrá más organizado. Además, inicialice sus valores int cuando los declare. Los valores del puntero tendrán un valor predeterminado NULL. Verifique si argc es mayor o menor que 4. Sólo compruebe la desigualdad de 4 e imprima la sentencia de bloque. Hubiera extraído toda la encriptación a un método y toda la validación del archivo en otro método, pero dejaré eso para que lo implemente. Usted puede quitar el 0 para C-ness máximo, pero esto es a su discreción y gustos. Es más común devolver 0 en lugar de salir (0). Ambos llamarán a los controladores de atexit registrados y causarán la terminación del programa sin embargo. Usted tiene ambos propagación a través de su código. Elija uno para ser coherente. Además, debe devolver valores diferentes para diferentes errores, de modo que puede determinar dónde va mal algo en el futuro. Use puts () en lugar de printf () con un montón de n caracteres. Se comparan algunos punteros con NULL en algunas condiciones de prueba. Puede simplificarlos. Sus mensajes de perror () podrían ser más descriptivos. Se comparan algunas entradas con las mayúsculas y minúsculas de los caracteres. Podrías usar la función tolower () en ltctype. hgt para simplificarla un poco. Ya se mencionó, pero por favor indent su código correctamente. Esto hará que su código sea mucho más fácil de leer y mantener. Usted puede encontrar IDEs hacia fuera allí que lo hará automáticamente para usted cuando dicho. Código final (con mis cambios implementados): Asegúrese de mantener la sangría coherente. Usted lo hace solamente en ciertos lugares, sobre todo hacia el extremo. Usted debe hacerlo en todas partes cuando sea necesario, lo que hará que su código mucho más fácil de leer y seguir. Haces todo en main (). Lo cual es una mala práctica porque simplemente hace que el programa sea difícil de leer y mantener. Eso es una cosa de principiante, por lo que es comprensible. Tan pronto como sea posible, usted debe comenzar a usar funciones separadas para manejar la mayor parte del trabajo. Esto mejorará enormemente este programa y ayudará con futuros programas, especialmente los más grandes. En general, main () debe mostrar el texto introductorio, abrir los archivos (terminar si falla), cerrar los archivos, llamar a otras funciones para hacer el trabajo de criptografía, devolver cualquier cosa si es necesario, y luego terminar. Agregar comentarios es un buen comienzo, pero todavía no es un sustituto para el uso de funciones. Para los archivos y los argumentos de la línea de comandos, pueden ser pasados a las funciones y utilizados allí. Prefiero regresar de main () a la llamada exit (). Pero para lo que elija, debe ser coherente con ella. Esto ya fue mencionado por syb0rg y con mayor detalle, pero todavía vale la pena tener en cuenta. La coherencia es la clave. Usted no necesita el paréntesis a cambio (0). No requiere el uso de él. Sólo use return 0. Opcionalmente puede devolver EXITUCCESS o EXITFAILURE. Que devuelven 0 y 1 respectivamente. Respondió Feb 15 14 at 21:00 Cuando elimina un archivo, su contenido sigue residiendo en el disco sólo su entrada de directorio se elimina. En lugar de simplemente desvincular el archivo de origen, considere sobrescribirlo con bytes aleatorios primero. (En estos días, con el nivel de desgaste SSD, las instantáneas del sistema de archivos y los sistemas de archivos con estructura de registro, es más difícil borrar completamente los datos de un sistema de archivos. Sin embargo, todavía vale la pena intentarlo.) Su advertencia es inexacta. Cuando el archivo de clave es más corto que el archivo de origen, no reduce la fuerza criptográfica que lo borra. En mi opinión, el comportamiento más ético es tratarlo como un error fatal y no generar ningún archivo de salida en absoluto. Respondió Feb 15 14 at 20:59 it39s procesando statbuf. stsize bytes de la fuente realmente trunca la salida O hace xor los bytes adicionales con salida no válida pero predecible de fgetc (keyfile), es decir, EOF. Ndash ChrisW Feb 15 14 at 21:35 ChrisW OMG usted tiene razón. Sólo un poco-voltea todo el texto en exceso. Ndash 200success 9830 Feb 15 14 at 21:50 Eso podría ser más seguro que la reutilización de la almohadilla quotone-timequot. Ndash ChrisW Feb 15 14 at 21:54 En términos de algoritmo, el bucle siguiente tiene lo que yo consideraría un gran problema. Si el archivo de claves es más corto que el archivo de origen, el final del archivo de origen termina siendo cifrado con EOF y, por lo tanto, el XOR utilizará -1. Es realmente mucho menos cifrado que usted tenía en mente, me gustaría pensar. (Nota: Sé que el código le pregunta si desea continuar o no, pero creo que hay una solución simple, vea a continuación.) Además, no establece el recuento a cero antes de realizar bucle con él. Dicho esto, yo usaría algo como esto en su lugar que no usa contar de todos modos: (Nota: el recuento es cero en su caso porque count es una variable primordial y aquellos están usando clean memory (cero) del kernel, pero en un Sub-sub-función, que habría notado el problema) respondió 16 de febrero 14 a las 9:42 youjustreadthis, I39m no demasiado seguro de por qué no podía descifrar. Podrías comparar la salida de tu versión anterior y esta versión usando cmp - l old-output new-output para ver si los bytes parecen diferentes. Por supuesto, si la clave es más pequeña, se verá diferente desde el final de la clave hasta el final del archivo que se cifra. Ndash Alexis Wilke Feb 17 14 a las 0:00
Comments
Post a Comment