普莱费尔密码(playfair)

  • 加密对象: 字母

  • 原理:

    • 首先该密码需要秘钥,与,然后由秘钥制作相应的密码表。秘钥去重后,将秘钥依次填入5x5表格(先填纵列),剩下的格子友a-z依次填入,如果前面遇到秘钥中的字母就跳过,将i和j放在同一个格子。如:秘钥是linux, 填成的密码表为:

      l a f o t
      i/j b g p v
      n c h q w
      u d l r y
      x e m s z
    • 在构建好密码表后,将待加密的明文分为两个一组,同时要保证每组的两个字符不相同,如果相同,则在其中间插入一个x获取q,在进行分组。如果最后还有一个字符单着,则添加一个x。

    • 分好组后,依次拿出每个组,根据密码表对其加密,加密规则如下:

      1. 如果该组的两个字符在密码表的同一行,则密文分别是其紧靠着的右边这个字符。其中第一列被看做是最后一列的右方。
      2. 如果该组的两个字符在密码表的同一列,则密文分别是其紧靠着的下边这个字符。之中第一行被看做是最后一行的下方。
      3. 如果该组的两个字符即不再同一行,又不在同一类,则密文是其组成的长方形的另外两个顶点(至于横向替换还是纵向替换,这需要双方沟通好)。
  • 代码:

    # write in 2021/7/14
    # 普莱菲尔密码
    import re# 将i和j放在一个格子里面
    DIC = "abcdefghiklmnopqrstuvwxyz"# 添加x
    def add_x(string):i = 0new_string = ""while i < len(string)-1:# print(i)if string[i] == string[i+1]:new_string += string[i] + "x"i += 1else:new_string += string[i] + string[i+1]i += 2if i == len(string)-1:new_string += string[i] + "x"return new_string# 去除x
    def sub_x(string_lis):remove_lis = []for i in range(1, len(string_lis)-1, 2):if string_lis[i] == "x" and string_lis[i-1] == string_lis[i+1]:remove_lis.append(i)for i in remove_lis:string_lis.pop(i)if string_lis[-1] == "x":string_lis.pop(-1)return "".join(string_lis)# 检查秘钥
    def judge_key(key):for i in key:if i not in DIC:return 0return 1def encrypt_playfair(string, key):string = string.replace("j", "i").replace(" ", "")key = key.replace(" ", "").replace("j", "i")if not judge_key(key):return -1ciphertext = ""table = ""# 建立密码表for i in key+DIC:if i not in table:table += i# 分组明文# print(add_x(string))try:new_string = add_x(string)except:return -1group = re.findall(".{2}", new_string)# print(group)for i in group:x1 = table.index(i[0]) // 5y1 = table.index(i[0]) % 5x2 = table.index(i[1]) // 5y2 = table.index(i[1]) % 5if y1 == y2:x1 = (x1 + 1) % 5x2 = (x2 + 1) % 5elif x1 == x2:y1 = (y1 + 1) % 5y2 = (y2 + 1) % 5else:y1, y2 = y2, y1  # 纵向对角ciphertext += table[x1*5+y1] + table[x2*5+y2]return ciphertext# 解密似乎有多种答案, 因为加密时添加 x , 在解密时不知道是本生就有,还是加密过程中添加的
    def decrypt_playfair(string, key):string = string.replace("j", "i").replace(" ", "")key = key.replace("j", "i").replace(" ", "")if not judge_key(key):return -1plaintext = ""table = ""# 建立密码表for i in  key + DIC:if i not in table:table += igroup = re.findall(".{2}", string)# print(group)plaintext_lis = []for i in group:x1 = table.index(i[0]) // 5y1 = table.index(i[0]) % 5x2 = table.index(i[1]) // 5y2 = table.index(i[1]) % 5if y1 == y2:x1 = (x1 - 1) % 5x2 = (x2 - 1) % 5elif x1 == x2:y1 = (y1 - 1) % 5y2 = (y2 - 1) % 5else:y1, y2 = y2, y1  # 纵向对角# x1, x2 = x2, x2  # 横向对角plaintext_lis.append(table[x1 * 5 + y1])plaintext_lis.append(table[x2 * 5 + y2])return sub_x(plaintext_lis)if __name__ == '__main__':key_ = "linux"string_ = "i love you"ciphertext_ = encrypt_playfair(string_, key_)plaintext_ = decrypt_playfair(ciphertext_, key_)print(f"{plaintext_}: {ciphertext_}")# print(add_x("linux"))

普莱费尔密码(playfair)相关推荐

  1. 古典密码(单表密码,维吉尼亚密码,普莱费尔密码,一次一密)

    古典密码 1.单表密码(仿射加密) 仿射加密变化是:y=ax+b 算法: 仿射密码是一种表单代换密码,字母表的每个字母相应的值使用一个简单的数学函数对应一个数值,再把对应数值转换成字母. A B C ...

  2. 加密解密工具 之 普莱费尔密码

    普莱费尔密码(英文:Playfair Cipher 或 Playfair Square)是一种使用一个关键词方格来加密字符对的加密法,1854年由一位名叫查尔斯·惠斯通(Charles Wheatst ...

  3. 普莱费尔密码加密解密

    普莱费尔密码的编写方法通常分为三个步骤,即编制密码表,整理明文,编写译文,下面以明文:pishoupideweinasi和密钥"culture"为例讲解. 1.编制密码表 我们需要 ...

  4. 普莱菲尔密码矩阵生成算法

    python提供了普莱菲尔密码的加解密包:pycipher 下载地址:https://pypi.python.org/pypi/pycipher 安装:python setup.py install ...

  5. 惠普台式计算机BIOS密码设置,惠普电脑开机bios密码忘了怎么解决

    HP笔记本想重装系统,选择启动方式,却提示需要输入密码?那么惠普电脑开机bios密码忘了怎么解决呢?今天学习啦小编与大家分享下惠普电脑开机bios密码忘了的解决方法,有兴趣的朋友不妨了解下. 惠普电脑 ...

  6. ENVI5.0 SP3下Pleiades(普莱亚)数据处理

    由 Pleiades-1 和Pleiades-2 组成,具有全球任意一点每天重访的能力.Pleiades包括分辨率为 0.5m 的全色波段并且幅宽达到了20 km x 20 km,2米分辨率的多光谱包 ...

  7. [转]CTF密码学——常见编解码及加解密总结

    做了一些CTF密码学的题目,阅读了很多大神的博客,现在做个总结,不全面的之后补充. 目录 编码 进制表示 ASCII码对照表 unicode编码 URL编码 Escape/Unescape Base6 ...

  8. Playfair密码的基本原理及事例

    背景 普莱费尔密码(英文:Playfair cipher 或 Playfair square)是一种使用一个关键词方格来加密字符对的加密法,1854年由一位名叫查尔斯·惠斯通(Charles Whea ...

  9. CTF-Crypto 密码原理及解密方法

    CTF-Crypto 密码原理及解密方法 文章目录 CTF-Crypto 密码原理及解密方法 推荐综合加解密网址 一.常见密码格式 二.古典密码 凯撒密码 仿射密码 埃特巴什码 培根密码 棋盘密码 希 ...

  10. CTF-Crypto-各种密码原理及解密方法

    CTF-Crypto-各种密码原理及解密方法 一.常见密码格式(太懒了,待补充) 二.古典密码 凯撒密码 仿射密码 埃特巴什码 培根密码 棋盘密码 希尔密码 维吉尼亚密码 摩尔斯密码 栅栏密码(普通型 ...

最新文章

  1. 如何使用 BERT 进行自然语言处理?
  2. 美国雷神公司对第六代战斗机的任务系统提出六点预测
  3. js方法参数中含有单引号双引号的处理
  4. Android自定义控件(特效一) 点击屏幕,根据所点击的位置绘制圆环
  5. 数字电子技术基础第三版杨志忠_阎石数字电子技术基础第6版笔记和课后习题详解...
  6. python mp4 切片_FFmpeg MP4视频切片成TS m3u8播放 好文收集
  7. 关于eclipse的indigo版中文注释时字体太小的问题(转)
  8. 51单片机基本刷屏测试实验_基于单片机的发动机振动速度、位移和加速度测量方法...
  9. 函数参数传递、数组指针、二级指针、左值、引用
  10. [图解tensorflow源码] TF系统概述篇
  11. puzzle(102)数独
  12. 超火的快闪文字视频制作,用这个软件就能轻松学会
  13. C#面向对象基础之String类的练习
  14. FPGA学习-PS2接口
  15. Oracle的 IT 世界观
  16. 【LeetCode - Java】14. 最长公共前缀 (简单)
  17. Linux 研发环境工具 下载网址大全
  18. C语言编写1000元五种方法存五年的利息
  19. 屠光绍:公司债启动时机成熟 市场意义重大
  20. 图谱实战 | 为什么我们需要医学知识图谱?

热门文章

  1. 就计算机应用领域而言航天器,婴幼儿耳道长耵聍,应该用()工具取出A.耳挖勺B.火柴棍C.棉签D.卡子...
  2. 从CAP 到编程语言的猜想
  3. 网页视频下载mp4格式到本地
  4. Win7系统自动关机设定让你更轻松
  5. awgn matlab,Matlab实现加性高斯白噪声信道(AWGN)下的digital调制格式识别分类
  6. 计算机五笔教学软件,指法练习 XP
  7. 九宫格一共有多少种解法
  8. 警惕“不续签劳动合同”式裁员
  9. 虚幻开发工具包发布版本的版本信息
  10. 怎样快速提高计算机能力,如何提高算术能力?不借助计算机、笔、纸等工具,怎么能快速心算出多位数计算结果?如:489x85 如:128965-98542有什么口决及速算的方法的详细步骤?...