希尔(Hill)密码(C语言)

简介

是运用基本矩阵论原理的替换密码,每个字母当作26进制数字:A=0, B=1, C=2… 一串字母当成n维向量,跟一个n×n的矩阵相乘,再将得出的结果mod26。用作加密的矩阵(即密匙)必须是可逆的,否则就不可能译码。只有矩阵的行列式和26互质,才是可逆的。

C语言实现

#include <stdio.h>
#include <string.h>#define MAX 60int main()
{int K1[2][2] = {0}, K2[2][2] = {0};int Temp1[2] = {0}, Temp2[2] = {0};char text[MAX] = {0},result[MAX] = {0};int T1[MAX] = {0}, T2[MAX] = {0};int len, flag=0, temp, temp1, i, j, num=0;/**欢迎**/printf("--------欢迎使用Hill密码-----------\n");printf("请填写明文或者密文\n");scanf("%[^\n]",text);printf("请选择加密方式,输入1加密,输入2解密\n");scanf("%d",&num);printf("请输入密钥k(以空格分开的数组)\n");for(i=0; i<2; i++){for(j=0; j<2; j++){scanf("%d", &K1[i][j]);}}if(num == 1){/**加密**/len = strlen(text);// 当长度为奇数时补齐一位if(len % 2 == 1){text[len] = 'a';len = strlen(text);flag = 1;}// 将大写转成小写,并赋值给T1数组for(i=0; i<len; i++){if(text[i] >= 'A' && text[i] <= 'Z'){text[i] = text[i] + 32;}T1[i] = text[i] - 'a';}// 得到加密后结果,存储在T2中for(i=0; i<len; i+=2){Temp1[0] = T1[i];Temp1[1] = T1[i + 1];// Temp2存储密文int值Temp2[0] = (Temp1[0] * K1[0][0] + Temp1[1] * K1[1][0]) % 26;Temp2[1] = (Temp1[0] * K1[0][1] + Temp1[1] * K1[1][1]) % 26;T2[i] = Temp2[0];T2[i + 1] = Temp2[1];}if(flag == 1){len = len - 1;}for(i=0; i<len; i++){result[i] = T2[i] + 'a';}printf("明文%s的密文为:%s\n",text,result);}else if(num == 2){/**解密**/len = strlen(text);// 当长度为奇数时补齐一位if(len % 2 == 1){text[len] = 'a';len = strlen(text);flag = 1;}for(i=0; i<len; i++){if(text[i] >= 'A' && text[i] <= 'Z'){text[i] = text[i] + 32;}T2[i] = text[i] - 'a';}// 求K的逆temp = -1;for(i=1; temp < 0; i++){temp = (K1[0][0] * K1[1][1] - K1[0][1] * K1[1][0]) + 26 * i;}i = 1;while(1){if((temp * i) % 26 == 1){temp1 = i;break;}else{i++;}}K2[0][0] = K1[1][1] * temp1;K2[0][1] = (((-1 * K1[0][1]) + 26) * temp1) % 26;K2[1][0] = (((-1 * K1[1][0]) + 26) * temp1) % 26;K2[1][1] = K1[0][0] * temp1;// 得到解密后结果,存储在T2中for(i=0; i<len; i+=2){Temp2[0] = T2[i];Temp2[1] = T2[i + 1];// Temp1存储明文int值Temp1[0] = (Temp2[0] * K2[0][0] + Temp2[1] * K2[1][0]) % 26;Temp1[1] = (Temp2[0] * K2[0][1] + Temp2[1] * K2[1][1]) % 26;T1[i] = Temp1[0];T1[i + 1] = Temp1[1];}if(flag == 1){len = len - 1;}for(i=0; i<len; i++){result[i] = T1[i] + 'a';}printf("密文%s的明文为:%s\n",text,result);}return 0;
}

验证

加密

明文:sunday

密钥k:9 6 7 11

解密

密文:qqihme

密钥k:9 6 7 11

希尔(Hill)密码(C语言)相关推荐

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

    "Hill的加密与解密" Hill加密是另一种多字母代替密码,与多表代替密码不同的是,Hill密码要求将明文分成同等规模的若干个分组(最后一个分组涉及到填充),每一个分组被整体的加 ...

  2. 希尔排序及C语言实现

    排序系列之(4)希尔排序及C语言实现 收藏 希尔排序(Shell Sort)也称为递减增量排序算法,是插入排序的一种高速而安定的改良版.因希尔(Donald L. Shell)于1959年提出而得名. ...

  3. 凯撒密码C语言去掉空格字符,凯撒密码C语言实现

    <凯撒密码C语言实现>由会员分享,可在线阅读,更多相关<凯撒密码C语言实现(8页珍藏版)>请在人人文库网上搜索. 1.凯撒密码是一种非常古老的加密方法, 相传当年凯撒大地行军打 ...

  4. hill图matlab代码,Hill密码的加密论文(内含matlab程序代码).doc

    Hill密码的加密论文(内含matlab程序代码) Hill密码的加密,解密与破译 摘要 对于问题1.1:本文采用密码通信,对明文进行加密.利用已知的密钥矩阵,首先,将密文转化为对应表值数字.其次,对 ...

  5. 08:vigenère密码_密码技术:Vigenére密码,Playfair密码,Hill密码

    08:vigenère密码 1)Vigenére密码 (1) Vigenére Cipher) This technique is an example of Polyalphabetic Subst ...

  6. 凯撒密码c语言小写字母,凯撒密码c(c语言编程凯撒密码)

    凯撒密码c(c语言编程凯撒密码) 2020-05-15 13:09:51 共10个回答 #include#includeintmain(){charsave[10][30];inta,b,i,j;sc ...

  7. c语言编写自动生成密码,c语言密码生成.doc

    c语言密码生成 计算机实习报告 一 题目分析 1 实验题目: 实现一个简单的密码生成系统.一个有效的密码由L(3<=L<=15)个小写字母(来自传统的拉丁字母集'a'...'z')组成,至 ...

  8. c语言ATM机文件储存账号密码,C语言ATM(有文件输入输出).doc

    C语言ATM(有文件输入输出) #include "stdio.h" #include "stdlib.h" #include "conio.h&qu ...

  9. 密码学替换密码c语言编程,古典密码学上机实验

    实验一.传统密码算法 一.实验目的及任务 通过编程实现替代密码算法和置换密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础 二.实验环境 运行Windows操作系统的PC机,具有C语言编译环 ...

  10. 洛谷小书童——凯撒密码——c语言

    题目背景 某蒟蒻迷上了"小书童",有一天登陆时忘记密码了(他没绑定邮箱or手机),于是便把问题抛给了神犇你. 题目描述 蒟蒻虽然忘记密码,但他还记得密码是由一个字符串组成.密码是由 ...

最新文章

  1. ndarray.shape[]返回值的意义
  2. PAT甲级题目翻译+答案 AcWing(排序)
  3. ML in Action 决策树
  4. ES基础命令(参照mysql)
  5. Linux中service命令和/etc/init.d/的关系
  6. 计算机设备管理器驱动,驱动技巧:解决设备管理器中声卡驱动安装不正确的问题...
  7. IoT 物联网卡行业骗局大揭秘
  8. 五、肺癌检测-数据集训练 training.py model.py
  9. shell学习(一)简单示例help用法
  10. C语言编写走迷宫小游戏
  11. 如何用计算机计算幅度,电脑计算器计算css布局
  12. 为什么人到中年就危机了呢?
  13. 关于java的反编译的一些坑,反编译后代码中的$+数字是什么
  14. 专访何海涛:“不正经”程序员的进阶之路
  15. 小程序覆盖修改vant-ui的样式
  16. 京瓷晶振停产型号一览表
  17. 如何把多线程下载的数据按位置写入一个文件
  18. 读取mnist数据集方法大全(train-images-idx3-ubyte.gz,train-labels.idx1-ubyte等)(python读取gzip文件)
  19. 话费三网充值系统 三网直冲系统可快慢充值源码
  20. 阿里acp认证考试考试时间、题型和分数都在这

热门文章

  1. centos安装7zip
  2. HCIP-Cloud Service Solutions Architect
  3. ansys workbench汉化教程_ansys16.0软件下载及安装教程
  4. 推荐十款很好用的HTML工具编写软件
  5. Copy On Write(写时复制)
  6. ajax怎么跨域上传图片,ajax上传图片及跨域解决办法(未测试ie)
  7. 给定一个净值序列,计算年化收益、最大回撤、夏普比率
  8. 计算机版本过低如何解决,win7系统ie浏览器提示版本过低的解决方法
  9. Lecture 2 Asymptotic Notation
  10. 《Java从入门到放弃》JavaSE入门篇:面向对象概念(入门版)