2016-12-08 1 views
0

私は、cで代替暗号を作成して、テキストファイルから文字を読み取り、暗号化します。ただし、プログラムを実行すると、ファイル内のテキストは暗号化されません。しかし、私は正確に何が欠けているのか分かりません。すべての助けをいただければ幸いです。C Substitution 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'sでなければなりません。さもなければ、AをGに、GをUに、UをDに変更します.A、G、Uの全てをD 。 –

+0

私が意味することは、暗号化しないことです。すみませんでした。 – Alaska

答えて

1

あなたのプログラムがファイルの内容を変更することができます何もしないため、ファイルが変更されません。

暗号化された文字を印刷すると(putchar()を使用)、ファイル書き込みコードはありません。

書き込みのために2番目のファイルを開いて、そこに結果の文字を書き込む必要があります。その後、作業が完了したら、入力したファイルの名前を変更して、必要に応じて入力ファイルを置き換えることができます。

0

あなたがやっていること(とあなたが求めていること)にはいくつか問題があります。

  1. あなたのencrypt機能は実際にシフト暗号ではありません。シフト暗号は、キーがKの暗号化方式です。 K < alphabet_size各文字は、アルファベット(ラップアラウンド)の文字で置き換えられます。Kあなたのencrypt関数で持っているものは、より多くのスクランブリング暗号です。

    実際のシフトキー6で暗号、例えば、英語のアルファベット、次のようになります。

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

  2. あなたの暗号化方式では、「暗号化」は、仕事に行くのではありません。

    • 出力'M'は、入力'S'
    • のための2つの可能な出力があります
    • あなたがやっている文字'X''Z'
  3. には取り扱いがありません二つの異なる文字入力のために表示されます出力をファイルに書き戻すものは何もありません。今では、個々の文字を1つの他の文字に置き換えているので、同じファイルを上書きするときには簡単に実行できます。

    #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; 
    } 
    

    使用例:ここでは

キー= 6KとCにおける適切なシフト暗号の実装です

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をすべて暗号化してから、一度に1文字ずつ暗号化して書き込むのではなく、fpに書き戻します。今、一般的なアイデアを持っている。

0

がありますいくつかのエラー/あなたのコードではほとんどミス:

  1. 何も印刷されませんので、それは何を暗号化しません 誰かがコメントで言ったようにあなたがちょうどあなたがきた文字列を印刷読む。
  2. また、encrypt()のwhileループと混同しています。最初の起動時に実行が停止していました。 ヒント:プログラムが動作しない場所を見つけることができない場合は、実行の異なるポイントでメッセージを印刷しようとします。これは多くの役に立ちます。
  3. 文字列を読み込んですべての単一文字を暗号化するだけで、このループをすべて行う必要はありません(長い文章を暗号化するには時間がかかる)。

以下のコードは、ファイルから文字列を取り出し、6文字の単純な置換/転置(たとえばA→G)で暗号化します。

注:以前の置換が、私は文字形式上の任意のコントロールを実装していませんでした(大文字、英数のみ、ECC ...)、あなたが変更することができ、同じ

#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までです。 –

+0

申し訳ありませんが私はその点を説明していません:ASCII文字で 'A'は 'G'の後ろに30ポジション、コードは文字を取って、30ポジションのシフトを使用して暗号化、それは30のシフトを持つシーザー暗号です: /en.wikipedia.org/wiki/Caesar_cipher – Marco

+0

ASCIIでは、Aは0x41(65)で、Gは0x47(71)であるため、AはGの後ろの6桁ではありません。 –