Hill Cipher (original) (raw)
`//Driver Code Starts using System; using System.Collections.Generic;
class GfG {
//Driver Code Ends
// Find modular inverse static int modInverse(int a) { a %= 26;
for(int x = 1; x < 26; x++)
if((a * x) % 26 == 1)
return x;
return 1;}
// Compute inverse key matrix static void inverseKey(int[,] key, int[,] invKey) { int det = key[0,0]*(key[1,1]*key[2,2]-key[1,2]key[2,1]) - key[0,1](key[1,0]*key[2,2]-key[1,2]key[2,0]) + key[0,2](key[1,0]*key[2,1]-key[1,1]*key[2,0]);
det = (det % 26 + 26) % 26;
int invDet = modInverse(det);
// Adjoint matrix * inverse determinant
invKey[0,0] = (key[1,1]*key[2,2]-key[1,2]*key[2,1]) * invDet % 26;
invKey[0,1] = (key[0,2]*key[2,1]-key[0,1]*key[2,2]) * invDet % 26;
invKey[0,2] = (key[0,1]*key[1,2]-key[0,2]*key[1,1]) * invDet % 26;
invKey[1,0] = (key[1,2]*key[2,0]-key[1,0]*key[2,2]) * invDet % 26;
invKey[1,1] = (key[0,0]*key[2,2]-key[0,2]*key[2,0]) * invDet % 26;
invKey[1,2] = (key[0,2]*key[1,0]-key[0,0]*key[1,2]) * invDet % 26;
invKey[2,0] = (key[1,0]*key[2,1]-key[1,1]*key[2,0]) * invDet % 26;
invKey[2,1] = (key[0,1]*key[2,0]-key[0,0]*key[2,1]) * invDet % 26;
invKey[2,2] = (key[0,0]*key[1,1]-key[0,1]*key[1,0]) * invDet % 26;}
// Decrypt cipher and return message vector static List decrypt(string cipher, int[,] invKey) { int[] cipherVector = new int[3]; List messageVector = new List();
// Convert cipher to numbers
for(int i = 0; i < 3; i++)
cipherVector[i] = cipher[i] % 65;
// Matrix multiplication
for(int i = 0; i < 3; i++)
{
int value = 0;
for(int j = 0; j < 3; j++)
value += invKey[i,j] * cipherVector[j];
messageVector.Add((value % 26 + 26) % 26);
}
return messageVector;}
//Driver Code Starts
static void Main() { string cipher = "POH";
int[,] key = {
{6,24,1},
{13,16,10},
{20,17,15}
};
int[,] invKey = new int[3,3];
inverseKey(key, invKey);
List<int> message = decrypt(cipher, invKey);
// Print decrypted text
Console.Write("Decrypted Text: ");
foreach(int x in message)
Console.Write((char)(x + 65));} } //Driver Code Ends
`