转发注明出处: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

 源代码

 #加密密钥矩阵
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. 信息安全-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. Vue.js 和 MVVM 小细节

    MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 ViewModel 的双向数据绑定,这使得ViewModel 的状态改变可以自 ...

  2. wepack+sass+vue 入门教程(二)

    六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...

  3. Linux CentOS 配置Tomcat环境

    一.下载Tomcat 下载Tomcat方式也有两种,可以参考我的前一篇博文Linux CentOS配置JDK环境,这边就不再赘述. 二.在Linux处理Tomcat包 1.创建tomcat文件夹 mk ...

  4. C++随笔:.NET CoreCLR之GC探索(2)

    首先谢谢 @dudu 和 @张善友 这2位大神能订阅我,本来在写这个系列以前,我一直对写一些核心而且底层的知识持怀疑态度,我为什么持怀疑态度呢?因为一般写高层语言的人99%都不会碰底层,其实说句实话, ...

  5. javascript动画系列第二篇——磁性吸附

    × 目录 [1]范围限定 [2]拖拽范围 [3]磁性吸附 前面的话 上一篇,我们介绍了元素拖拽的实现.但在实际应用中,常常需要为拖拽的元素限定范围.而通过限定范围,再增加一些辅助的措施,就可以实现磁性 ...

  6. IdentityServer4 使用OpenID Connect添加用户身份验证

    使用IdentityServer4 实现OpenID Connect服务端,添加用户身份验证.客户端调用,实现授权. IdentityServer4 目前已更新至1.0 版,在之前的文章中有所介绍.I ...

  7. java中if和switch哪个效率快

    首先要看一个问题,if 语句适用范围比较广,只要是 boolean 表达式都可以用 if 判断:而 switch 只能对基本类型进行数值比较.两者的可比性就仅限在两个基本类型比较的范围内.说到基本类型 ...

  8. IteratorPattern(迭代子模式)

    /** * 迭代子模式 * @author TMAC-J * 聚合:某一类对象的集合 * 迭代:行为方式,用来处理聚合 * 是一种行为模式,用于将聚合本身和操作聚合的行为分离 * Java中的COLL ...

  9. 如何为你的微信小程序体积瘦身?

    众所周知,微信小程序在发布的时候,对提交的代码有1M大小的限制!所以,如果你正在写一个功能稍微复杂一点的小程序,就必须得时刻小心注意你的代码是不是快触及这个底线了. 在设计一个小程序之初,我们就需要重 ...

  10. 微软收购Xamarin,你怎么看?

    今天的最大新闻就是微软收购热门初创企业Xamarin,从网上的反馈大部分都是积极的,也有担心微软在把Xamarin移动开发技术整合进VS的同时,还很有可能废掉MONO的GUI客户端能力只保留.net ...