1 #include

2 #include

3 #include

4 #include

5 #include

6 #include

7 #include

8 using namespacestd;9

10 //定义一些常变量

11 const int M = 26; //定义集合{a,b,...,z}的26个英文字母12

13 //行和列均为5

14 const int ROW = 5;15 const int COL = 5;16

17 //定义5*5的加密矩阵

18 intK[ROW][COL];19

20 //定义5*5的解密矩阵

21 intD[ROW][COL];22

23 int P[ROW]; //明文单元

24 int C[ROW]; //密文单元

25 int F[ROW]; //密文解密后的单元26

27 //三元组gcd(a,b) = ax + by = d

28 structGCD29 {30 intx;31 inty;32 intd;33 };34

35 classHill_Cipher36 {37 public:38 //产生随机矩阵

39 voidrandom_Matrix();40 //求矩阵的行列式

41 int Det(int matrix[ROW][ROW],introw);42

43 //求两个数的最大公约数

44 int gcd(int a,intb);45

46 /*

47 *判断矩阵K是否在模26的情况下可逆48 *因为矩阵在模26的情形下存在可逆矩阵的充分必要条件是49 *gcd(det K,26) = 150 */

51 bool Inverse(intmatrix[ROW][ROW]);52

53 //矩阵相乘

54 void multiphy(int matrix[ROW][ROW],int p[ROW],introw);55

56 //求出伴随矩阵

57 void adjoint_matrix(int matrix[ROW][ROW],introw);58

59 //将明文加密为密文

60 string encryption(stringplaintext);61

62 //将密文解密为明文(为了辨识清楚,我们统一以小写字母作为明文,大写字母作为密文)

63 string deciphering(stringciphertext);64

65 //欧几里得算法求模的逆

66 GCD extended_Euclid(int a,intb);67

68 //模逆运算

69 int inverse(int a,intm);70

71 //由于C++不存在负数取模的内置函数,现在自己设定一个72 //定义一个模M的值

73 int Mod(inta);74 };75

76 voidHill_Cipher::random_Matrix()77 {78 inti,j;79 for(i = 0;i < ROW;i++)80 {81 for(j = 0;j < COL;j++)82 {83 K[i][j] = rand() % 26; //产生一个5*5模26的矩阵

84 }85 }86 cout << "随机产生5*5的矩阵:" <

97 //求矩阵的行列式

98 int Hill_Cipher::Det(int matrix[ROW][ROW],introw)99 {100 inti,j;101 int cofa[ROW][ROW]; //用于存放余子阵

102 int l; //l为所递归的余子阵的行

103 int p = 0,q = 0;104 int sum=0;105

106 //由于行和列相同(方阵),所以行列式的值一定存在,故不需要判断是否为方阵107

108 //递归基

109 if(row == 1)110 return matrix[0][0];111 for(i = 0;i < row; i++)112 {113 for(l = 0;l < row - 1;l++)114 {115 if(l

118 p=1;119 for(j = 0;j< row - 1;j++)120 {121 cofa[l][j] = matrix[l + p][j + 1];122 }123 }124 //相当于(-1)^i

125 if(i % 2 == 0)126 q=1;127 else

128 q=(-1);129 sum = sum + matrix[i][0] * q * Det(cofa,row - 1);130 }131 returnsum;132 }133

134 //求两个数的最大公约数

135 int Hill_Cipher::gcd(int a,intb)136 {137 inttemp;138 //交换两个数的大小,使得a为较大数

139 if(a

154 /*

155 *判断矩阵K是否在模26的情况下可逆156 *因为矩阵在模26的情形下存在可逆矩阵的充分必要条件是157 *gcd(det K,26) = 1158 */

159 bool Hill_Cipher::Inverse(intmatrix[ROW][ROW])160 {161 if(gcd(Det(matrix,ROW),M) == 1)162 return true;163 else

164 return false;165 }166

167 void Hill_Cipher::multiphy(int matrix[ROW][ROW],int p[ROW],introw)168 {169 inti,j;170 //先将密文单元清零

171 memset(C,0,sizeof(C));172 for(i = 0;i < ROW;i++)173 {174 for(j = 0;j < ROW;j++)175 {176 C[i] += P[j] *K[j][i];177 }178 }179 }180

181 //将明文加密为密文

182 string Hill_Cipher::encryption(stringplaintext)183 {184 inti;185 stringciphertext;186 //将字符串转化为明文数组

187 for(i = 0;i < ROW;i++)188 {189 P[i] = plaintext[i] - 'a';190 }191 multiphy(K,P,ROW);192 //将密文数组转化为密文

193 for(i = 0;i < ROW;i++)194 //这里先将其模26,再翻译为对应的字母

195 {196 C[i] =Mod(C[i]);197 ciphertext += C[i] + 'A';198 }199 returnciphertext;200 }201

202 //求出伴随矩阵

203 void Hill_Cipher::adjoint_matrix(int matrix[ROW][ROW],introw)204 {205 inti,j,k,l;206 intp,q;207 p = q = 0;208 inttemp[ROW][ROW];209 for(i = 0;i < ROW;i++)210 {211 for(j = 0;j < ROW;j++)212 {213 for(k = 0;k < ROW - 1;k++)214 {215 if(k

218 p = 1;219 for(l = 0;l < ROW - 1;l++)220 {221 if(l

224 q = 1;225 temp[k][l] = matrix[k+p][l+q];226 }227 }228 D[j][i] = (int)pow(-1,(double)i+j)*Det(temp,ROW-1);229 D[j][i] =Mod(D[j][i]);230 }231 }232 }233

234 //将密文解密为明文(为了辨识清楚,我们统一以小写字母作为明文,大写字母作为密文)

235 string Hill_Cipher::deciphering(stringciphertext)236 {237 //求出矩阵的逆

238 stringtext;239 int determinant =Det(K,ROW);240 int inver = inverse(determinant,26);241 adjoint_matrix(K,ROW); //伴随矩阵

242 cout << "行列式的值:" << determinant <

253 }254 for(i = 0;i < ROW;i++)255 text += F[i] + 'a';256 returntext;257 }258

259 GCD Hill_Cipher::extended_Euclid(int a,intb)260 {261 GCD aa,bb;262 if(b == 0)263 {264 aa.x = 1;265 aa.y = 0;266 aa.d =a;267 returnaa;268 }269 else

270 {271 bb = extended_Euclid(b,a%b);272 aa.x =bb.y;273 aa.y = bb.x - (a / b) *bb.y;274 aa.d =bb.d;275 }276 returnaa;277 }278

279 int Hill_Cipher::inverse(int a,intm)280 {281 GCD aa;282 aa =extended_Euclid(a,m);283 returnaa.x;284 }285

286 int Hill_Cipher::Mod(inta)287 {288 return a >= 0 ? a % M : (M + a %M);289 }290

291 intmain()292 {293 inti,j;294 Hill_Cipher hh;295 cout << "使用希尔密码进行消息的加解密:" <

297 //srand()函数产生一个以当前时间开始的随机种子.以保证每次产生的随机数矩阵都不相同

298 srand((unsigned)time(0));299 hh.random_Matrix();300 while(!hh.Inverse(K))301 {302 cout << "该矩阵模26不可逆,不可以作为密钥!" <

309 //利用所选密钥,对给定的5元明文信息进行加解密

310 stringplaintext,ciphertext;311 cout << "请输入5元明文信息:" <>plaintext;313 ciphertext =hh.encryption(plaintext);314 cout <

319 cout << "***输入0:退出 ***" <

326 charc;327 while(cin >>c)328 {329 if(c == '0')330 {331 cout <

374 {375 cout << "***输入0:退出 ***" <

hill密码 java_希尔密码(Hill Cipher)的实现相关推荐

  1. 明文攻击之猪圈密码、希尔密码..

    猪圈密码是一种以格子为基础的简单替代式密码.即使使用符号,也不会影响密码分析,亦可用在其它替代式的方法.右边的例子,是把字母填进格子的模样. The core elements of this sys ...

  2. 动态密码 java_动态密码TOTP的Java实现

    一.HOTP HOTP 算法,全称是"An HMAC-Based One-Time Password Algorithm",是一种基于事件计数的一次性密码生成算法,详细的算法介绍可 ...

  3. 密码安全之密码技术【2】替代密码

    密码学 一门研究设计密码算法和破译密码算法的综合性技术科学,是网络空间安全学科中理论体系最完善的一门科学,也是信息安全的基石.密码学通常由密码编码和密码分析两大分支组成. 从密码学的发展历史来看,可以 ...

  4. C++希尔密码Hill Cipher算法(附完整源码)

    希尔密码Hill Cipher的算法 希尔密码(Hill Cipher) 的算法的完整源码(定义,实现,main函数测试) 希尔密码(Hill Cipher) 的算法的完整源码(定义,实现,main函 ...

  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++希尔密码的实现以及运用

    希尔密码(Hill Cipher)是运用基本矩阵论原理的替换密码,由Lester S. Hill在1929年发明.每个字母当作26进制数字:A=0, B=1, C=2... 一串字母当成n维向量,跟一 ...

  7. 古典密码算法 java_古典密码算法的实现

    1.古典密码可以分为代替密码和置换密码两种,这里实现了代替密码中的仿射变换和置换密码中的换位变换. 2.仿射变换: 加密过程:e(x) = ax + b (mod m) 解密过程:d(e(x)) = ...

  8. Visual Studio 2019下用 C# 实现 Hill2 二阶希尔密码 的加密、解密 GUI界面

    1.什么是Hill2 什么是Hill密码 希尔密码(Hill)使用每个字母在字母表中的顺序作为其对应的数字,即 A=0,B=1,C=2 等,然后将明文转化为 n 维向量,跟一个 n × n 的矩阵相乘 ...

  9. 希尔密码在CTF中应用—记一道题

    CTF-crypto 解题思路来自:i春秋的大佬们 https://bbs.ichunqiu.com/forum.php?mod=viewthread&tid=52687&highli ...

  10. JavaScript实现希尔密码 算法(附完 整源码)

    JavaScript实现希尔密码 算法 Matrix.js完整源代码 hillCipher.js完整源代码 hillCipher.test.js完整源代码 Matrix.js完整源代码 export ...

最新文章

  1. 【Sql Server】DateBase-视图
  2. centos 7配置firewall防火墙的地址伪装和端口转发实例
  3. stm32IAP代码升级小结
  4. jekyll网站上传服务器,jekyll 高效搭建个人博客之完整流程
  5. POJ - 1220 NUMBER BASE CONVERSION(高精度运算+进制转换+模拟)
  6. [css] CSS3中的transition是否可以过渡opacity和display?
  7. 二叉树学习笔记--先序遍历
  8. Java中的位运算符、移位运算
  9. CSS3 动画 animation属性
  10. JAVA定时器ScheduledExecutorService中,scheduleAtFixedRate和scheduleWithFixedDelay的区别
  11. (转)MTK 消息分发及窗口管理
  12. Jsp与Servlet面试题
  13. 京东支付-付款码支付测试不通原因在这
  14. 软考高项比中项在难度上高多少?
  15. Win7系统电脑怎么设置桌面壁纸全屏显示
  16. 记一次mykings暗云挖矿木马的排查与解决
  17. javascript-异步之Promise then和catch
  18. 功放与喇叭的匹配原则
  19. Python爬虫练习:去爬某平台音乐
  20. linux关闭8080端口,Linux修改iptables,取消8080的访问限制

热门文章

  1. HCIPHCIE【2019-4月-更新增加新题】221 65道新题
  2. 微模块、冷通道监控系统解决方案
  3. 怎样提高文章原创度,被快速收录?
  4. 如意淘商品推荐技术介绍之二:高级技术
  5. 微信小程序 java网上购物商城系统
  6. 手机抓包 fiddler 配置
  7. phpQuery中文手册(更新中)
  8. 使用phpQuery轻松采集网页内容
  9. signature=928c561b85c7b57c8e64bdeb4a18b1f1,专注于Win7系列作品汇总(月版)
  10. java:从入门到放弃(二)