希尔密码加密解密原理:
希尔密码是运用基本矩阵论原理的替换密码。每个字母当作26进制数字:A=0,B=1...一串字母当成n维向量,跟一个n×n的矩阵相乘,再将得出的结果MOD 26。注意用作加密的矩阵(即密钥)必须是可逆的,否则就不可能译码。只有矩阵的行列式和26互质,才是可逆的。
例如:设分组长度n=2,密钥为:K={7,9;8,3},明文为:friday
加密过程为:
(1)将明文分为两两一组(因为n=2):fr,id,ay
(2)将明文字母转换为对应的明文编码:(5,17),(8,3),(0,24)
(3)分别计算每一组明文对应的密文编码:
(5,17)*K mod 26 =(15,18)
(8,3) *K mod 26=(2,5)
(0,24) *K mod 26=(10,20)
(4)将密文编码转换为对应的密文字母,即pq,cf,ku
解密过程为:
(1)将密文分为两两一组:pq,cf,ku
(2)将密文字母转换为对应的编码:(15,18),(2,5),(10,20)
(3)分别计算每一组密文对应的明文编码(K-1位K的逆矩阵)
(15,18)*K-1 mod 26 =(5,17)
(2,5) *K -1mod 26=(8,3)
(10,20) *K-1 mod 26=(0,24)
(4)将明文编码转换为明文字母,完成解密。
因此有上述可知,主要计算过程为矩阵相乘和求一个矩阵的逆矩阵。下面程序为逆矩阵的求法,矩阵相乘比较简单。
//逆矩阵求法
#include <bits/stdc++.h>
using namespace std;
int n;
double a[100][100];
double calc()
{
int i, j, k;
double p;
for (i = 0; i < n; i++)
{
for (j = i + 1; j < n; j++)
{
p = a[j][i] / a[i][i];
for (k = i; k < n; k++)
{
a[j][k] -= a[i][k] * p;
}
}
}
double s = 1.0;
for (i = 0; i < n; i++)
s *= a[i][i];
return s;
}
int main()
{
scanf("%d", &n);
int i, j;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
scanf("%lf", &a[i][j]);
}
}
printf("%lf\n", calc());
}