本文概述
- C ++
- Java
- Python3
- C#
用于加密的矩阵是密码密钥, 应从一组可逆的n×n矩阵(模数为26)中随机选择。
例子:
Input: Plaintext: ACTKey: GYBNQKURPOutput : Ciphertext: POH
Input: Plaintext: GFGKey: HILLMAGIC Output : Ciphertext: SWK
加密
我们必须对消息" ACT"(n = 3)进行加密。密钥为" GYBNQKURP", 可以将其写为nxn矩阵:
文章图片
消息" ACT"被写为矢量:
文章图片
加密的向量为:
文章图片
对应于" POH"的密文
解密
为了解密消息, 我们将密文转换回向量, 然后简单地乘以密钥矩阵的逆矩阵(字母为IFKVIVVMI)。上例中使用的矩阵的逆为:
文章图片
对于先前的密文" POH":
文章图片
这使我们返回" ACT"。
假定所有字母均大写。
以下是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 CipherkeyMatrix = [[ 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] % 26def 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
输出如下:
Ciphertext: POH
以类似的方式, 你可以按照上述步骤编写用于解密加密消息的代码。
【希尔密码指南和代码实现详解】参考:
https://en.wikipedia.org/wiki/Hill_cipher
推荐阅读
- D3.js arc.innerRadius()函数用法介绍
- 在C++中使用STL进行数组的所有排列
- 道德黑客简要概论
- 原型设计和制作模型 – 软件工程
- 算法设计(将所有零移动到数组末尾详细代码实现)
- PHP array_diff_uassoc()函数用法介绍
- JavaScript日期Date对象函数参考
- 35款最佳免费音乐制作软件应用推荐合集(你最喜欢哪个())
- C语言中的wait系统调用详细指南