2016-12-08 2 views
0

Я создаю шифр замещения в c, читая символы из текстового файла и шифруя их. Однако, когда я запускаю программу, текст в файле не зашифрован. Однако я не уверен, что именно мне не хватает. Любая помощь приветствуется.C Замена Cipher

 #include <stdio.h> 
    #include <string.h> 
    #include <ctype.h> 



    void encrypt(char *inchar) 
    { 
    while (*inchar) 
    { 

    if (isalpha(*inchar) && isupper(*inchar)) 
    { 

    if (*inchar == 'A') {*inchar = 'G';} 
    if (*inchar == 'B') {*inchar = 'H';} 
    if (*inchar == 'C') {*inchar = 'B';} 
    if (*inchar == 'D') {*inchar = 'I';} 
    if (*inchar == 'E') {*inchar = 'A';} 
    if (*inchar == 'F') {*inchar = 'L';} 
    if (*inchar == 'G') {*inchar = 'U';} 
    if (*inchar == 'H') {*inchar = 'F';} 
    if (*inchar == 'I') {*inchar = 'P';} 
    if (*inchar == 'J') {*inchar = 'J';} 
    if (*inchar == 'K') {*inchar = 'K';} 
    if (*inchar == 'L') {*inchar = 'T';} 
    if (*inchar == 'M') {*inchar = 'V';} 
    if (*inchar == 'N') {*inchar = 'M';} 
    if (*inchar == 'O') {*inchar = 'M';} 
    if (*inchar == 'P') {*inchar = 'O';} 
    if (*inchar == 'Q') {*inchar = 'E';} 
    if (*inchar == 'R') {*inchar = 'S';} 
    if (*inchar == 'S') {*inchar = 'N';} 
    if (*inchar == 'T') {*inchar = 'Q';} 
    if (*inchar == 'U') {*inchar = 'D';} 
    if (*inchar == 'V') {*inchar = 'R';} 
    if (*inchar == 'W') {*inchar = 'W';} 
    if (*inchar == 'S') {*inchar = 'Z';} 
    if (*inchar == 'Y') {*inchar = 'S';} 


    }      
    } 
    inchar++; 
    } 


    int main (void) 
    { 


    FILE *inputFile; 
    char inputBuffer[80]; 
    char *inputPtr = inputBuffer; 
    char inchar; 





    inputFile = fopen("code.txt", "r"); 


    if (inputFile == NULL) 
    { 
      printf("Failed to open\n"); 
      return(0); 

    } 

    while ((inchar = fgetc(inputFile)) != EOF) 
    { 
      putchar(inchar); 
    } 

    inputBuffer[strlen(inputBuffer) - 1] = 0; 


    encrypt(&inchar); 
    putchar(inchar); 

    return(0); 

}

+0

Исправить форматирование. Что означает «файл не зашифрован» (IOW, какие результаты вы получаете)? Когда вы запускаете это в отладчике (или добавляете вывод отладки), что вы видите? – KevinDTimm

+5

Большой блок 'if' должен быть 'if else', иначе вы измените A на G, a G на U и U на D, что эффективно отображает все A, G и U в D –

+0

Я имею в виду, что он не шифрует. Извините, что было неясно. – Alaska

ответ

1

Файл не изменится, потому что ваша программа не делает ничего, что может изменить содержимое файла.

Все, что вы делаете, это печать (с использованием putchar()) зашифрованного символа, нет кода для записи файлов.

Вы должны открыть второй файл для записи и записать результирующие символы там. Затем, как только вы закончите, вы можете переименовать записанный файл, чтобы заменить вход, если хотите.

0

Есть что-то не так с тем, что вы делаете (и то, что вы просите).

  1. Ваша функция encrypt на самом деле не является шифрованием. Шифр сдвига - это схема шифрования с ключом K; K < alphabet_size, где каждая буква заменяется буквой K Позиции вверх в алфавите (обертывание). То, что у вас есть с вашей функцией encrypt, - это скорее шифр скремблирования.

    Фактический сдвиг шифра с ключом 6, например, и английский алфавит, будет выглядеть следующим образом:

    char shift_tbl[27] = "GHIJKLMNOPQRSTUVWXYZABCDEF"; // shift cipher with key = 6

  2. «шифрование» в вашей схеме шифрования не будет работать ,

    • Выход 'M' появляется для двух различных входных символов
    • Есть два возможных выхода для входа 'S'
    • Там нет обработки для символов 'X' и 'Z'
  3. Вы делаете ничего не записывать вывод обратно в файл. Теперь, поскольку вы заменяете каждый отдельный символ одним другим символом, этого достаточно легко выполнить при перезаписи одного и того же файла.

Вот надлежащее осуществление сдвига шифра в C с ключом K = 6:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <ctype.h> 

char shift_tbl_u[27] = "GHIJKLMNOPQRSTUVWXYZABCDEF"; 
char shift_tbl_l[27] = "ghijklmnopqrstuvwxyzabcdef"; 
char encrypt(char inchar) 
{ 
     if(isalpha(inchar) && isupper(inchar)) 
    { 
     return shift_tbl_u[inchar-'A']; 
    } 
    else if(isalpha(inchar) && islower(inchar)) 
    { 
     return shift_tbl_l[inchar-'a']; 
    } 
    return inchar; // non alphabetic = no change; 
} 


int main (void) 
{ 
    FILE *fp = fopen("code.txt", "rb+"); 
    char *buffer = NULL;  
    size_t s_file; 
    int i; 

    if(!fp) 
    { 
     puts("Could not open code.txt"); 
     exit(EXIT_FAILURE); 
    } 

    fseek(fp, 0, SEEK_END); 
    s_file = ftell(fp); 
    rewind(fp); 
    buffer = malloc(s_file + 1); 
    if(!buffer) 
    { 
     perror("malloc"); 
     exit(EXIT_FAILURE); 
    } 

    fread(buffer, 1, s_file, fp); 

    fseek(fp, 0, SEEK_SET); 

    for(i = 0; i < s_file; i++) 
    { 
     char c = encrypt(buffer[i]); 
     fwrite(&c, 1, 1, fp); 
    } 
    free(buffer); 
    buffer = NULL; 

    fclose(fp); 

    return 0; 
} 

Пример использования:

C:\Temp>cl encrypt.c 
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x86 
Copyright (C) Microsoft Corporation. All rights reserved. 

encrypt.c 
Microsoft (R) Incremental Linker Version 14.00.24215.1 
Copyright (C) Microsoft Corporation. All rights reserved. 

/out:encrypt.exe 
encrypt.obj 

C:\Temp>type con > code.txt 
Hello World 
^Z 

C:\Temp>encrypt 

C:\Temp>type code.txt 
Nkrru Cuxrj 

C:\Temp> 

Теперь, вы можете ускорить выполнение эту программу, зашифровав все buffer, прежде чем записывать обратно в fp вместо шифрования и записи одного символа за раз, но вы теперь есть общая идея.

0

Есть некоторые ошибки/маленькие ошибки в вас код:

  1. Это ничего не шифровать, потому что вы ничего не печатать, а кто-то сказал в комментарии вы просто напечатать строку вы читать.
  2. Вы также путались с циклами while в encrypt(): исполнение было застряло в начале первого. СОВЕТ. Если вы не можете найти, где программа не работает, попробуйте распечатать сообщение в разных точках его выполнения, это очень помогает.
  3. Вам не нужны все эти циклы, просто прочитайте строку и зашифруйте каждый символ (это работает с короткими предложениями, чтобы зашифровать длинный текст, этот подход может занять слишком много времени).

Код ниже работает, он берет строку из файла и шифрует ее простой заменой/транспозицией из 6 символов (например, A -> G).

Примечание: ваша предыдущая замена изменилось два различных персонажей в то же

#include <stdio.h> 
#include <string.h> 
#include <ctype.h> 

void encrypt(char inchar) 
{ 
    //Changing chars 
    inchar = inchar + 6; //This is a simple sobstution 

    //print encrypted char 
    printf("%c",inchar); 
} 


int main(int argc, char** argv[]) 
{ 
    FILE *inputFile; 
    char inputBuffer[80]; 
    char *inputPtr = inputBuffer; 
    char inchar; 
    int i; 

    inputFile = fopen("code.txt", "r"); 

    //check file 
    if (inputFile == NULL){ 
     printf("Failed to open\n"); 
     return 0; 
    }else{ 
     //inputFile is valid so I read a string 
     //and store it in inputBuffer 
     fgets(inputBuffer, 80, inputFile); 

     //pass every character of inputBuffer to encrypt() 
     for(i=0; i<strlen(inputBuffer); i++){ 
    encrypt(inputBuffer[i]); 
     } 

    } 

    printf("\n\n"); 
    return 0; 
} 

Я не реализованы все элементы управления на форме символов (прописные, буквенно-цифровой только ЕСС ...), и вы можете изменить легко алгоритм шифрования.

+0

"простая подстановка/транспозиция из 30 символов (например, A -> G)" В каком наборе символов находится G 30 позиции вверх от A? –

+0

Извините, я не очень хорошо объяснил эту точку: в ASCII char 'A' находится 30 позиций позади 'G', код берет символ и шифрует, используя сдвиг 30 позиций, это цезарский шифр со сдвигом 30 https://en.wikipedia.org/wiki/Caesar_cipher – Marco

+0

В ASCII A есть 0x41 (65), а G - 0x47 (71), поэтому A - 6 позиций за G, а не 30 –

 Смежные вопросы

  • Нет связанных вопросов^_^