2016-04-19 18 views
-1

私はこの問題にアプローチする方法が本当にわかりません。また、文字Aが含まれている場合、暗号化された文字は平文と同じになりますが、これは必ずしも悪いことではありません。 このアルゴリズムを鉛筆と紙で実装するには、多くの説明でVigenèreSquareを作成するようにお願いします。ただし、コンピュータを使用してエンコーディングとデコードを行う場合は、これは実際には必要ありません。 基本的に、キーワードは平文の上に繰り返し繰り返し書き込まれます。アセンブリヴィジュネル暗号プログラム

キーワードがCRYPTOGRAMであるとします。

CRYPTOGRAMCRYPTOGRAMCRYPTOGRAMCRYPTOGRAMCRYPTOGRAMCRYPTOGRAMCRYPTOGR WEHAVEBEENBETRAYEDALLISDISCOVEREDFLYATONCEMEETUSBYTHEOLDTREEATNINEPM

は文字が上に文字が以下の文字を使用する れるシーザー-CYPHERを決定25に0の番号が付されていることを考慮してください。したがって、Cはアルファベットを2、Aを0にシフトすることを意味します。数学的には、2つの文字をモジュロ26で加算しています(モジュラ演算の概念は一般的に1553年に兵士によって理解されなかったので使用されました)。

メッセージを復号化するには、逆。つまり、キーワード文字の の値が加算されるのではなく減算されます。手順3.コードで行うべきこと

  1. コードでは、入出力にSTDINとSTDOUTを使用する必要があります。 (これは の既定値です)コマンドラインでリダイレクトを使用してファイルから読み取り、 ファイルに書き込みます。

  2. あなたのコードはファイルを開き、それを文字単位で読んで、 配列に保存する必要があります。あなたがキーワードの暗号文を使用してヴィジュネル暗号と 配列の内容をエンコードする必要があり、ファイルの末尾に到達すると

  3. 、それは をプリントアウト。

  4. 大文字と小文字の区別を維持し、 はアルファベット以外の文字を変更しません。これはあなたのメッセージ のセキュリティにはあまり適していませんが、結果はきれいに見えます。

  5. このプログラムはglibc機能を使用する必要があります。 printf()に加えて、 にはgetchar()とputchar()が必要です。

  6. 入力ファイルにASCIIテキストだけが含まれていると仮定します。 がテキスト以外のファイルで発生することについて心配しないでください。

  7. エンコーダが動作したら、コードを複製してデコーダに組み込み、 を減算に変更します。

  8. printf()を使用して配列を出力する場合は、文字列にヌル終了記号 が必要です。

+3

スタートのような小さな部品に問題を分解することによって:

あなたが苦労している場合は、ここで問題 を打破する一つの方法である(同じように良いです他の方法があります) "stdinからの入力の読み取り"、 "文字列の暗号化"、 "charの暗号化"、 "出力を標準出力に出力する" –

+0

質問は 'c'と' assembly'の両方にタグ付けされています。アセンブリ言語が必要であるという問題はありません。コードへのすべての参照には、標準的なc関数が含まれます。 –

+0

@KlasLindbäckの言うところは、複雑なタスクと同じです。分割してください。それは部分的に分割されているようですので、どのサブタスクに問題がありますか? –

答えて

0

スタート「stdoutに印刷出力」「stdinからの入力を読み込む」、「文字列を暗号化」のような小さな部品に問題を分解することもできます。

モジュラス演算子は、プログラムで複数回使用する必要があるため、モジュラス演算子に慣れている必要があります。

/* For printf, getchar etc: */ 
#include <stdio.h> 
/* For isalpha, isupper, islower etc: */ 
#include <ctype.h> 

char encryptChar(char ch, char cypher) { 
    int shiftBy = cypher - 'A'; 
    char encryptedLetter; 

    /* There are 3 cases: uppercase, lowercase, other char */ 
    if (isupper(ch)) { 
     /* add code to encrypt uppercase char */ 
    } else if (islower(ch)) { 
     /* add code to encrypt lowercase char */ 
    } else { 
     /* Other characters stay as they are */ 
     encryptedLetter = ch; 
    } 
    return encryptedLetter; 
} 

char *cypherString = "CRYPTOGRAM"; 

int main(int argc, char **argv) { 
    int ch; 
    int cypherStringLength = strlen(cypherString); 
    int counter = 0; 
    char cypher; 

    while ((ch = getchar()) != EOF) { 
     cypher = cypherString[counter%cypherStringLength]; 
     ch = encryptChar(ch, cypher); 
     /* Add code to print the character */ 

     counter++; 
    } 
    return 0; 
} 
+0

申し訳ありませんが、私はそれを言及していませんでしたが、アセンブリ内にコードを書く必要があります – user142743

+0

あなたはまだあなたの問題が何かを指定していません。それはアルゴリズムですか、それともアセンブリ言語ですか?それがアルゴリズムなら、私の答えが役に立つかもしれません。アセンブリ言語の場合は、いくつかの簡単な演習から始めてから、もう一度試してみることをお勧めします。 –