希尔密码加密解密

希尔密码加密解密原理:

希尔密码是运用基本矩阵论原理的替换密码。每个字母当作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,16)

         (8,3) *K mod 26=(2,5)

        (0,24) *K mod 26=(10,20)

(4)将密文编码转换为对应的密文字母,即pq,cf,ku

解密过程为:

(1)将密文分为两两一组:pq,cf,ku

(2)将密文字母转换为对应的编码:(15,16),(2,5),(10,20)

(3)分别计算每一组密文对应的明文编码(K-1位K的逆矩阵)

         (15,16)*K-1 mod 26 =(5,17)

         (2,5) *K -1mod 26=(8,3)

         (10,20) *K-1 mod 26=(0,24)

(4)将明文编码转换为明文字母,完成解密。

因此有上述可知,主要计算过程为矩阵相乘和求一个矩阵的逆矩阵。下面程序为逆矩阵的求法,矩阵相乘比较简单。

//逆矩阵求法
#include 
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());
}

 

你可能感兴趣的:(C语言加密解密)