“Hill的加密与解密”
Hill加密是另一种多字母代替密码,与多表代替密码不同的是,Hill密码要求将明文分成同等规模的若干个分组(最后一个分组涉及到填充),每一个分组被整体的加密代换,即希尔密码属于分组加密。Hill密码的算法思想是:将一个分组中的d个连续的明文字母通过线性变换转换为d个密文字母。这种变换由d个线性方程决定,其中每个字母被分配一个数值(0,1,。。。,25)。解密只需要做一次逆变换就可以了,密钥就是变换矩阵本身。
设明文为一维矩阵m,密文为一维矩阵c,密钥用k矩阵表示,则:
即密文分组=明文分组*密钥矩阵。
本程序使用的密钥是:
下面是具体的源程序:
—头文件:classical.h
#pragma once
//古典密码之希尔加密
#include <math.h>
#include <string.h>
#define ROW 4 //行
#define COL 4 //列
int* plus(int(*K)[COL], int * num) //进行加密
{
int *arr = (int *)calloc(sizeof(int),4);
int sum = 0;
int sub = 0;
for (int i = 0; i < ROW; i++) //1*4的行列式与4*4的行列式相乘
{
for (int j = 0; j < COL; j++)
{
sum = (*(num + j)) * (*(*(K + j) + i));
sub = sub + sum;
}
arr[i] = (arr[i] + sub) % 26;
sub = 0;
}
return arr;
}
int fun(int i, int j, int(*K)[COL]) //求伴随矩阵
{
int num = 0;
int arr[ROW][COL] = { 0 };
int left = 0;
int right = 0;
for (int k1 = 0; k1 < ROW; k1++)
{
for (int k2 = 0; k2 < COL; k2++)
{
if (k1 < i && k2 < j)
{
arr[k1][k2] = *(*(K + k1) +