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

Popular posts from this blog

lab1

lab8

lab9