普莱费尔密码(playfair)

简介: 普莱费尔密码(playfair)

普莱费尔密码(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


在构建好密码表后,将待加密的明文分为两个一组,同时要保证每组的两个字符不相同,如果相同,则在其中间插入一个x获取q,在进行分组。如果最后还有一个字符单着,则添加一个x。


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


如果该组的两个字符在密码表的同一行,则密文分别是其紧靠着的右边这个字符。其中第一列被看做是最后一列的右方。

如果该组的两个字符在密码表的同一列,则密文分别是其紧靠着的下边这个字符。之中第一行被看做是最后一行的下方。

如果该组的两个字符即不再同一行,又不在同一类,则密文是其组成的长方形的另外两个顶点(至于横向替换还是纵向替换,这需要双方沟通好)。

代码:

# write in 2021/7/14
# 普莱菲尔密码
import re
# 将i和j放在一个格子里面
DIC = "abcdefghiklmnopqrstuvwxyz"
# 添加x
def add_x(string):
    i = 0
    new_string = ""
    while i < len(string)-1:
        # print(i)
        if string[i] == string[i+1]:
            new_string += string[i] + "x"
            i += 1
        else:
            new_string += string[i] + string[i+1]
            i += 2
    if 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 0
    return 1
def encrypt_playfair(string, key):
    string = string.replace("j", "i").replace(" ", "")
    key = key.replace(" ", "").replace("j", "i")
    if not judge_key(key):
        return -1
    ciphertext = ""
    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 -1
    group = re.findall(".{2}", new_string)
    # print(group)
    for i in group:
        x1 = table.index(i[0]) // 5
        y1 = table.index(i[0]) % 5
        x2 = table.index(i[1]) // 5
        y2 = table.index(i[1]) % 5
        if y1 == y2:
            x1 = (x1 + 1) % 5
            x2 = (x2 + 1) % 5
        elif x1 == x2:
            y1 = (y1 + 1) % 5
            y2 = (y2 + 1) % 5
        else:
            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 -1
    plaintext = ""
    table = ""
    # 建立密码表
    for i in  key + DIC:
        if i not in table:
            table += i
    group = re.findall(".{2}", string)
    # print(group)
    plaintext_lis = []
    for i in group:
        x1 = table.index(i[0]) // 5
        y1 = table.index(i[0]) % 5
        x2 = table.index(i[1]) // 5
        y2 = table.index(i[1]) % 5
        if y1 == y2:
            x1 = (x1 - 1) % 5
            x2 = (x2 - 1) % 5
        elif x1 == x2:
            y1 = (y1 - 1) % 5
            y2 = (y2 - 1) % 5
        else:
            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"))


目录
相关文章
|
存储 前端开发 Java
农产品销售|助农惠农|基于Springboot实现农产品销售管理系统
农产品销售|助农惠农|基于Springboot实现农产品销售管理系统
761 1
|
前端开发 Java C#
java/C#语言开发的医疗信息系统11套源码
java/C#语言开发的医疗信息系统11套源码
329 2
|
缓存 JavaScript Java
常见java OOM异常分析排查思路分析
Java虚拟机(JVM)遇到内存不足时会抛出OutOfMemoryError(OOM)异常。常见OOM情况包括:1) **Java堆空间不足**:大量对象未被及时回收或内存泄漏;2) **线程栈空间不足**:递归过深或大量线程创建;3) **方法区溢出**:类信息过多,如CGLib代理类生成过多;4) **本机内存不足**:JNI调用消耗大量内存;5) **GC造成的内存不足**:频繁GC但效果不佳。解决方法包括调整JVM参数(如-Xmx、-Xss)、优化代码及使用高效垃圾回收器。
630 15
常见java OOM异常分析排查思路分析
|
传感器
DIY_实现光敏电阻传感器简单控制LED
DIY_实现光敏电阻传感器简单控制LED
3109 2
|
人工智能 算法 测试技术
AI视频理解天花板,全新MiniGPT4-Video刷爆SOTA!
【4月更文挑战第10天】KAUST和哈佛大学联合研发的MiniGPT4-Video模型在视频理解任务中打破多项纪录,成为业界关注点。这款多模态AI系统基于大型语言模型,能同时处理视觉和文本信息,提升了视频内容理解的深度。通过创新的视觉-文本混合处理,模型在MSVD、MSRVTT等基准测试中取得显著性能提升。然而,由于依赖上下文窗口,目前对较长视频处理有限制。该模型的出现推动了视频理解领域的进步,具有广阔的应用前景。
348 1
AI视频理解天花板,全新MiniGPT4-Video刷爆SOTA!
|
SQL 关系型数据库 数据库
【MySQL】:DDL数据库定义与操作
【MySQL】:DDL数据库定义与操作
685 0
|
网络协议 Linux
端口扫描神器:Masscan 保姆级教程(附链接)
端口扫描神器:Masscan 保姆级教程(附链接)
|
网络安全 PHP
[网络安全/CTF] BUUCTF极客大挑战2019PHP解题详析(Dirsearch使用实例+php反序列化)
[网络安全/CTF] BUUCTF极客大挑战2019PHP解题详析(Dirsearch使用实例+php反序列化)
584 0
|
人工智能 算法 测试技术
古典密码体制的统计分析——Playfair密码
本实验带您体验古典密码体制的统计分析——Playfair密码。
|
数据安全/隐私保护
BUUCTF Cipher 1
BUUCTF Cipher 1
338 0