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

`