elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Programando un sistema cifrado/descifrado básico en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Programando un sistema cifrado/descifrado básico en C  (Leído 1,642 veces)
Superplay


Desconectado Desconectado

Mensajes: 670



Ver Perfil
Programando un sistema cifrado/descifrado básico en C
« 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


En línea



"Nací siendo un virus" By Windows.
Este mensaje no es por ofender, yo uso Windows también, simplemente... es broma ;)
Blaster

Desconectado Desconectado

Mensajes: 190


Ver Perfil
Re: Programando un sistema cifrado/descifrado básico en C
« Respuesta #1 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..


« Última modificación: 22 Abril 2014, 04:11 am por Blaster » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
que tipo de sistema es o cifrado?
Criptografía
andres199 1 4,029 Último mensaje 28 Junio 2011, 15:15 pm
por APOKLIPTICO
algo basico super basico pero que no me sale
Programación C/C++
Freelancer 6 4,223 Último mensaje 22 Septiembre 2011, 03:25 am
por Freelancer
Llave DES de cifrado/[desCIFRADO para mensajes snmpv3
Criptografía
chelo87_ec 1 3,497 Último mensaje 11 Diciembre 2013, 20:29 pm
por ANELKAOS
Cómo afecta el cifrado del disco en Ubuntu al rendimiento del sistema
Noticias
wolfbcn 1 2,024 Último mensaje 17 Marzo 2014, 12:59 pm
por Gh057
Sophos lanza sistema sincronizado de cifrado de archivos “Always-On”
Noticias
wolfbcn 0 1,346 Último mensaje 20 Julio 2016, 22:27 pm
por wolfbcn
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines