信息安全-2:python之hill密码算法[原创]
转发注明出处: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运算
二、加密规则
加密规则也不难的,就是有个矩阵运算(忘了可以谷哥一下,和线代有关~)
- 对明文进行分组,每3个字母一组,不足则字母Z(我设定的,下面编程也是补Z)
- 进行矩阵运算,对每组字母求密文
举例:
对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
源代码
- #加密密钥矩阵
- K_LIST = [[17, 17, 5],
- [21, 18, 21],
- [2, 2, 19]]
- #26个字母列表:方便找出对应下标
- ALPHABET = ["A","B","C","D","E","F","G",
- "H","I","J","K","L","M","N",
- "O","P","Q","R","S","T","U",
- "V","W","X","Y","Z"]
- def get_index(alphabet):
- """
- 获得字母在字母表中的对应位置(下标)
- :param alphabet: 明文字母
- :return: 下标
- """
- alphabet = alphabet.upper()
- return ALPHABET.index(alphabet)
- def deal_index(list_index):
- """
- 加密处理C=KP
- :param list_index: 每一组明文字母的下标
- :return: 加密后密文的下标
- """
- deal_list = [0,0,0]
- for i in range(len(K_LIST)):
- for j in range(len(K_LIST[i])):
- deal_list[i] += list_index[j] * K_LIST[i][j]
- deal_list[i] = (deal_list[i] % 26)
- return deal_list
- def get_alphabet(deal_list):
- """
- 通过字母的下标获得对应字母
- :param deal_list: 下标的列表
- :return: 返回密文字母列表
- """
- cipher_list = []
- for i in deal_list:
- cipher_list.append(ALPHABET[i])
- return cipher_list
- def encryption(clear_text):
- """
- 加密时调用的函数
- :param clear_text:输入的明文
- :return: 加密后的密文
- """
- list_clear_text = list(clear_text.strip().replace(" ", ""))
- print(list_clear_text)
- #明文每3个一组,不足则补充字母Z
- for i in range(len(list_clear_text)):
- if i % 3 == 0 and i+2 > len(list_clear_text)-1: # 越界,则需在最后一组不足3个补字母Z
- if i+1 > len(list_clear_text)-1:
- list_clear_text.insert(i + 1, "Z")
- list_clear_text.insert(i + 2, "Z")
- print(list_clear_text)
- cipher_list = [] #用来存入密文
- #明文每3个为一组,找出每组在字母表中的位置(用一个列表来保存)
- for i in range(len(list_clear_text)):
- if i % 3 == 0 and i+2 <= len(list_clear_text)-1:
- x = get_index(list_clear_text[i])
- y = get_index(list_clear_text[i+1])
- z = get_index(list_clear_text[i+2])
- list_index = [x, y, z]
- print(list_index)
- #调用deal_inde函数进行加密 矩阵K与明文P运算得到密文C,即C=KP
- deal_list = deal_index(list_index)
- #print(deal_list) #测试用的
- part_cipher_list = get_alphabet(deal_list) #返回一组密文
- cipher_list.extend(part_cipher_list)
- #print(part_cipher_list) #测试用的
- print(cipher_list)
- return "".join(cipher_list)
- def decryption():
- print("解密未实现...")
- if __name__ == "__main__":
- while True:
- choice = input("Please input E for encryption or D for decryption:")
- if choice == "E":
- clear_text = input("请输入明文:")
- print("加密成功!密文:%s" % encryption(clear_text))
- if choice == "D":
- cipher_text = input("请输入密文:")
- decryption()
测试
- Please input E for encryption or D for decryption:E
- 请输入明文:pay more money
- ['p', 'a', 'y', 'm', 'o', 'r', 'e', 'm', 'o', 'n', 'e', 'y']
- ['p', 'a', 'y', 'm', 'o', 'r', 'e', 'm', 'o', 'n', 'e', 'y']
- [15, 0, 24]
- [12, 14, 17]
- [4, 12, 14]
- [13, 4, 24]
- ['L', 'N', 'S', 'H', 'D', 'L', 'E', 'W', 'M', 'T', 'R', 'W']
- 加密成功!密文:LNSHDLEWMTRW
- Please input E for encryption or D for decryption:payp
- Please input E for encryption or D for decryption:E
- 请输入明文:payy
- ['p', 'a', 'y', 'y']
- ['p', 'a', 'y', 'y', 'Z', 'Z']
- [15, 0, 24]
- [24, 25, 25]
- ['L', 'N', 'S', 'W', 'X', 'B']
- 加密成功!密文:LNSWXB
- Please input E for encryption or D for decryption:D
- 请输入密文:LNSWXB
- 解密未实现...
- Please input E for encryption or D for decryption:
信息安全-2:python之hill密码算法[原创]的更多相关文章
- 信息安全-1:python之playfair密码算法详解[原创]
转发注明出处: http://www.cnblogs.com/0zcl/p/6105825.html 一.基本概念 古典密码是基于字符替换的密码.加密技术有:Caesar(恺撒)密码.Vigenere ...
- javascript实现playfair和hill密码算法
时至期末,补习信息安全概论作业.恰巧遇古典密码学算法中的playfair算法和hill算法,用javascript语言实现起来是在有趣,边查百度边编码,顺便好好补习一下javascript基础. pl ...
- 2017-2018-2 20179204《网络攻防实践》第十三周学习总结 python实现国密算法
国密商用算法是指国密SM系列算法,包括基于椭圆曲线的非对称公钥密码SM2算法.密码杂凑SM3算法.分组密码SM4算法,还有只以IP核形式提供的非公开算法流程的对称密码SM1算法等. 第1节 SM2非对 ...
- 公钥密码之RSA密码算法大素数判定:Miller-Rabin判定法!
公钥密码之RSA密码算法大素数判定:Miller-Rabin判定法! 先存档再说,以后实验报告还得打印上交. Miller-Rabin大素数判定对于学算法的人来讲不是什么难事,主要了解其原理. 先来灌 ...
- Hill密码解密过程(Java)
Hill密码是一种传统的密码体系.加密原理:选择一个二阶可逆整数矩阵A称为密码的加密矩阵,也就是这个加密体系的密钥.加密过程: 明文字母依次逐对分组,例如加密矩阵为二阶矩阵,明文就两个字母一组,如果最 ...
- Python常用加密解密算法
MD5加密 简介 这是一种使用非常广泛的加密方式,不可逆的,常见16位和32位一般都是md5 实现 import hashlib data = '你好' print(hashlib.md5(data. ...
- Java实现7种常见密码算法
原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介 前面在密码学入门一文中讲解了各种常见的密码学概念.算法与运用场景,但没有介绍过代码,因此,为作补充,这一篇将会介绍 ...
- OpenSSL密码算法库: MD5示例小程序
OpenSSL http://www.openssl.org/ OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库.SSL协议库以及应用程序.OpenSSL 的密码算法库包含多种加密算 ...
- Python实现各种排序算法的代码示例总结
Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示 ...
随机推荐
- C# 注册 Windows 热键
闲扯: 前几日,一个朋友问我如何实现按 F1 键实现粘贴(Ctrl+V)功能,百度了一个方法,发给他,他看不懂(已经是 Boss 的曾经的码农),我就做了个Demo给他参考.今日得空,将 Demo 整 ...
- 开源:Taurus.MVC 框架
为什么要创造Taurus.MVC: 记得被上一家公司忽悠去负责公司电商平台的时候,情况是这样的: 项目原版是外包给第三方的,使用:WebForm+NHibernate,代码不堪入目,Bug无限,经常点 ...
- LeetCode[5] 最长的回文子串
题目描述 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...
- MySQL主从环境下存储过程,函数,触发器,事件的复制情况
下面,主要是验证在MySQL主从复制环境下,存储过程,函数,触发器,事件的复制情况,这些确实会让人混淆. 首先,创建一张测试表 mysql),age int); Query OK, rows affe ...
- Smarty的基本使用与总结
含义: Smarty是PHP的一个引擎模板,可以更好的进行逻辑与显示的分离,即我们常说的MVC,这个引擎的作用就是将C分离出来. 环境需求:PHP5.2或者更高版本 我使用的环境是:PHP5.3,wi ...
- Chrome V8引擎系列随笔 (1):Math.Random()函数概览
先让大家来看一幅图,这幅图是V8引擎4.7版本和4.9版本Math.Random()函数的值的分布图,我可以这么理解 .从下图中,也许你会认为这是个二维码?其实这幅图告诉我们一个道理,第二张图的点的分 ...
- 文档对象模型DOM通俗讲解
转自:http://www.jb51.net/article/42671.htm 在开始之前先说一点,DOM是非常容易理解的,但是大家说的太官方,让人很是难于理解,我们就用非常简单的语言翻译一遍.加深 ...
- Jqprint实现页面打印
好些项目需要实现页面打印,特别是一些后台管理类系统,下面介绍一款轻量级的打印插件: 1.实现页面打印要引入jQuery和Jqprint.点击下载Jqprint插件 <script languag ...
- 太多选择——企业如何选择合适的BI工具?
在没认清现状前,企业当然不能一言不合就上BI. BI不同于一般的企业管理软件,不能简单归类为类似用于提高管理的ERP和WMS,或用于提高企业效率的OA.BPM.BI的本质应该是通过展现数据,用于加强企 ...
- js格式化日期
/** *对日期进行格式化, * @param date 要格式化的日期 * @param format 进行格式化的模式字符串 * 支持的模式字母有: * y:年, * M:年中的月份(1-12), ...