Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรม C ++ เพื่อใช้งาน Vigenere Cypher


Vigenere Cipher เป็นวิธีการแทนที่แบบหลายตัวอักษรในการเข้ารหัสข้อความตัวอักษร

ตารางรหัส Vigenere ใช้โดยที่ตัวอักษรจาก A ถึง Z เขียนเป็น 26 แถว สำหรับการเข้ารหัสและถอดรหัสในวิธีนี้

โปรแกรม C ++ เพื่อใช้งาน Vigenere Cypher

การเข้ารหัส

คีย์: ยินดีต้อนรับ

ข้อความ: Thisisttutorialspoint

ที่นี่เราต้องรับคีย์โดยทำซ้ำคีย์ที่กำหนดจนกว่าความยาวจะเท่ากับความยาวของข้อความต้นฉบับ

สำหรับการเข้ารหัส ให้ใช้อักษรตัวแรกของข้อความและคีย์ เช่น T และ W นำตัวอักษรใน Vigenere Cipher Table โดยที่แถว T และคอลัมน์ W ตรงกัน เช่น P.

ทำซ้ำขั้นตอนเดียวกันสำหรับตัวอักษรที่เหลืออยู่ทั้งหมดในข้อความ

สุดท้าย ข้อความที่เข้ารหัสคือ −

ข้อความที่เข้ารหัส: PLTUWEXQXZTWMPOTZKBF

ข้อความรหัสสามารถสร้างได้จากสมการด้านล่าง

Ei =(Pi + Ki) mod 26

โดยที่ P คือข้อความธรรมดา และ K คือคีย์

ถอดรหัส

คีย์: ยินดีต้อนรับ

ข้อความที่เข้ารหัส: PLTUWEXQXZTWMPOTZKBF

นำคีย์ที่สร้างขึ้นและตัวอักษรตัวแรกของข้อความที่เข้ารหัส เช่น P และ W. วิเคราะห์ Vigenere Cipher Table มองหาตัวอักษร P ในคอลัมน์ W แถวที่เกี่ยวข้องจะเป็นตัวอักษรตัวแรกของข้อความต้นฉบับ เช่น T.

ทำขั้นตอนนี้ซ้ำสำหรับตัวอักษรทั้งหมดในข้อความที่เข้ารหัส

ข้อความต้นฉบับ:Thisistutorialspoint

ซึ่งสามารถแสดงในรูปแบบพีชคณิตโดยทำตามสมการ

Pi =(Ei – Ki + 26) mod 26

นี่คือโปรแกรม C++ เพื่อใช้รหัส Vigenere

อัลกอริทึม

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