古典密码(Hill加密算法)

希尔(Hill)加密是一种多字母代替的分组加密技术,通过线性变换将明文分组转换为密文。文章介绍了希尔密码的加密与解密原理,使用密钥矩阵进行操作,并给出了具体源程序示例。希尔密码由于其分组特性,有效隐藏了单字母频率,提高了安全性。然而,对于已知明文的攻击较为脆弱。

      “Hill的加密与解密” 


wKiom1b06QajKGjaAAAqLz5Pxr4581.png

       Hill加密是另一种多字母代替密码,与多表代替密码不同的是,Hill密码要求将明文分成同等规模的若干个分组(最后一个分组涉及到填充),每一个分组被整体的加密代换,即希尔密码属于分组加密。Hill密码的算法思想是:将一个分组中的d个连续的明文字母通过线性变换转换为d个密文字母。这种变换由d个线性方程决定,其中每个字母被分配一个数值(0,1,。。。,25)。解密只需要做一次逆变换就可以了,密钥就是变换矩阵本身。


       设明文为一维矩阵m,密文为一维矩阵c,密钥用k矩阵表示,则:

wKioL1b057mQ0rzVAAAdTWnxYAQ682.png

即密文分组=明文分组*密钥矩阵。


       本程序使用的密钥是:

wKiom1b06CTSjgy9AAAZnz97wrs097.png


      下面是具体的源程序:

—头文件: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) + 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值