hill密码源代码c语言,古典密码(Hill加密算法)(示例代码)

“Hill的加密与解密”

fa3bdf3e10c7a54cb1a3cb46f81a7dfc.png

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

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

e2b1942bd43cdc098cca5aaf099aeb0f.png

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

本程序使用的密钥是:

2816d6dbe8fece9e0675b471beac6818.png

下面是具体的源程序:—头文件:classical.h

#pragma once

//古典密码之希尔加密

#include 

#include 

#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 

{

for (int j = 0; 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 

{

for (int k2 = 0; k2 

{

if (k1 

{

arr[k1][k2] = *(*(K + k1) + k2);

}

else if (k1  j)

{

arr[k1][k2 - 1] = *(*(K + k1) + k2);

}

else if (k1 > i && k2 > j)

{

arr[k1 - 1][k2 - 1] = *(*(K + k1) + k2);

}

else if (k1 > i && k2 

{

arr[k1 - 1][k2] = *(*(K + k1) + k2);

}

}

}

left = arr[1][1] * arr[2][2] * arr[0][0] + arr[0][1] * arr[1][2] * arr[2][0]

+ arr[1][0] * arr[2][1] * arr[0][2];

right = arr[0][2] * arr[1][1] * arr[2][0] + arr[0][1] * arr[1][0] * arr[2][2]

+ arr[0][0] * arr[1][2] * arr[2][1];

num = pow((double)(-1), (i + 1) + (j + 1)) * (left - right);

return num;

}

int* answer(int(*K)[COL], int * str, int det)      //希尔解密

{

int ptr[ROW][COL] = { 0 };     //ptr为逆矩阵

int* ans = (int *)calloc(sizeof(int), 4);

int sum = 0;

int sub = 0;

int bag = 0;

for (int i = 0; i 

{

for (int j = 0; j 

{

bag = fun(i, j, K) / (det);

if (bag 

{

ptr[j][i] = (26 + bag) % (26);

}

else

{

ptr[j][i] = bag % (26);

}

}

}

for (int i = 0; i 

{

for (int j = 0; j 

{

sum = (*(str + j)) * ptr[j][i];

sub = sub + sum;

}

ans[i] = (ans[i] + sub) % 26;

sub = 0;

}

return ans;

}

void menu()      //菜单

{

printf("      ——古典密码          \n\n");

printf("**********   1.加密    *******\n");

printf("**********   2.解密    *******\n");

printf("**********   0:退出    *******\n");

printf("请选择:");

}

char* inputclear()       //输入明文

{

printf("请输入明文:");

char num[20] = {‘\n‘};

char *ptr = num;

int i = 0;

char ch;

fflush(stdin);      //清除缓冲区

while ((ch = getchar()) != ‘\n‘)

{

num[i] = ch;

i++;

}

return ptr;

}

char* inputsecret()       //输入密文

{

printf("请输入密文:");

char num[20] = { ‘\n‘ };

char *ptr = num;

int i = 0;

char ch;

fflush(stdin);      //清除缓冲区

while ((ch = getchar()) != ‘\n‘)

{

num[i] = ch;

i++;

}

return ptr;

}

void judge(int n, int(*K)[4])     //处理加密或解密

{

char *ptr, *pln;

int src[20];

int num[4] = { 0 };

int *parr = NULL;

int *pnum = NULL;

int det = -1;     //计算K的行列式的值

switch (n)

{

case 1:                                 //加密

ptr = inputclear();

for (int i = 0; i 

{

if (*ptr != ‘\n‘ && *ptr != EOF)

{

src[i] = *(ptr + i) - ‘A‘;

}

else

{

break;

}

}

printf("加密后得到的密文:");

pnum = src;

while (*pnum >= 0 && *pnum <= 25)

{

for (int i = 0; i 

{

num[i] = *(pnum + i);

}

parr = plus(K, num);

for (int j = 0; j 

{

printf("%c", *(parr+j) + ‘A‘);

}

pnum = pnum + ROW;

}

printf("\n");

free(parr);

break;

case 2:

pln = inputsecret();

for (int i = 0; i 

{

if (*pln != ‘\n‘ && *pln != EOF)

{

src[i] = *(pln + i) - ‘A‘;

}

else

{

break;

}

}

printf("解密后得到的明文:");

pnum = src;

while (*pnum >= 0 && *pnum <= 25)

{

for (int i = 0; i 

{

num[i] = *(pnum + i);

}

parr = answer(K, num, det);

for (int j = 0; j 

{

printf("%c", *(parr + j) + ‘A‘);

}

pnum = pnum + ROW;

}

printf("\n");

free(parr);

break;

case 0:

exit(EXIT_FAILURE);

default:

break;

}

}

—源文件:test.cpp

#define _CRT_SECURE_NO_WARNINGS 1

//希尔加密

#include 

#include 

#include "classical.h"

int main()

{

int K[4][4] = { { 8, 6, 9, 5 }, { 6, 9, 5, 10 }, { 5, 8, 4, 9 }, { 10, 6, 11, 4 } };   //密钥

int left=K[0][0] * K[1][1] * K[2][2] * K[3][3] + K[1][0] * K[0][3] * K[3][2] * K[2][1]+ K[2][0] * K[3][1] * K[0][2] * K[1][3] + K[3][0] * K[0][1] * K[1][2] * K[2][3];

int right = K[0][3] * K[1][2] * K[2][1] * K[3][0] + K[0][0] * K[1][3] * K[2][2] *

K[3][1]+ K[0][1] * K[1][0] * K[2][3] * K[3][2] + K[0][2] * K[1][1] * K[2][0] * K[3][3];

int n = 0;

menu();

scanf("%d", &n);

judge(n, K);

system("pause");

return 0;

}

—运行结果:

Hill加密:

eb42044603c94d066230ed68ef719d38.png

Hill解密:

36c0e79bc33ae23dd07da65bb9061d92.png

很明显,Hill密码将解密的长消息分组,分组的长度取决于密钥矩阵的维数,Hill密码的强度在于完全隐藏了单字母的频率。字母和数字的对应也可以更改为其他的方案,使得不容易攻击成功。一般来说,对抗仅有密文的攻击强度较高,但易受到已知明文攻击。

本文出自 “无心的执着” 博客,谢绝转载!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430864.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AWK高级编程 转载

AWK高级编程 转载 转载自&#xff1a;http://blog.csdn.net/wzhwho/article/details/5513791 1. 程序元素 一个awk 程序是一对以模式(pattern) 与大括号框起来的操作(action) 组合而成的&#xff0c;或许&#xff0c;还会加上实现操作细节的函数(function ) 。针对每个匹配于输…

tensor判断是否相等_PyTorch的Tensor(中)

背景在PyTorch的Tensor系列上一篇文章中&#xff1a;Gemfield&#xff1a;PyTorch的Tensor&#xff08;上&#xff09;​zhuanlan.zhihu.comGemfield介绍了一个Tensor的创建过程&#xff0c;特别是在创建一个Tensor的时候&#xff0c;调用栈从Python到C再回到Python的过程。与此…

charles抓包工具使用指南

前言移动APP抓包PC端抓包查看模式其他功能问题汇总1、 前言&#xff1a; Charles是一款抓包修改工具&#xff0c;相比起burp&#xff0c;charles具有界面简单直观&#xff0c;易于上手&#xff0c;数据请求控制容易&#xff0c;修改简单&#xff0c;抓取数据的开始暂停方便等等…

android电视打印信息解析,关于液晶电视打印信息

原来是波特率的原因。。换了个波特率显示正常了&#xff0c;下面这个是红灯亮不开机的酷开k2打印信息&#xff0c;有老师能解释一下怎么看吗JHello world!{m3a} svn-r(Apr 2 2015 19:53:30)init_hwsetting_cpre_hwsetting_cpost_hwsetting_cparse hw setting DONE!internal ro…

bzoj1269 文本编辑器 splay

直接搞棵splay就行了&#xff0c;不要把光标弄到树中而是把光标当成询问或操作区间的端点标志这样会简单很多。 7点40分写到9点20分&#xff0c;包括调试总共花了一个小时40分钟&#xff0c;这次是自己独立调出来的&#xff0c;总算对splay有一定的了解。 设计操作&#xff1a;…

sap bom递归_SAP软件之化工行业特点01

作者&#xff1a;阿long声明&#xff1a;本文章仅用于SAP软件的应用、学习沟通&#xff0c;不代表SAP公司&#xff1b;文中所示截图来源SAP软件&#xff0c;相应著作权归SAP所有。SPA中关于制造的几种介绍2020.06.29简单的说&#xff0c;制造业中&#xff0c;生产管理是企业的组…

并发事务正确性的准则 可串行化_从0到1理解数据库事务(上):并发问题与隔离级别...

最近准备写一篇关于Spanner事务的分享&#xff0c;所以先分享一些基础知识&#xff0c;涉及ACID、隔离级别、MVCC、锁&#xff0c;由于太长&#xff0c;只好拆分成上下两篇&#xff1a;上&#xff1a;并发问题与隔离级别主要讲事务所要解决的问题、思路&#xff0c;先理解为什么…

android eclipse services,Eclipse中调试Android Framework本地代码模块部分过程记录

环境&#xff1a;Amlogic S905M2 ubunt12.04 win7 adt_bundle_linux Android SDK过程&#xff1a;1.为避免用Eclipse基础版本(Luna)后需要安装包括adt、cdt等插件麻烦&#xff0c;直接解压adt_bundle_linux安装IDE环境2.调试准备&#xff1a;目标设备(Amlogic S905M2)中需要…

android studio内置终端,Android Studio Terminal xx不是内部或者外部命令

背景在使用AS工具自带命令面板Terminal的时候&#xff0c;相信你有碰到过&#xff1a;xx不是内部或者外部命令&#xff0c;也不是可运行程序。解决办法就是配置环境变量一、在 Terminal 中使用 adb&#xff0c;报 adb 不是内部或者外部命令&#xff0c;也不是可运行的程序。解决…

svm预测结果为同一个值_SVM算法总结

一、1.感知机模型&#xff1a;感知器模型是SVM、神经网络、深度学习等算法的基础;感知器模型就是试图找到一条直线&#xff0c;能够把所有的“1”类和“-1”类分隔开&#xff0c;如果是高维空间中&#xff0c;感知器模型寻找的就是一个超平面&#xff0c;能够把所有的二元类别分…

iOS 动画绘制线条颜色渐变的折线图

效果图 .................... 概述 现状 折线图的应用比较广泛&#xff0c;为了增强用户体验&#xff0c;很多应用中都嵌入了折线图。折线图可以更加直观的表示数据的变化。网络上有很多绘制折线图的demo&#xff0c;有的也使用了动画&#xff0c;但是线条颜色渐变的折线图的…

android使碎片切换界面,玩转Android中的碎片Fragment

引言&#xff1a;在Android开发中&#xff0c;我们都知道一些界面的展示经常会用到的就是Activity,但是Activity存在着很大的局限性,比如说手机上的界面显示在平板上面就会发生各种变形的问题,Activity也无法实现局部的数据刷新,所以Android3.0之后出来了Fragment,Fragment通常…

html GPS坐标实现,JavaScript 实现GPS坐标点距离计算(两个经/纬度间的距离计算)...

在LBS(基于位置服务)的一些应用中&#xff0c;有时我们会需要计算两个用户或两个坐标点之间的距离。要解决这类问题&#xff0c;就要了解空间几何的概念并结合数学中在三角函数公式计算两点之间的值。本文介绍基于经度/纬度的&#xff0c;两个坐标点之间的距离计算&#xff0c;…

机器学习基于skcilearn tensorflow电子书_Tensorflow机器学习模型的跨平台上线

本篇文章转载自博客园&#xff0c;作者: 刘建平Pinard在用PMML实现机器学习模型的跨平台上线中&#xff0c;我们讨论了使用PMML文件来实现跨平台模型上线的方法&#xff0c;这个方法当然也适用于tensorflow生成的模型&#xff0c;但是由于tensorflow模型往往较大&#xff0c;使…

html5 observer api,基于HTML5新特性Mutation Observer实现编辑器的撤销和回退操作

MutationObserver介绍MutationObserver给开发者们提供了一种能在某个范围内的DOM树发生变化时作出适当反应的能力.该API设计用来替换掉在DOM3事件规范中引入的Mutation事件.Mutation Observer(变动观察器)是监视DOM变动的接口。当DOM对象树发生任何变动时&#xff0c;Mutation …

Maven(五)使用Nexus搭建Maven私服

文章装载于&#xff1a;http://blog.csdn.net/jun55xiu/article/details/39497089 Nexus介绍 Nexus是Maven仓库管理器&#xff0c;如果你使用Maven&#xff0c;你可以从Maven中央仓库下载所需要的构件&#xff08;artifact&#xff09;&#xff0c;但这通常不是一个好的做法&am…

计算机学测打多少字,速度测试,一分钟能打多少字?

六、速度测试——检验学习效果经过一段时间的练习&#xff0c;输入速度提高了不少吧&#xff0c;赶快来测试一下现在一分钟可以输入多少英文或汉字。金山打字通2010的“速度测试”功能不仅有基本的“屏幕对照”速度测试&#xff0c;还有“书本对照”测试及要求较高的“同声录入…

HDFS入门(1)

2015.07.12笔记 1.HDFS Distributed File System&#xff08;操作系统实现人机交互&#xff0c;最重要的功能是文件管理&#xff0c;使用文件管理系统&#xff0c;windows、Linux文件管理系统有共性&#xff1a;用户可创建文件/夹&#xff0c;删除&#xff0c;修改权限&#xf…

竞赛图 计算机网络 应用题,我校学子获2020年“中国高校计算机大赛-网络技术挑战赛”全国总决赛一等奖(图)...

近日&#xff0c;2020年“中国高校计算机大赛-网络技术挑战赛”全国总决赛在温州浙南科技城落下帷幕。我校计算机与信息安全学院陈俊彦、雷晓春老师指导的“智载车队”团队(成员&#xff1a;林楷浩、陈澳格、黄湖)在创业先锋C系列中获得全国一等奖&#xff0c;在创新创意A系列中…

建立远程桌面连接计算机无密码,win7远程桌面空密码的步骤_win7系统如何设置让远程桌面登录无需密码-win7之家...

在日常工作中&#xff0c;可能经常会使用到远程连接桌面功能&#xff0c;我们要远程桌面的话&#xff0c;通常是要输入密码才可以的&#xff0c;但是有些用户觉得麻烦&#xff0c;那么win7系统如何设置让远程桌面登录无需密码呢&#xff1f;带着大家的这个问题&#xff0c;本文…