C++ 程序实现希尔密码
c++server side programmingprogramming
基于线性代数的希尔密码是密码学中的一种多图替代密码。
要加密消息:密钥字符串和消息字符串以矩阵形式表示。然后将它们相乘,对 26 取模。密钥矩阵应该具有逆矩阵才能解密消息。
要解密消息:将加密消息与用于加密的逆密钥矩阵相乘,对 26 取模以获得解密消息。
例如
密钥矩阵
1 0 1 2 4 0 3 5 6
消息字符串"ABC"矩阵形式为 −
0 1 2
用于加密
将上述两个矩阵相乘后,我们得到,
2 4 17
这将是加密消息"CER"
用于解密
密钥矩阵的逆为 −
1.09091 0.227273 -0.181818 -0.545455 0.136364 0.0909091 -0.0909091 -0.227273 0.181818
现在将密钥矩阵的逆矩阵与加密消息矩阵相乘为−
0 1 2
原始消息字符串为‘ABC’。
下面是实现上述示例的 C++ 程序。
算法
开始 函数 getKeyMatrix() 对于 i = 0 到 2 对于 j = 0 到 3 将矩阵 a[i][j] 的元素作为输入。 m[i][j] = a[i][j] done done 将消息字符串作为用户输入。 对于 i = 0 到 2 msg[i][0] = mes[i] - 65 done End Begin Function encrypt() 对于 i = 0 到 2 对于 j = 0 到 0 对于 k = 0 到 2 en[i][j] = en[i][j] + a[i][k] * msg[k][j] 对乘法得到的矩阵的每个元素取模 26,并打印加密消息。 End Begin Function decrypt() 调用函数 inversematrix() 对于 i = 0 到 2 对于 j = 0 到 0 对于 k = 0 到 2 de[i][j] = de[i][j] + b[i][k] * en[k][j] 对乘法结果取模 26 得到原始消息。
示例
#include<iostream> #include<math.h> using namespace std; float en[3][1], de[3][1], a[3][3], b[3][3], msg[3][1], m[3][3]; void getKeyMatrix() { //从用户处获取密钥和消息 int i, j; char mes[3]; cout<<"输入密钥的 3x3 矩阵(应有逆):\n"; for(i = 0; i < 3; i++) for(j = 0; j < 3; j++) { cin>>a[i][j]; m[i][j] = a[i][j]; } cout<<"\n输入一个由 3 个字母组成的字符串(使用 A 到 Z):"; cin>>mes; for(i = 0; i < 3; i++) msg[i][0] = mes[i] - 65; } void encrypt() { //加密消息 int i, j, k; for(i = 0; i < 3; i++) for(j = 0; j < 1; j++) for(k = 0; k < 3; k++) en[i][j] = en[i][j] + a[i][k] * msg[k][j]; cout<<"\n加密后的字符串为:"; for(i = 0; i < 3; i++) cout<<(char)(fmod(en[i][0], 26) + 65); //对乘法得到的矩阵的每个元素取模 26 } void inversematrix() { //求密钥矩阵的逆 int i, j, k; float p, q; for(i = 0; i < 3; i++) for(j = 0; j < 3; j++) { if(i == j) b[i][j]=1; else b[i][j]=0; } for(k = 0; k < 3; k++) { for(i = 0; i < 3; i++) { p = m[i][k]; q = m[k][k]; for(j = 0; j < 3; j++) { if(i != k) { m[i][j] = m[i][j]*q - p*m[k][j]; b[i][j] = b[i][j]*q - p*b[k][j]; } } } } for(i = 0; i < 3; i++) for(j = 0; j < 3; j++) b[i][j] = b[i][j] / m[i][i]; cout<<"\n\n逆矩阵为:\n"; for(i = 0; i < 3; i++) { for(j = 0; j < 3; j++) cout<<b[i][j]<<" "; cout<<"\n"; } } void decrypt() { //解密消息 int i, j, k; inversematrix(); for(i = 0; i < 3; i++) for(j = 0; j < 1; j++) for(k = 0; k < 3; k++) de[i][j] = de[i][j] + b[i][k] * en[k][j]; cout<<"\n解密后的字符串为:"; for(i = 0; i < 3; i++) cout<<(char)(fmod(de[i][0], 26) + 65); //对 26 取模得到原始消息 cout<<"\n"; } int main() { getKeyMatrix(); encrypt(); decrypt(); }
输出
输入密钥的 3x3 矩阵(应有逆矩阵): 1 0 1 2 4 0 3 5 6 输入 3 个字母的字符串(使用 A 到 Z):ABC 加密字符串为:CER 逆矩阵为: 1.09091 0.227273 -0.181818 -0.545455 0.136364 0.0909091 -0.0909091 -0.227273 0.181818 解密字符串为:ABC