0
  • 説明 暗号文は、平文と鍵の対応する文字を「追加」することによって、平文から生成されます。平文が鍵より短い場合、鍵の一部のみが使用されます。同様に、平文がキーよりも短い場合、キーは複数回使用されます。

    たとえば、プレーンテキスト「HELLO」をキー「CAT」でエンコードするには、次のようにします。

平文:こんにちは

キー:CATCA

暗号文: KFFOP

そして、鍵「FIDO」でプレーンテキスト「DOG」をエンコードするには、次のようにします。

平文:DOG

キー: FID

暗号文:JXK

2 つの文字を一緒に追加するには、次の規則を使用します: A=1、B=2、…、Z=26。2 文字の合計が 26 より大きい場合は、合計から 26 を引きます。例: A + E = 1 + 5 = 6 = F、および D + X = 4 + 24 = 28 = 2 = B。

  • 今私のコードの問題は、キー文字が少ない場合、プレーンテキストをさらにコーディングするためにキー文字を繰り返すことができないことです。キー文字を繰り返す方法は、さらにコーディングが可能ですか?

みんな助けて。

これが私のコードです:

#include<stdio.h>
    #include<string.h>
    int main()
        {
            char str[100],k[50],str1[100];
            int i,n;
            gets(str);// Input plain text. 
            gets(str1);//Input key.
             for(i=0;str[i]!='\0';i++)
                    {
                         n=(str[i]-65+1)+(str1[i]-65+1);//Extracting the numerical position and adding them.
                         if(n>26) //if numerical value exceeds 26 then subtracting 26 from it and getting the numerical value.
                          {
                             n=n-26;
                          }
                         str[i]=n+64;//storing the ciphered character.
                    }

              for(i=0;str[i]!='\0';i++)//printing the ciphered characters.
              printf("%c",str[i]);
              return 0;

        }
4

3 に答える 3

1

モジュラ演算を使用して文字を繰り返すこともできます。

for(i=0;str[i]='\0';i++)
{
    n = (str[i]-65+1 + (str1[i % lenk]-65 +1);    
    n = (n % 26) + 1;
    str[i] = n+64;
    //storing the ciphered character.

}

i % 26は、値 0 から 25 を自動的にローテーションします。

n を 1 から 26 まで回転させる場合にも同じことが適用できます。

于 2015-06-04T20:51:16.140 に答える
1

別のループ変数を使用して、キーの長さに達するたびにキーのインデックスを 0 にすることができます。この場合、変数 j を使用しました。このコードを試してください:

#include<stdio.h>
#include<string.h>
int main()
    {
        char str[100],k[50],str1[100];
        int i,n;
        gets(str);// Input plain text. 
        gets(str1);//Input key.
        int lenk=strlen(str1),j;   //calculate length of key
         for(i=0,j=0;str[i]!='\0';i++,j++)
    {
         if(j==lenk) j=j-lenk;      //make j=0
         n=(str[i]-65+1)+(str1[j]-65+1);    // add str1[j] instead
         if(n>26) 
          {
             n=n-26;
          }
         str[i]=n+64;//storing the ciphered character.

    }

          for(i=0;str[i]!='\0';i++)
          printf("%c",str[i]);
          return 0;

    }

これは大文字に対してのみ機能することに注意してください。小文字のコードを変更する必要があります

于 2015-06-04T11:04:21.657 に答える