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

Cifrado CESAR en C/C++

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.

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!

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.