Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Superplay en 21 Abril 2014, 20:49 pm



Título: Programando un sistema cifrado/descifrado básico en C
Publicado por: Superplay en 21 Abril 2014, 20:49 pm
Buenas, resulta que tengo que programar un sistema de cifrado/descifrado. Digamos que los menús y algunas cosas ya están hechas. Os pongo el código:

Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
int opcion=0, hecho=0; //Variables para control
char clave[13]; //Array de carácteres para la palabra clave

int palcla[13]; //Vector para asignar un número por letra a la palabra clave
char cifrado[13][13];
int contlet[27]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //Contamos las letras y si alguna se repite, subimos uno al número
int i, j, numle;

char texto[145];
char nombrearchivo, cargatxt;
FILE *fichero, *fichero2;


do{
    printf("\n\n1. Establecer palabra clave.\n");
    printf("2. Cifrar un mensaje.\n");
    printf("3. Descifrar un mensaje.\n");
    printf("4. Salir\n");
    printf("Introduzca una opcion:");

    scanf("%d", &opcion);
   
    if(opcion>4){
    printf("Ha elegido una opcion que no existe (%d) por favor, escoja una opcion que si exista.\n", &opcion);
    getchar();
    getchar();
    }else{
    if(hecho==0 && opcion>1){
    printf("No tiene ninguna palabra clave establecida.\n");
    opcion=10;
    getchar();
    getchar();
    }
    }
   
    system("cls");
   
   
    switch(opcion){
    //Establecer palabra clave
    case 1:
do{

printf("Palabra clave (12 letras):  ");
scanf("%s", clave);
if(strlen(clave)<12 || strlen(clave)>12){
printf("Lo siento, esta palabra no tiene 12 letras, es de %i letras.\n\n", strlen(clave));
}
}while(strlen(clave)<12 || strlen(clave)>12);

printf("Palabra clave establecida.\n");
    hecho=1;

//Esto puede hacerse en una función aparte:
for(i=0;i<13;i++){
printf("%c ", clave[i]);
}
printf("\n");
for(i=0;i<13;i++){

if(clave[i]=='A' || clave[i]=='a'){
                       contlet[0]++;
   palcla[i]=1+contlet[0]-1;
   printf("%d ", palcla[i]);
}else{
if(clave[i]=='B'||clave[i]=='b'){
                       contlet[1]++;
   palcla[i]=2+contlet[1]-1;
   printf("%d ", palcla[i]);
}else{
if(clave[i]=='C'||clave[i]=='c'){
                       contlet[2]++;
   palcla[i]=3+contlet[2]-1;
   printf("%d ", palcla[i]);
}else{
if(clave[i]=='D'||clave[i]=='d'){
                       contlet[3]++;
   palcla[i]=4+contlet[3]-1;
   printf("%d ", palcla[i]);
}else{
if(clave[i]=='E'||clave[i]=='e'){
                       contlet[4]++;
   palcla[i]=5+contlet[4]-1;
   printf("%d ", palcla[i]);
}else{
if(clave[i]=='F'||clave[i]=='f'){
                       contlet[5]++;
   palcla[i]=6+contlet[5]-1;
   printf("%d ", palcla[i]);
}else{
if(clave[i]=='G'||clave[i]=='g'){
                      contlet[6]++;
  palcla[i]=7+contlet[6]-1;
   printf("%d ", palcla[i]);
}else{
if(clave[i]=='H'||clave[i]=='h'){
                      contlet[7]++;
  palcla[i]=8+contlet[7]-1;
   printf("%d ", palcla[i]);
}else{
if(clave[i]=='I'||clave[i]=='i'){
                       contlet[8]++;
   palcla[i]=9+contlet[8]-1;
   printf("%d ", palcla[i]);
}else{
if(clave[i]=='J'||clave[i]=='j'){
                      contlet[9]++;
  palcla[i]=10+contlet[9]-1;
   printf("%d ", palcla[i]);
}else{
if(clave[i]=='K'||clave[i]=='k'){
                      contlet[10]++;
  palcla[i]=11+contlet[10]-1;
   printf("%d ", palcla[i]);
}else{
if(clave[i]=='L'||clave[i]=='l'){
                    contlet[11]++;
  palcla[i]=12+contlet[11]-1;
   printf("%d ", palcla[i]);
}else{
if(clave[i]=='M'||clave[i]=='m'){
                      contlet[12]++;
  palcla[i]=13+contlet[12]-1;
   printf("%d ", palcla[i]);
}else{
if(clave[i]=='N'||clave[i]=='n'){
                       contlet[13]++;
   palcla[i]=14+contlet[13]-1;
   printf("%d ", palcla[i]);
}else{
if(clave[i]=='Ñ'||clave[i]=='ñ'){
                       contlet[14]++;
   palcla[i]=15+contlet[14]-1;
   printf("%d ", palcla[i]);
}else{
if(clave[i]=='O'||clave[i]=='o'){
                       contlet[15]++;
   palcla[i]=16+contlet[15]-1;
   printf("%d ", palcla[i]);
}else{
if(clave[i]=='P'||clave[i]=='p'){
                      contlet[16]++;
palcla[i]=17+contlet[16]-1;
   printf("%d ", palcla[i]);
}else{
if(clave[i]=='Q'||clave[i]=='q'){
                     contlet[17]++;
palcla[i]=18+contlet[17]-1;
   printf("%d ", palcla[i]);
}else{
if(clave[i]=='R'||clave[i]=='r'){
                      contlet[18]++;
  palcla[i]=19+contlet[18]-1;
   printf("%d ", palcla[i]);
}else{
if(clave[i]=='S'||clave[i]=='s'){
                       contlet[19]++;
   palcla[i]=20+contlet[19]-1;
   printf("%d ", palcla[i]);
}else{
if(clave[i]=='T'||clave[i]=='t'){
                     contlet[20]++;
palcla[i]=21+contlet[20]-1;
   printf("%d ", palcla[i]);
}else{
if(clave[i]=='U'||clave[i]=='u'){
                      contlet[21]++;
palcla[i]=22+contlet[21]-1;
   printf("%d ", palcla[i]);
}else{
if(clave[i]=='V'||clave[i]=='v'){
                      contlet[22]++;
palcla[i]=23+contlet[22]-1;
   printf("%d ", palcla[i]);
}else{
if(clave[i]=='W'||clave[i]=='w'){
                      contlet[23]++;
  palcla[i]=24+contlet[23]-1;
   printf("%d ", palcla[i]);
}else{
if(clave[i]=='X'||clave[i]=='x'){
                      contlet[24]++;
  palcla[i]=25+contlet[24]-1;
   printf("%d ", palcla[i]);
}else{
if(clave[i]=='Y'||clave[i]=='y'){
                      contlet[25]++;
  palcla[i]=26+contlet[25]-1;
   printf("%d ", palcla[i]);
}else{
if(clave[i]=='Z'||clave[i]=='z'){
                      contlet[26]++;
  palcla[i]=27+contlet[26]-1;
   printf("%d ", palcla[i]);

}
}}}}}}}}}}}}}}}}}}}}}}}}}}
}

    break;


//-------------------------------------------------------------------------------------------------------------------------------------------

    //Cifrar un mensaje
  case 2:
printf( "Introduzca el texto (144 carácteres sin espacios máximo): " );
scanf( "%s", texto );

//Mostramos todo:
for(i=0;i<13;i++){
printf("%c ", clave[i]);
}
printf("\n");
for(i=0;i<13;i++){
printf("%d ", palcla[i]);
}
printf("\n");

int letras=0;
//Ponemos cada letra en una posición de la matriz
for(j=0;j<13;j++){
   for(i=0;i<13;i++){
if(letras<=strlen(texto)){
cifrado[i][j]=texto[letras];
printf("%c ", cifrado[i][j]);
letras++;
}else{
cifrado[i][j]=' ';
}

}
printf("\n");
}

printf( "\nEl mensaje %s que ha escrito se ha codificado adecuadamente:\n", texto );

//Vamos a guardar la matriz cifrado en un archivo de texto

printf("Por favor, introduzca el nombre del fichero con .txt: ");
scanf("%s", &nombrearchivo);

if((fichero=fopen(&nombrearchivo,"w"))!=NULL){
for(i=0;i<13;i++){
for(j=0;j<13;j++){
fprintf(fichero,"%c",cifrado[i][j]);
}
fprintf(fichero,"\n");
}
fclose(fichero);
}else{
printf("Error al guardar el archivo\n");
}

  /*
getchar();
getchar();

//Ordenamos matriz general
int palclabuena[13];
char cifradobuena[13][13];

for(numle=1;numle<40;numle++){

for(i=0;i<=13;i++){
if(palcla[i]==numle){
palclabuena[numle]=palcla[i];
for(j=0;j<=13;j++){
cifradobuena[i][j]=cifrado[i][j];
}
}
}
}

//La repintamos
for(i=0;i<13;i++){
printf("%c ", clave[i]);
}
printf("\n");
for(i=0;i<13;i++){
printf("%d ", palclabuena[i]);
}
printf("\n");

for(j=0;j<13;j++){
for(i=0;i<13;i++){
printf("%c ", cifradobuena[i][j]);
}
printf("\n");
}*/
  break;

    //Descifrar un mensaje
    case 3:
//Leemos matriz del fichero

printf("Por favor, introduzca el nombre del fichero con .txt: ");
scanf("%s", &nombrearchivo);
if((fichero2=fopen(&nombrearchivo,"r"))!=NULL){
for(i=0;i<13;i++)
{
for(j=0;j<13;j++){
while (feof(fichero2)==0){
fscanf(fichero2, " %c" ,&cifrado[i][j]);
}
}
}
fclose (fichero2 );
}else{
printf("Error al leer el archivo\n");
}

//Mostramos matriz
//Mostramos todo:
for(i=0;i<13;i++){
printf("%c ", clave[i]);
}
printf("\n");
for(i=0;i<13;i++){
printf("%d ", palcla[i]);
}
printf("\n");

for(j=0;j<13;j++){
for(i=0;i<13;i++){
printf("%c ", cifrado[i][j]);
}
printf("\n");
}

    break;

    //Salir
    case 4:
    return 0;
    break;
}
}while(opcion!=4);

return 0;
}

Si vamos a la opción 1, vemos que el usuario debe introducir una palabra de 12 letras para usar en el cifrado y descifrado (en destino), y con ello le asigno un número que debe ser diferente y en función de la posición en el abecedario (casi lo logro, digamos que si hay letras repetidas asigna distintos pero otra letra debe tener un número distinto también en caso de que al incrementar el valor de las otras coincidan, algo que no he logrado).

En la segunda opción, podéis ver un fragmento de código comentado, el reto ahí es reordenar según los números que he explicado antes, las columnas de menor a mayor (no conseguido). Y que se guarden (como hace) en un archivo de texto.

En la tercera opción digamos que debe hacer lo mismo pero al contrario (con la palabra, debe ordenar las columnas para que se queden como al principio (si no las hubieramos ordenado de menor a mayor), esas columnas y tal deben ser leídas de un archivo txt (no conseguido).

Bueno pues ahí mis problemas, muchas gracias gente... a ver si algún día contribuyo a código y no doy por saco con mis problemas


Título: Re: Programando un sistema cifrado/descifrado básico en C
Publicado por: Blaster en 22 Abril 2014, 04:06 am
Ahora mismo no tengo tiempo para revisar a fondo tu codigo, pero puedo darte una sugerencia para acortar mas el codigo ya que en el primer case tienes un bloque de codigos repetidos mi propuesta es la siguiente:

Código
  1. char abc[] = "abcdefghijklmnñopqrstuvwxyz";
  2. char *q = NULL;
  3.  
  4. for (i = 0; clave[i] != '\0'; i++){
  5.    q = strchr(abc, clave[i]);
  6.  if(q){
  7.      contlet[q-abc]++;
  8.      palcla[i] = (q-abc)+1 + contlet[q-abc]-1;
  9.      printf("%d ", palcla[i]);
  10. }
  11. }
  12.  
Deberias implementar una función para asi validar tambien las letras mayusculas

Saludos..