|
Este programa lo hice en la universidad cuando me creía
un excelente programador sólo por hacer las cosas
de la manera más dificil o por meter la mayor cantidad
posible de operaciones en una sola línea. Como ahora
me creo mucho menos ya no me ando ahorrando lineas ni comentarios
si de legibilidad se trata. He revisado el proyecto y compila
y corre bien en Win98 y winXP. Este programa fue creado usando
Borland C++ 3.1. Lo necesitarás si quieres compilarlo.
Los archivo fuentes son:
|
|
codizy.h
|
//--------------------------------------------------------------
// CODIZY.H
//--------------------------------------------------------------
#include "soporte.h"
#ifndef _CODIZY_H_
#define _CODIZY_H_
#define NC 11
//-------------------------------
// FUNCIONES DE PANTALLA
//
void cuadro (int color);
void cuadro1 (void);
void cuadro2 (void);
//-------------------------------
// FUNCIONES CODIFICADORAS
//
void ordig(int n,int opi,int v[128],int d);
long cody(char archivo[81],int op);
//-------------------------------
// FUNCION DE ARCHIVO
//
void borrar_archivo(char archivo[81],long tam);
//-------------------------------
// Fragmentador
//
void fragmentar(void);
//-------------------------------
// Defragmentador
//
void defragmentar(void);
//-------------------------------
//FUNCIONES DEL MENU
//
void crear(void);
void leer(void);
void borrar(void);
void codificar(void);
void observar(void);
int caratula(void);
#endif
|
|
soporte.h
|
//--------------------------------------------------------------
// SOPORTE.H
//--------------------------------------------------------------
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#ifndef _SOPORTE_H_
#define _SOPORTE_H_
void _cuadro (int xs, int ys, int xi, int yi, int col);
void _pon (char * cad, int x, int y, int col);
int c_i (char c);
void l_cad (char *p);
#endif
|
|
soporte.c
|
//--------------------------------------------------------------
// SOPORTE.C
// Creado: 1998 - Esau R.O.
//--------------------------------------------------------------
#include "soporte.h"
char *tipocuadro[6]={"�","�","�","�","�","�"};
//--------------------------------------------------------------
// Imprime un cuadro en pantalla
//
void _cuadro (int xs, int ys, int xi, int yi, int col)
{
char *pt; int c;
clrscr();
textcolor(col);
pt=tipocuadro[0];
gotoxy(xs,ys); cputs(pt);
for (c=1;c<xi-xs;c++)
{
gotoxy(xs+c,ys);cputs(pt+2);
gotoxy(xs+c,yi);cputs(pt+2);
}
gotoxy(xi,ys); cputs(pt+4);
for (c=1;c<yi-ys;c++)
{
gotoxy(xs,ys+c); cputs(pt+6);
gotoxy(xi,ys+c); cputs(pt+6);
}
gotoxy(xi,yi); cputs(pt+8);
gotoxy(xs,yi); cputs(pt+10);
}
void _pon (char * cad, int x, int y, int col)
{
textcolor(col);
gotoxy(x,y);
cputs(cad);
}
//--------------------------------------------------------------
// Debido a la forma de almacenar los caracteres y enteros
// la obvia: i=(int)c no funcion� con el programa "Cody"
// Ten�amos que evaluar: v_cod[(int)c] esta expresi�n funcionaba
// para caracteres desde '\0' -'\127' pero cuando c=� ('\165')
// (int)c daba un valor de -91 (aunque enla ventana WATCH decia 165)
//
int c_i (char c)
{
if (c<0) return ((int)c+256);
else return (c);
}
//--------------------------------------------------------------
// Permite leer una cadena (sin espacios) sin hacer caso de las
// teclas de funci�n,se sale con <ENTER> o <ESC> O <CONTROL>+<M>
// tambien lee la '�' y la '�' y acentos . (C�mo escribo a�o?)
//
void l_cad (char *p)
{
char c,i=0, cad[81];
do
{
c=getch();
if (c=='\0')
{
getch(); //tomamos el siguiente caracter (F6='\0'+'@')
}
if ((isgraph(c)) || (c=='�') || (c=='�') || (c=='�') || (c=='�')
|| (c=='�') || (c=='�') || (c=='�')) //NO FUNCIONA: (c=='\165') !!!
{
cad[i]=c; i++; putchar(c);
}
if (c=='\b')
{
putchar('\b'); putchar(' '); putchar('\b'); i--;
}
}while ((c!='\r') && (c!='\x1B'));
cad[i]='\0';
strcpy(p,cad);
}
|
|
codizy.c
|
| Con respecto al algoritmo de encriptación
que usé te puede ayudar esta presentación que hice
para la universidad: codizy.ppt.
En ella explico los vectores de ordenación y codificación
que usa el programa. Recientemente me he dado cuenta que mi método
de encriptación sufre de una deficiencia importante debido
a un problema de periodicidad. Mi idea era que con cada nueva
contraseña el algoritmo generara un vector de codificación
diferente, entonces, como tenía contraseñas de 9
dígitos de los cuales usaba 6 dígitos para generar
el vector de codificación debería tener 10^6 vectores
diferentes, pero me he dado cuenta que debido a la periodicidad
del algoritmo, cualquier vector de ordenación obtenido
con cualquier clave (no importando lo grande que sea esta) queda
completamente definido por un número base y un factor de
incremento aritmético, entonces, como el número
base tiene un rango de {32,33,...,159} y el factor de incremento
un rango de {1,2,...,127} el numero total de vectores de codificacion
diferentes es de tan sólo: 128 * 127 = 16256, lo cual es
mucho menor del millón que yo originalmente pensaba y peor
aun, esto no mejora si incremento la longitud de la clave. Lo
mismo se puede decir del vector de ordenacion en vez de mil vectores
diferentes solo obtengo 110, dandome al final un espacio de claves
neto de 1788160 y no de mil millones como yo planeaba. :-( Conclusion:
romper este método de encriptación es un paseo para
cualquier criptoanalista serio. a mi favor sólo puedo decir
que entonces recién estaba comenzando y gracias a esta
asignación comenzé a leer acerca del fascinante
tema de la criptografia. Además la mayoria de proyectos
de mi clase emplearon solamente vectores estáticos de codificación
sin considerar siquiera la reordenación. Lo que significa
que si tienes el ejecutable lo puedes desensamblar para sacar
la tabla de codificación, y si no, le aplicas al mensaje
encriptado cualquier método estadistico y comparas la distribución
frecuencial de las letras del idioma con la que presenta el mensaje,
y si el mensaje es lo suficientemente largo es casi seguro que
descubres la tabla de codificación, eso si, algunos proyectos
contaban con coloridas interfaces de usuario, cosa que yo obviamente
no tenia. ;-) Este programa es bastante limitado y necesitarás
un disquet en la unidad A si quieres usarlo (el profesor no quería
que escribiéramos nada en su disco duro)
|
 |
|
Puedes encontrar el proyecto y el ejecutable aqui: codizy.zip.
Este pequeño programa es el antecesor de Codi
el programa que hice luego en Visual C++ para que corriera bajo
Windows.
Esaú Rodríguez Oscanoa
|
|