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,一经查实,立即删除!

相关文章

python背景怎么自定义铃声_Python 上课铃声的定时播放(具有较强的自我管理能力.jpg)...

为了在家安心学习&#xff0c;我决定写一段代码播放上课的铃声。之前中学时就希望有一个这样的软件&#xff0c;周末就可以高效学习了。但是网上搜不到相关软件&#xff0c;当时也不会写代码&#xff0c;就用闹钟来代替了。现在自己写一个试试。原本我是用C写的&#xff0c;但后…

那些地方会用C语言多线程,如何用C语言实现多线程

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Windows操作系统&#xff0c;C语言实现多线程&#xff1a;#include #include DWORD APIENTRY ThreadOne ( LPVOID threadArg ){printf ( "线程开始啦&#xff0c;参数是&#xff1a;%s\n" , (char *)threadArg );return …

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的过程。与此…

c语言字符串未初始化strcat,C语言中字符串常用函数strcat与strcpy的用法介绍

strcpy原型声明&#xff1a;extern char *strcpy(char* dest, const char *src);头文件&#xff1a;#include 功能&#xff1a;把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间说明&#xff1a;src和dest所指内存区域不可以重叠且dest必须有足够的空间来容…

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;生产管理是企业的组…

android 对话框 图片,android – AlertDialog按钮的图像

由于不推荐使用onPrepareDialog,因此您可以使用onShowListener.你也应该设置Drawable边界,或者它将被放置在最左边.下面的代码输出public class MyDialog extends DialogFragment {Overridepublic Dialog onCreateDialog(Bundle savedInstanceState) {final AlertDialog dialog…

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

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

Windows 8.1 Windows Phone 开发环境安装遇到的问题

以前使用 Windows 8 开装 WP 8 的开发环境&#xff0c;很是顺利。 将系统升级到 Windows 8.1 后&#xff0c;先是安装了 Windows 8.1 旗舰本&#xff0c;安装后发现没有 Hyper-V 功能。 换成企业版&#xff0c;确定有 Hyper-V 功能后&#xff0c;安装 VS2010 WP8 SDK 后&#x…

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)中需要…

python数独代码_python 实现计算数独

输入文件格式&#xff1a;008309100900060004007504800036000540001000600042000970005907300600010008004608200输出结果&#xff1a;yuan********************0 0 8 3 0 9 1 0 09 0 0 0 6 0 0 0 40 0 7 5 0 4 8 0 00 3 6 0 0 0 5 4 00 0 1 0 0 0 6 0 00 4 2 0 0 0 9 7 00 0 5…

MyEclipse配色字体等配置的解决方案

Myeclipse黑色配色方案&#xff08;精心修改版&#xff09; http://download.csdn.net/detail/rehongchen/6579945 如何改变Myeclipse编辑区背景色 http://my.oschina.net/epiclight/blog/465506 -------------------------------------------------------------------------…

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

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

python pp模块_python常用模块

1、re模块re模块用于对python的正则表达式的操作1.1 什么是正则正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说&#xff1a;正则就是用来描述一类事物的规则。(在Python中)它内嵌在Python中&#xff0c;并通过 re 模块实现。正…

[Leetcode]@python 90. Subsets II.py

题目链接 https://leetcode.com/problems/subsets-ii/ 题目原文 Given a collection of integers that might contain duplicates, nums, return all possible subsets. Note: Elements in a subset must be in non-descending order. The solution set must not contain dupli…

android glu,我可以使用glu与Android NDK

Does OpenGL ES not have glu?OpenGL ES 1.1&#xff1a;#include #include OpenGL ES 2.0&#xff1a;#include #include Is there a port I can use?是的&#xff0c;Android的部分端口为GLU – GLU ES(支持gluErrorString&#xff0c;gluPerspective和许多其他功能)&#…

线程间通信 GET POST

线程间通信有三种方法&#xff1a;NSThread GCD NSOperation 进程&#xff1a;操作系统里面每一个app就是一个进程、 一个进程里面可以包含多个线程&#xff0c;并且我们每一个app里面有且仅有一条主线程。scrollViewDelegate 的方法 &#xff1a; &#xff08;UIView *&…