C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

ヴィジュネル暗号を実装するためのC++プログラム


Vigenere Cipherは、アルファベットのテキストを暗号化する一種の多表式置換方法です。

この方法での暗号化と復号化には、AからZまでのアルファベットが26行で書き込まれるVigenereCipherTableが使用されます。

ヴィジュネル暗号を実装するためのC++プログラム

暗号化

キー: ようこそ

メッセージ: Thisistutorialspoint

ここでは、指定されたキーの長さが元のメッセージの長さと等しくなるまで、そのキーを繰り返してキーを取得する必要があります。

暗号化の場合は、メッセージの最初の文字とキー(TとW)を取得します。V行とW列が一致するVigenere Cipher Tableのアルファベット(P)を取得します。

メッセージテキストの残りのすべてのアルファベットに対して同じプロセスを繰り返します。

最後に、暗号化されたメッセージテキストは-

暗号化されたメッセージ: PLTUWEXQXZTWMPOTZKBF。

暗号文は以下の式で生成できます。

Ei =(Pi + Ki)mod 26

ここで、Pはプレーンテキストであり、Kはキーです。

復号化

キー: ようこそ

暗号化されたメッセージ: PLTUWEXQXZTWMPOTZKBF

生成されたキーと暗号化されたメッセージの最初のアルファベット、つまりPとWを取得します。VigenereCipherTableを分析し、列WでアルファベットPを探します。対応する行は、元のメッセージの最初のアルファベット、つまりTになります。

暗号化されたメッセージのすべてのアルファベットに対してこのプロセスを繰り返します。

元のメッセージ:Thisistutorialspoint

これは、次の方程式によって代数形式で表すことができます。

Pi =(Ei – Ki + 26)mod 26

これは、Vigenere暗号を実装するためのC++プログラムです。

アルゴリズム

Begin
   Function encryption(string t)
   for i = 0, j = 0 to t.length() - 1
      char c = t[i]
      if (c >= 'a' and c <= 'z')
         c = c + 'A' - 'a'
      else if (c < 'A' or c > 'Z')
         continue
      output = output + (c + k[j] ) % 26 + 'A'
      j = (j + 1) % k.length()
   return output
End
Begin
   Function decryption(string t)
   for i = 0, j = 0 to t.length() - 1
      char c = t[i]
      if (c >= 'a' and c <= 'z')
         c = c + 'A' - 'a'
      else if (c < 'A' or c > 'Z')
         continue
      output =output + (c - k[j] + 26) % 26 + 'A'
      j = (j + 1) % k.length()
   return output
End

#include <iostream>
#include <string>
using namespace std;
class Vig {
   public:
      string k;
   Vig(string k) {
      for (int i = 0; i < k.size(); ++i) {
         if (k[i] >= 'A' && k[i] <= 'Z')
            this->k += k[i];
         else if (k[i] >= 'a' && k[i] <= 'z')
            this->k += k[i] + 'A' - 'a';
      }
   }
   string encryption(string t) {
      string output;
      for (int i = 0, j = 0; i < t.length(); ++i) {
         char c = t[i];
         if (c >= 'a' && c <= 'z')
            c += 'A' - 'a';
         else if (c < 'A' || c > 'Z')
            continue;
         output += (c + k[j] - 2 * 'A') % 26 + 'A'; //added 'A' to bring it in range of ASCII alphabet [ 65-90 | A-Z ]
         j = (j + 1) % k.length();
      }
      return output;
   }
   string decryption(string t) {
      string output;
      for (int i = 0, j = 0; i < t.length(); ++i) {
         char c = t[i];
         if (c >= 'a' && c <= 'z')
            c += 'A' - 'a';
         else if (c < 'A' || c > 'Z')
            continue;
         output += (c - k[j] + 26) % 26 + 'A';//added 'A' to bring it in range of ASCII alphabet [ 65-90 | A-Z ]
         j = (j + 1) % k.length();
      }
      return output;
   }
};
int main() {
   Vig v("WELCOME");
   string ori ="Thisistutorialspoint";
   string encrypt = v.encryption(ori);
   string decrypt = v.decryption(encrypt);
   cout << "Original Message: "<<ori<< endl;
   cout << "Encrypted Message: " << encrypt << endl;
   cout << "Decrypted Message: " << decrypt << endl;
}

出力

Original Message: Thisistutorialspoint
Encrypted Message: PLTUWEXQXZTWMPOTZKBF
Decrypted Message: THISISTUTORIALSPOINT

  1. AVLツリーを実装するためのC++プログラム

    AVLツリーは自己平衡二分探索木であり、左右のサブツリーの高さの差がすべてのノードで複数になることはありません。 ツリーの回転は、AVLツリーの要素の順序を妨げることなく構造を変更する操作です。ツリー内で1つのノードを上に移動し、1つのノードを下に移動します。これは、ツリーの形状を変更したり、小さいサブツリーを下に移動したり、大きいサブツリーを上に移動したりして高さを低くしたりするために使用され、多くのツリー操作のパフォーマンスが向上します。回転の方向は、木のノードが移動する側に依存しますが、他の人は、どの子がルートの場所をとるかに依存すると言います。これは、AVLツリーを実装するためのC+

  2. STLにSet_Symmetric_differenceを実装するC++プログラム

    これは、set_symmetric_differenceを実装するためのC++プログラムです。 2つのセットの対称差は、一方のセットには存在するが、もう一方のセットには存在しない要素によって構築されます。 一般的な集合演算は-です セットユニオン 交差点を設定 対称集合の差または排他的論理和 差または減算を設定 アルゴリズム Begin    Declare set vector v and iterator st.   Initialize st = set_symmetric_difference (set1, set1 + n, set2, se