Les presento el código del encriptador CESAR. Introducido un fichero de texto, genera un fichero con el mismo contenido, pero cifrado mediante este método. La información a cerca del cifrado se presenta en el encabezado del programa.
Quiero recordar que en el blog hay disponible un tema sobre el mismo tipo de cifrado, pero en Pascal, en vez de en C. Además también hay otro tipo de codificación y decodificación que usa un método algo más complejo.
Debido a la simplicidad de este método, el cifrado CESAR está actualmente en casi total desuso.
Un poco de historia: El nombre de CESAR proviene de que según la historia, el primer personaje en usarlo fue Julio Cesar, con un desplazamiento de 3 letras, para comunicarse con los mandos del ejercito romano y no ser descubierto por personas ajenas a él.
CÓDIGO:
/*CIFRADO CESAR EN C/C++*/
/*Este programa se va a usar para llevar a cabo una codificación de un fichero
de texto, mediante el codificado CESAR, que es uno de los métodos más simples
de encriptar.
La variable trans==translación de encriptación, es la que indica cuantas letras
se va a correr el abecedario hacia la derecha. Ejemplo:
trans=3
c1=Caracter decodificado
c2=Caracter codificado
c2=c1+trans
Entonces en nuestro caso si c1='A'
c2='A'+3='D'
El programa solo codifica letras, tanto mayúsculas como minúsculas:
del ASCII 65 ('A') al 90 ('Z') y del 97 ('a') al 122 ('z').
*/
#include <stdio.h>
#include <string.h>
int main(void)
{
FILE *dat1,*dat2;
char nombre1[50],nombre2[50],c;
int trans;
printf("Seleccione translacion de encriptacion: "); scanf("%d", &trans);
printf("Nombre del fichero a codificar: "); scanf("%s", &nombre1);
printf("Nombre del fichero donde guardar codificado: "); scanf("%s", &nombre2);
if (fopen(nombre1,"r")==NULL)
printf("\nEl fichero no existe.\n\n");
else
{
dat1=fopen(nombre1,"r");/*Se abre en modo lectura*/
dat2=fopen(nombre2,"w");/*Se abre en modo escritura*/
fscanf(dat1,"%c",&c);
while (!feof(dat1))
{
/*Se codifica el caracter*/
if ((c>='A')&&(c<='Z'))
{
c=((c+trans-'A')%('Z'-'A'+1))+'A';
}
else if ((c>='a')&&(c<='z'))
{
c=(c+trans-'a')%('z'-'a'+1)+'a';
}
/*Se escribe el caracter en el codificado*/
fprintf(dat2,"%c",c);
/*Se lee un nuevo caracter*/
fscanf(dat1,"%c",&c);
}
fclose(dat1);
fclose(dat2);/*Se cierran ambos ficheros*/
}
}
Y aquí un ejemplo de ejecución:
Un saludo.
Resolución de distintos problemas en el ámbito de la ingenieria mediante el uso de la programación. Los programas abarcan todos los niveles de dificultad, así como la mayoría de las herramintas con las que contamos al programar. Si tienes cualquier duda a cerca de un programa, o quieres proponer alguna nueva entrada, no dudes en contactar escribiendo en cualquiera de las entradas del blog ¡Bienvenido!
Mostrando entradas con la etiqueta codifica. Mostrar todas las entradas
Mostrando entradas con la etiqueta codifica. Mostrar todas las entradas
jueves, 18 de abril de 2013
martes, 9 de octubre de 2012
CIFRADO CESAR
Programa que Codifica mediante el procedimiento Cesar pudiendo elegir el desplazamiento:
{Programa de cifrado de caracteres que a cada letra le hace corresponder la que
se encuentra 6 posiciones mas a la derecha, de tal manera que cuando llega a la
z, vuelve a empezar por la a}
program cesar(input,output);
var
desplazamiento:integer;
secuencia:string[100];
letra_cifrada:char;
contador,posicion_ascii:byte;
begin
writeln('Introduzca una secuencia de caracteres acabada en punto:');
readln(secuencia);
writeln('Secuencia codificada:');
contador:=1;
desplazamiento:=2;
while (secuencia[contador]<>'.') do
begin
posicion_ascii:=ord(secuencia[contador]);
If ((64<posicion_ascii) and (posicion_ascii<(91-desplazamiento))) or
((96<posicion_ascii) and (posicion_ascii<(123-desplazamiento))) then
{Si el caracter introducido esta en el intervalo ascii basta con sumar 6 a
las posicion del caracter original para encontrar la posicion del caracter
cifrado}
begin
posicion_ascii:=posicion_ascii+desplazamiento;
letra_cifrada:=chr(posicion_ascii);
write(letra_cifrada)
end
{En cambio si la letra no se encuentra en esos dos intervalos
a la posicion de la letra hay que restarle 26 (para volver a empezar
por la a, mayuscula o minuscula) y despues sumarle 6, con lo que en
definitiva se le restan 20}
else if (((91-desplazamiento)<=posicion_ascii)and(posicion_ascii<91)) or
(((123-desplazamiento)<=posicion_ascii)and(posicion_ascii<123)) then
begin
posicion_ascii:=posicion_ascii-(26-desplazamiento);
letra_cifrada:=chr(posicion_ascii);
write(letra_cifrada)
end
else
{Por el contrario, si el caracter introducido no esta en ninguno de los
asnteriores intervalos, el caracter introducido no corresponde con una letra
por lo que se le advierte al usuario que no es valido, y no se realiza
ningun calculo}
write(letra_cifrada);
contador:=1+contador
end;
readln
end.
Salu10!
{Programa de cifrado de caracteres que a cada letra le hace corresponder la que
se encuentra 6 posiciones mas a la derecha, de tal manera que cuando llega a la
z, vuelve a empezar por la a}
program cesar(input,output);
var
desplazamiento:integer;
secuencia:string[100];
letra_cifrada:char;
contador,posicion_ascii:byte;
begin
writeln('Introduzca una secuencia de caracteres acabada en punto:');
readln(secuencia);
writeln('Secuencia codificada:');
contador:=1;
desplazamiento:=2;
while (secuencia[contador]<>'.') do
begin
posicion_ascii:=ord(secuencia[contador]);
If ((64<posicion_ascii) and (posicion_ascii<(91-desplazamiento))) or
((96<posicion_ascii) and (posicion_ascii<(123-desplazamiento))) then
{Si el caracter introducido esta en el intervalo ascii basta con sumar 6 a
las posicion del caracter original para encontrar la posicion del caracter
cifrado}
begin
posicion_ascii:=posicion_ascii+desplazamiento;
letra_cifrada:=chr(posicion_ascii);
write(letra_cifrada)
end
{En cambio si la letra no se encuentra en esos dos intervalos
a la posicion de la letra hay que restarle 26 (para volver a empezar
por la a, mayuscula o minuscula) y despues sumarle 6, con lo que en
definitiva se le restan 20}
else if (((91-desplazamiento)<=posicion_ascii)and(posicion_ascii<91)) or
(((123-desplazamiento)<=posicion_ascii)and(posicion_ascii<123)) then
begin
posicion_ascii:=posicion_ascii-(26-desplazamiento);
letra_cifrada:=chr(posicion_ascii);
write(letra_cifrada)
end
else
{Por el contrario, si el caracter introducido no esta en ninguno de los
asnteriores intervalos, el caracter introducido no corresponde con una letra
por lo que se le advierte al usuario que no es valido, y no se realiza
ningun calculo}
write(letra_cifrada);
contador:=1+contador
end;
readln
end.
Salu10!
viernes, 24 de febrero de 2012
Codificar fichero de texto
Este programa codifica con un método muy sencillo, y poco eficaz si la clave de codificación es corta, pero muy eficaz si es larga y se utilizan varias claves(intentare colgar otro programa que use varias claves). El programa, codifica un fichero de texto (extensión .txt) y el texto codificado lo guarda en un fichero que crea y se llama codificado.txt. Groso modo, el mecanismo consiste en sumar el valor de la letra a codificar y el de la letra que corresponda de la clave, usando valores del codigo ASCII. El programa resultante es el siguiente:
program encripta(input,output);
const
min=32;
max=126;
type
NomFich=string[50];
tpContador=1..maxint;
var
nom:NomFich;
codificado,decodificado:text;
aux:char;
contador:integer;
procedure Codificar(VAR a:char; c:tpContador);
const
clave='AquiSeIntroduceLaClave';{Aqui se pone el texto a usar como clave}
var
n:integer;
begin {mirando en las tablas del codigo ASCII}
if (ord(a)>=min) and (ord(a)<=max) then begin
n:=((c-1) mod ord(clave[0])) + 1;
{En la posicion 0 de la cadena clave se guarda su longitud}
n:=(ord(clave[n])+ord(a)-(min*2)) mod (max-min+1);
n:=n+min;
a:=chr(n)
end
end;
begin
write('Introduzca el nombre del fichero de texto a decodificar: ');{Se debe poner la extensión .txt}
readln(nom);
assign(decodificado,nom);
assign(codificado,'codificado.txt');
reset(decodificado); rewrite(codificado);
contador:=0;
while not eof(decodificado) do begin
while not eoln(decodificado) do
begin
contador:=contador+1;
read(decodificado,aux);
Codificar(aux,contador);
write(codificado,aux)
end;
readln(decodificado);writeln(codificado)
end;
close(codificado); close(decodificado);
readln
end.
Si alguien tiene alguna duda o quiere detalles sobre el método que pregunte por aquí.
Salud.
program encripta(input,output);
const
min=32;
max=126;
type
NomFich=string[50];
tpContador=1..maxint;
var
nom:NomFich;
codificado,decodificado:text;
aux:char;
contador:integer;
procedure Codificar(VAR a:char; c:tpContador);
const
clave='AquiSeIntroduceLaClave';{Aqui se pone el texto a usar como clave}
var
n:integer;
begin {mirando en las tablas del codigo ASCII}
if (ord(a)>=min) and (ord(a)<=max) then begin
n:=((c-1) mod ord(clave[0])) + 1;
{En la posicion 0 de la cadena clave se guarda su longitud}
n:=(ord(clave[n])+ord(a)-(min*2)) mod (max-min+1);
n:=n+min;
a:=chr(n)
end
end;
begin
write('Introduzca el nombre del fichero de texto a decodificar: ');{Se debe poner la extensión .txt}
readln(nom);
assign(decodificado,nom);
assign(codificado,'codificado.txt');
reset(decodificado); rewrite(codificado);
contador:=0;
while not eof(decodificado) do begin
while not eoln(decodificado) do
begin
contador:=contador+1;
read(decodificado,aux);
Codificar(aux,contador);
write(codificado,aux)
end;
readln(decodificado);writeln(codificado)
end;
close(codificado); close(decodificado);
readln
end.
Si alguien tiene alguna duda o quiere detalles sobre el método que pregunte por aquí.
Salud.
Suscribirse a:
Entradas (Atom)