lab5
#include <iostream>
#include <vector>
#include <string>
#include <cctype>
using namespace std;
int modInv(int a) {
for (int x = 1; x < 26; ++x)
if ((a * x) % 26 == 1) return x;
return -1;
}
int det(vector<vector<int>>& m) {
return ((m[0][0]*(m[1][1]*m[2][2]-m[1][2]*m[2][1]) -
m[0][1]*(m[1][0]*m[2][2]-m[1][2]*m[2][0]) +
m[0][2]*(m[1][0]*m[2][1]-m[1][1]*m[2][0])) % 26 + 26) % 26;
}
vector<vector<int>> inv(vector<vector<int>>& m) {
int d = modInv(det(m));
vector<vector<int>> r(3, vector<int>(3));
r[0][0] = (m[1][1]*m[2][2] - m[1][2]*m[2][1]) * d % 26;
r[0][1] = -(m[0][1]*m[2][2] - m[0][2]*m[2][1]) * d % 26;
r[0][2] = (m[0][1]*m[1][2] - m[0][2]*m[1][1]) * d % 26;
r[1][0] = -(m[1][0]*m[2][2] - m[1][2]*m[2][0]) * d % 26;
r[1][1] = (m[0][0]*m[2][2] - m[0][2]*m[2][0]) * d % 26;
r[1][2] = -(m[0][0]*m[1][2] - m[0][2]*m[1][0]) * d % 26;
r[2][0] = (m[1][0]*m[2][1] - m[1][1]*m[2][0]) * d % 26;
r[2][1] = -(m[0][0]*m[2][1] - m[0][1]*m[2][0]) * d % 26;
r[2][2] = (m[0][0]*m[1][1] - m[0][1]*m[1][0]) * d % 26;
for (int i = 0; i < 3; ++i)
for (int j = 0; j < 3; ++j)
r[i][j] = (r[i][j] + 26) % 26;
return r;
}
string transform(string text, vector<vector<int>>& key, bool encrypt, string original = "") {
string clean = "";
for (char c : text) if (isalpha(c)) clean += tolower(c);
while (clean.size() % 3 != 0) clean += 'x';
vector<vector<int>> k = encrypt ? key : inv(key);
string result = "";
for (size_t i = 0; i < clean.size(); i += 3) {
vector<int> v = {clean[i]-'a', clean[i+1]-'a', clean[i+2]-'a'};
for (int r = 0; r < 3; ++r)
result += (char)('a' + (k[r][0]*v[0] + k[r][1]*v[1] + k[r][2]*v[2]) % 26);
}
if (!encrypt) {
string final = "";
size_t j = 0;
for (char c : original) {
if (isalpha(c)) {
final += isupper(c) ? toupper(result[j++]) : result[j++];
} else {
final += c;
}
}
return final;
}
return result;
}
int main() {
vector<vector<int>> key(3, vector<int>(3));
cout << "Enter 9 integers for 3x3 key matrix (row-wise):\n";
for (int i = 0; i < 3; ++i)
for (int j = 0; j < 3; ++j)
cin >> key[i][j];
cin.ignore();
string plain;
cout << "Enter the plaintext: ";
getline(cin, plain);
string enc = transform(plain, key, true);
cout << "\nEncrypted: " << enc << endl;
cout << "Decrypted: " << transform(enc, key, false, plain) << endl;
return 0;
}
Comments
Post a Comment