El cifrado de Hill es un cifrado de sustitución poligráfico basado en álgebra lineal. Cada letra está representada por un número módulo 26. A menudo se usa el esquema simple A = 0, B = 1, …, Z = 25, pero esta no es una característica esencial de el cifrado Para cifrar un mensaje, cada bloque de n letras (considerado como un vector de n componentes) se multiplica por una array invertible n × n, contra módulo 26. Para descifrar el mensaje, cada bloque se multiplica por la inversa de la array utilizada para encriptación
La array utilizada para el cifrado es la clave de cifrado, y debe elegirse aleatoriamente del conjunto de arrays invertibles n × n (módulo 26).
Ejemplos:
Input : Plaintext: ACT Key: GYBNQKURP Output : Ciphertext: POH
Input : Plaintext: GFG Key: HILLMAGIC Output : Ciphertext: SWK
Cifrado
Tenemos que cifrar el mensaje ‘ACT’ (n=3). La clave es ‘GYBNQKURP’, que se puede escribir como la array nxn:
El mensaje ‘ACT’ se escribe como vector:
El vector cifrado se da como:
que corresponde al texto cifrado de ‘POH’
Descifrado
Para descifrar el mensaje, volvemos a convertir el texto cifrado en un vector, luego simplemente multiplicamos por la array inversa de la array clave (IFKVIVVMI en letras). La inversa de la array utilizada en el ejemplo anterior es:
Para el texto cifrado anterior ‘POH’:
lo que nos devuelve ‘ACT’.
Suponga que todos los alfabetos están en mayúsculas.
A continuación se muestra la implementación de la idea anterior para n=3.
C++
// C++ code to implement Hill Cipher #include <iostream> using namespace std; // Following function generates the // key matrix for the key string void getKeyMatrix(string key, int keyMatrix[][3]) { int k = 0; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { keyMatrix[i][j] = (key[k]) % 65; k++; } } } // Following function encrypts the message void encrypt(int cipherMatrix[][1], int keyMatrix[][3], int messageVector[][1]) { int x, i, j; for (i = 0; i < 3; i++) { for (j = 0; j < 1; j++) { cipherMatrix[i][j] = 0; for (x = 0; x < 3; x++) { cipherMatrix[i][j] += keyMatrix[i][x] * messageVector[x][j]; } cipherMatrix[i][j] = cipherMatrix[i][j] % 26; } } } // Function to implement Hill Cipher void HillCipher(string message, string key) { // Get key matrix from the key string int keyMatrix[3][3]; getKeyMatrix(key, keyMatrix); int messageVector[3][1]; // Generate vector for the message for (int i = 0; i < 3; i++) messageVector[i][0] = (message[i]) % 65; int cipherMatrix[3][1]; // Following function generates // the encrypted vector encrypt(cipherMatrix, keyMatrix, messageVector); string CipherText; // Generate the encrypted text from // the encrypted vector for (int i = 0; i < 3; i++) CipherText += cipherMatrix[i][0] + 65; // Finally print the ciphertext cout << " Ciphertext:" << CipherText; } // Driver function for above code int main() { // Get the message to be encrypted string message = "ACT"; // Get the key string key = "GYBNQKURP"; HillCipher(message, key); return 0; }
Java
// Java code to implement Hill Cipher class GFG { // Following function generates the // key matrix for the key string static void getKeyMatrix(String key, int keyMatrix[][]) { int k = 0; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { keyMatrix[i][j] = (key.charAt(k)) % 65; k++; } } } // Following function encrypts the message static void encrypt(int cipherMatrix[][], int keyMatrix[][], int messageVector[][]) { int x, i, j; for (i = 0; i < 3; i++) { for (j = 0; j < 1; j++) { cipherMatrix[i][j] = 0; for (x = 0; x < 3; x++) { cipherMatrix[i][j] += keyMatrix[i][x] * messageVector[x][j]; } cipherMatrix[i][j] = cipherMatrix[i][j] % 26; } } } // Function to implement Hill Cipher static void HillCipher(String message, String key) { // Get key matrix from the key string int [][]keyMatrix = new int[3][3]; getKeyMatrix(key, keyMatrix); int [][]messageVector = new int[3][1]; // Generate vector for the message for (int i = 0; i < 3; i++) messageVector[i][0] = (message.charAt(i)) % 65; int [][]cipherMatrix = new int[3][1]; // Following function generates // the encrypted vector encrypt(cipherMatrix, keyMatrix, messageVector); String CipherText=""; // Generate the encrypted text from // the encrypted vector for (int i = 0; i < 3; i++) CipherText += (char)(cipherMatrix[i][0] + 65); // Finally print the ciphertext System.out.print(" Ciphertext:" + CipherText); } // Driver code public static void main(String[] args) { // Get the message to be encrypted String message = "ACT"; // Get the key String key = "GYBNQKURP"; HillCipher(message, key); } } // This code has been contributed by 29AjayKumar
Python3
# Python3 code to implement Hill Cipher keyMatrix = [[0] * 3 for i in range(3)] # Generate vector for the message messageVector = [[0] for i in range(3)] # Generate vector for the cipher cipherMatrix = [[0] for i in range(3)] # Following function generates the # key matrix for the key string def getKeyMatrix(key): k = 0 for i in range(3): for j in range(3): keyMatrix[i][j] = ord(key[k]) % 65 k += 1 # Following function encrypts the message def encrypt(messageVector): for i in range(3): for j in range(1): cipherMatrix[i][j] = 0 for x in range(3): cipherMatrix[i][j] += (keyMatrix[i][x] * messageVector[x][j]) cipherMatrix[i][j] = cipherMatrix[i][j] % 26 def HillCipher(message, key): # Get key matrix from the key string getKeyMatrix(key) # Generate vector for the message for i in range(3): messageVector[i][0] = ord(message[i]) % 65 # Following function generates # the encrypted vector encrypt(messageVector) # Generate the encrypted text # from the encrypted vector CipherText = [] for i in range(3): CipherText.append(chr(cipherMatrix[i][0] + 65)) # Finally print the ciphertext print("Ciphertext: ", "".join(CipherText)) # Driver Code def main(): # Get the message to # be encrypted message = "ACT" # Get the key key = "GYBNQKURP" HillCipher(message, key) if __name__ == "__main__": main() # This code is contributed # by Pratik Somwanshi
C#
// C# code to implement Hill Cipher using System; class GFG { // Following function generates the // key matrix for the key string static void getKeyMatrix(String key, int [,]keyMatrix) { int k = 0; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { keyMatrix[i, j] = (key[k]) % 65; k++; } } } // Following function encrypts the message static void encrypt(int [,]cipherMatrix, int [,]keyMatrix, int [,]messageVector) { int x, i, j; for (i = 0; i < 3; i++) { for (j = 0; j < 1; j++) { cipherMatrix[i, j] = 0; for (x = 0; x < 3; x++) { cipherMatrix[i, j] += keyMatrix[i, x] * messageVector[x, j]; } cipherMatrix[i, j] = cipherMatrix[i, j] % 26; } } } // Function to implement Hill Cipher static void HillCipher(String message, String key) { // Get key matrix from the key string int [,]keyMatrix = new int[3, 3]; getKeyMatrix(key, keyMatrix); int [,]messageVector = new int[3, 1]; // Generate vector for the message for (int i = 0; i < 3; i++) messageVector[i, 0] = (message[i]) % 65; int [,]cipherMatrix = new int[3, 1]; // Following function generates // the encrypted vector encrypt(cipherMatrix, keyMatrix, messageVector); String CipherText = ""; // Generate the encrypted text from // the encrypted vector for (int i = 0; i < 3; i++) CipherText += (char)(cipherMatrix[i, 0] + 65); // Finally print the ciphertext Console.Write("Ciphertext: " + CipherText); } // Driver code public static void Main(String[] args) { // Get the message to be encrypted String message = "ACT"; // Get the key String key = "GYBNQKURP"; HillCipher(message, key); } } // This code is contributed by Rajput-Ji
Javascript
<script> // Javascript code to implement Hill Cipher // Following function generates the // key matrix for the key string function getKeyMatrix(key,keyMatrix) { let k = 0; for (let i = 0; i < 3; i++) { for (let j = 0; j < 3; j++) { keyMatrix[i][j] = (key[k]).charCodeAt(0) % 65; k++; } } } // Following function encrypts the message function encrypt(cipherMatrix,keyMatrix,messageVector) { let x, i, j; for (i = 0; i < 3; i++) { for (j = 0; j < 1; j++) { cipherMatrix[i][j] = 0; for (x = 0; x < 3; x++) { cipherMatrix[i][j] += keyMatrix[i][x] * messageVector[x][j]; } cipherMatrix[i][j] = cipherMatrix[i][j] % 26; } } } // Function to implement Hill Cipher function HillCipher(message, key) { // Get key matrix from the key string let keyMatrix = new Array(3); for(let i=0;i<3;i++) { keyMatrix[i]=new Array(3); for(let j=0;j<3;j++) keyMatrix[i][j]=0; } getKeyMatrix(key, keyMatrix); let messageVector = new Array(3); for(let i=0;i<3;i++) { messageVector[i]=new Array(1); messageVector[i][0]=0; } // Generate vector for the message for (let i = 0; i < 3; i++) messageVector[i][0] = (message[i]).charCodeAt(0) % 65; let cipherMatrix = new Array(3); for(let i=0;i<3;i++) { cipherMatrix[i]=new Array(1); cipherMatrix[i][0]=0; } // Following function generates // the encrypted vector encrypt(cipherMatrix, keyMatrix, messageVector); let CipherText=""; // Generate the encrypted text from // the encrypted vector for (let i = 0; i < 3; i++) CipherText += String.fromCharCode(cipherMatrix[i][0] + 65); // Finally print the ciphertext document.write(" Ciphertext: " + CipherText); } // Driver code // Get the message to be encrypted let message = "ACT"; // Get the key let key = "GYBNQKURP"; HillCipher(message, key); // This code is contributed by rag2127 </script>
Producción:
Ciphertext: POH
De manera similar, puede escribir el código para descifrar el mensaje cifrado siguiendo los pasos explicados anteriormente.
Referencia: https://en.wikipedia.org/wiki/Hill_cipher
Publicación traducida automáticamente
Artículo escrito por DamanAnand y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA