转发注明出处:http://www.cnblogs.com/0zcl/p/6106513.html

前言:

hill密码算法我打算简要介绍就好,加密矩阵我用教材上的3*3矩阵,只做了加密,解密没有做,不过我觉得会加密就会解密的~~

     

一、hill算法原理

hill密码是一种多字母替代密码,由数学学Leste Hill于1929年研制成功。该密码算法取m个连续的明文字母,并用m个密文字母代替,用向量或矩阵表示为(这里取m=3,C和P是长度为3的列向量,K是3*3矩阵):

即:C=KP  (C为密文,P为明文,K为密钥矩阵)

PS:加密操作要执行模26运算

二、加密规则

加密规则也不难的,就是有个矩阵运算(忘了可以谷哥一下,和线代有关~)

  1. 对明文进行分组,每3个字母一组,不足则字母Z(我设定的,下面编程也是补Z)
  2. 进行矩阵运算,对每组字母求密文

举例:

对pay more money进行加密,明文的前3个字母表示为:pay=(15  0  24)T

计算密文的过程:K(15  0  24)T=(375  819  486)Tmod 26=(11  13  18)T=LNS

依此类推,可得密文为LNS HDL EWM TRW

三、编程与思路

思路请看我画的流程图,网址http://processon.com/diagraming/583aff30e4b086d1e7d3b617

 源代码

  1. #加密密钥矩阵
  2. K_LIST = [[17, 17, 5],
  3. [21, 18, 21],
  4. [2, 2, 19]]
  5.  
  6. #26个字母列表:方便找出对应下标
  7. ALPHABET = ["A","B","C","D","E","F","G",
  8. "H","I","J","K","L","M","N",
  9. "O","P","Q","R","S","T","U",
  10. "V","W","X","Y","Z"]
  11.  
  12. def get_index(alphabet):
  13. """
  14. 获得字母在字母表中的对应位置(下标)
  15. :param alphabet: 明文字母
  16. :return: 下标
  17. """
  18. alphabet = alphabet.upper()
  19. return ALPHABET.index(alphabet)
  20.  
  21. def deal_index(list_index):
  22. """
  23. 加密处理C=KP
  24. :param list_index: 每一组明文字母的下标
  25. :return: 加密后密文的下标
  26. """
  27. deal_list = [0,0,0]
  28. for i in range(len(K_LIST)):
  29. for j in range(len(K_LIST[i])):
  30. deal_list[i] += list_index[j] * K_LIST[i][j]
  31. deal_list[i] = (deal_list[i] % 26)
  32. return deal_list
  33.  
  34. def get_alphabet(deal_list):
  35. """
  36. 通过字母的下标获得对应字母
  37. :param deal_list: 下标的列表
  38. :return: 返回密文字母列表
  39. """
  40. cipher_list = []
  41. for i in deal_list:
  42. cipher_list.append(ALPHABET[i])
  43. return cipher_list
  44.  
  45. def encryption(clear_text):
  46. """
  47. 加密时调用的函数
  48. :param clear_text:输入的明文
  49. :return: 加密后的密文
  50. """
  51. list_clear_text = list(clear_text.strip().replace(" ", ""))
  52. print(list_clear_text)
  53. #明文每3个一组,不足则补充字母Z
  54. for i in range(len(list_clear_text)):
  55. if i % 3 == 0 and i+2 > len(list_clear_text)-1: # 越界,则需在最后一组不足3个补字母Z
  56. if i+1 > len(list_clear_text)-1:
  57. list_clear_text.insert(i + 1, "Z")
  58. list_clear_text.insert(i + 2, "Z")
  59. print(list_clear_text)
  60. cipher_list = [] #用来存入密文
  61. #明文每3个为一组,找出每组在字母表中的位置(用一个列表来保存)
  62. for i in range(len(list_clear_text)):
  63. if i % 3 == 0 and i+2 <= len(list_clear_text)-1:
  64. x = get_index(list_clear_text[i])
  65. y = get_index(list_clear_text[i+1])
  66. z = get_index(list_clear_text[i+2])
  67. list_index = [x, y, z]
  68. print(list_index)
  69. #调用deal_inde函数进行加密 矩阵K与明文P运算得到密文C,即C=KP
  70. deal_list = deal_index(list_index)
  71. #print(deal_list) #测试用的
  72. part_cipher_list = get_alphabet(deal_list) #返回一组密文
  73. cipher_list.extend(part_cipher_list)
  74. #print(part_cipher_list) #测试用的
  75.  
  76. print(cipher_list)
  77. return "".join(cipher_list)
  78.  
  79. def decryption():
  80. print("解密未实现...")
  81.  
  82. if __name__ == "__main__":
  83. while True:
  84. choice = input("Please input E for encryption or D for decryption:")
  85. if choice == "E":
  86. clear_text = input("请输入明文:")
  87. print("加密成功!密文:%s" % encryption(clear_text))
  88. if choice == "D":
  89. cipher_text = input("请输入密文:")
  90. decryption()

测试

  1. Please input E for encryption or D for decryption:E
  2. 请输入明文:pay more money
  3. ['p', 'a', 'y', 'm', 'o', 'r', 'e', 'm', 'o', 'n', 'e', 'y']
  4. ['p', 'a', 'y', 'm', 'o', 'r', 'e', 'm', 'o', 'n', 'e', 'y']
  5. [15, 0, 24]
  6. [12, 14, 17]
  7. [4, 12, 14]
  8. [13, 4, 24]
  9. ['L', 'N', 'S', 'H', 'D', 'L', 'E', 'W', 'M', 'T', 'R', 'W']
  10. 加密成功!密文:LNSHDLEWMTRW
  11. Please input E for encryption or D for decryption:payp
  12. Please input E for encryption or D for decryption:E
  13. 请输入明文:payy
  14. ['p', 'a', 'y', 'y']
  15. ['p', 'a', 'y', 'y', 'Z', 'Z']
  16. [15, 0, 24]
  17. [24, 25, 25]
  18. ['L', 'N', 'S', 'W', 'X', 'B']
  19. 加密成功!密文:LNSWXB
  20. Please input E for encryption or D for decryption:D
  21. 请输入密文:LNSWXB
  22. 解密未实现...
  23. Please input E for encryption or D for decryption:

信息安全-2:python之hill密码算法[原创]的更多相关文章

  1. 信息安全-1:python之playfair密码算法详解[原创]

    转发注明出处: http://www.cnblogs.com/0zcl/p/6105825.html 一.基本概念 古典密码是基于字符替换的密码.加密技术有:Caesar(恺撒)密码.Vigenere ...

  2. javascript实现playfair和hill密码算法

    时至期末,补习信息安全概论作业.恰巧遇古典密码学算法中的playfair算法和hill算法,用javascript语言实现起来是在有趣,边查百度边编码,顺便好好补习一下javascript基础. pl ...

  3. 2017-2018-2 20179204《网络攻防实践》第十三周学习总结 python实现国密算法

    国密商用算法是指国密SM系列算法,包括基于椭圆曲线的非对称公钥密码SM2算法.密码杂凑SM3算法.分组密码SM4算法,还有只以IP核形式提供的非公开算法流程的对称密码SM1算法等. 第1节 SM2非对 ...

  4. 公钥密码之RSA密码算法大素数判定:Miller-Rabin判定法!

    公钥密码之RSA密码算法大素数判定:Miller-Rabin判定法! 先存档再说,以后实验报告还得打印上交. Miller-Rabin大素数判定对于学算法的人来讲不是什么难事,主要了解其原理. 先来灌 ...

  5. Hill密码解密过程(Java)

    Hill密码是一种传统的密码体系.加密原理:选择一个二阶可逆整数矩阵A称为密码的加密矩阵,也就是这个加密体系的密钥.加密过程: 明文字母依次逐对分组,例如加密矩阵为二阶矩阵,明文就两个字母一组,如果最 ...

  6. Python常用加密解密算法

    MD5加密 简介 这是一种使用非常广泛的加密方式,不可逆的,常见16位和32位一般都是md5 实现 import hashlib data = '你好' print(hashlib.md5(data. ...

  7. Java实现7种常见密码算法

    原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介 前面在密码学入门一文中讲解了各种常见的密码学概念.算法与运用场景,但没有介绍过代码,因此,为作补充,这一篇将会介绍 ...

  8. OpenSSL密码算法库: MD5示例小程序

    OpenSSL http://www.openssl.org/ OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库.SSL协议库以及应用程序.OpenSSL 的密码算法库包含多种加密算 ...

  9. Python实现各种排序算法的代码示例总结

    Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示 ...

随机推荐

  1. 菜鸟Python学习笔记第一天:关于一些函数库的使用

    2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...

  2. Android探索之AIDL实现进程间通信

    前言: 前面总结了程序间共享数据,可以使用ContentProvider也可以使用SharedPreference,那么进程间怎么共享内存呢?Android系统中的进程之间不能共享内存,因此,需要提供 ...

  3. iOS逆向工程之Reveal工具的安装、配置与使用

    今天博客内容比较简单,不过还是蛮重要的.经常有小伙伴在QQ上私下问我,说博客中是如何使用Reveal查看AppStore中下载应用的UI层级的,那么就在今天这篇博客中作为一个主题来统一的介绍一下吧.虽 ...

  4. 源码分析netty服务器创建过程vs java nio服务器创建

    1.Java NIO服务端创建 首先,我们通过一个时序图来看下如何创建一个NIO服务端并启动监听,接收多个客户端的连接,进行消息的异步读写. 示例代码(参考文献[2]): import java.io ...

  5. 免费公开课,讲解强大的文档集成组件Aspose,现在可报名

    课程①:Aspose.Total公开课内容:讲解全能型文档管理工具Aspose.Total主要功能及应用领域时间:2016-11-24 14:30 (暂定)报名地址:http://training.e ...

  6. Java集合类--温习笔记

    最近面试发现自己的知识框架有好多问题.明明脑子里知道这个知识点,流程原理也都明白,可就是说不好,不知道是自己表达技能没点,还是确实是自己基础有问题.不管了,再巩固下基础知识总是没错的,反正最近空闲时间 ...

  7. windows 7(32/64位)GHO安装指南(U盘引导篇)~

    上一篇我们说了怎么制作U盘启动盘,那么这一篇让我们来看看如何进行正确的U盘引导启动. 现在的个人计算机一般分为台式机和笔记本,由于各厂商的喜好不同(开玩笑的啦),所以对于主板的BIOS设置各所不同.进 ...

  8. Python学习实践------正向最大匹配中文分词

    正向最大匹配分词: 1.加载词典文件到集合中,取词典文件中最大长度词的length 2.每次先在句子中按最大长度分割,然后判断分割的词是否存在字典中,存在则记录此词,调整起始点. 3.不存在则按最大长 ...

  9. grunt配置任务

    这个指南解释了如何使用 Gruntfile 来为你的项目配置task.如果你还不知道 Gruntfile 是什么,请先阅读 快速入门 指南并看看这个Gruntfile 实例. Grunt配置 Grun ...

  10. 程序员装B指南

    一.准备工作 "工欲善其事必先利其器." 1.电脑不一定要配置高,但是双屏是必须的,越大越好,能一个横屏一个竖屏更好.一个用来查资料,一个用来写代码.总之要显得信息量很大,效率很高 ...