Computer >> Máy Tính >  >> Lập trình >> C ++

Chương trình C ++ để triển khai Vigenere Cypher

Vigenere Cipher là một loại phương pháp thay thế đa pha để mã hóa văn bản chữ cái.

Bảng mật mã Vigenere được sử dụng trong đó các bảng chữ cái từ A đến Z được viết thành 26 hàng, để mã hóa và giải mã trong phương pháp này.

Chương trình C ++ để triển khai Vigenere Cypher

Mã hóa

Chìa khóa: CHÀO MỪNG

Thông báo: Điểm hướng dẫn này

Ở đây, chúng ta phải lấy một khóa bằng cách lặp lại khóa đã cho cho đến khi độ dài của nó bằng với độ dài thông báo ban đầu.

Để mã hóa, hãy lấy chữ cái đầu tiên của tin nhắn và khóa, tức là T và W. Lấy bảng chữ cái trong Bảng mật mã Vigenere trong đó hàng T và cột W trùng khớp với nhau, tức là P.

Lặp lại quy trình tương tự cho tất cả các bảng chữ cái còn lại trong văn bản tin nhắn.

Cuối cùng, văn bản tin nhắn được mã hóa là -

Tin nhắn được mã hóa: PLTUWEXQXZTWMPOTZKBF.

Văn bản mật mã có thể được tạo bằng phương trình dưới đây.

Ei =(Pi + Ki) mod 26

Ở đây P là văn bản thuần túy và K là khóa.

Giải mã

Chìa khóa: CHÀO MỪNG

Tin nhắn được mã hóa: PLTUWEXQXZTWMPOTZKBF

Lấy khóa đã tạo và bảng chữ cái đầu tiên của tin nhắn mã hóa, tức là P và W. Phân tích Bảng mật mã Vigenere, tìm bảng chữ cái P trong cột W, hàng tương ứng sẽ là bảng chữ cái đầu tiên của tin nhắn gốc, tức là T.

Lặp lại quy trình này cho tất cả các bảng chữ cái trong tin nhắn được mã hóa.

Thông báo gốc:Thisistutorialspoint

Điều này có thể được biểu diễn dưới dạng đại số bằng phương trình sau.

Pi =(Ei - Ki + 26) mod 26

Đây là một chương trình C ++ để triển khai mật mã Vigenere.

Thuật toán

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

Ví dụ

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

Đầu ra

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