普莱费尔密码(playfair)

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 普莱费尔密码(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"))


目录
相关文章
|
6月前
|
数据安全/隐私保护
登录中用于记住用户名和密码的方法
登录中用于记住用户名和密码的方法
55 0
|
8月前
|
安全 数据安全/隐私保护
如何安全的使用密码登录账号(在不知道密码的情况下)
该内容介绍了如何使用一个工具来便捷地复制和管理账号密码。首先提到了两个下载工具的链接,分别是百度网盘和蓝奏云,并给出了相应的提取码。接着,展示了工具的界面,说明通过按住Ctrl或Alt点击密码栏可以快速复制账号和密码,无需直接看到密码。用户可以通过模拟添加账号来体验这一功能,然后演示了如何生成和复制新密码。最后,重点强调了按住Ctrl复制账号和按住Alt复制对应密码的快捷操作,使得在不知密码的情况下也能轻松获取。
|
8月前
|
存储 安全 网络安全
如何取安全的密码?
如何取安全的密码?
75 0
|
8月前
|
存储 弹性计算 运维
循环测试用户名与密码是否正确
【4月更文挑战第29天】
42 0
|
8月前
|
存储 弹性计算 运维
测试用户名与密码是否正确
【4月更文挑战第29天】
48 0
|
Linux 数据安全/隐私保护 知识图谱
ADFGX密码
ADFGX密码
263 0
|
Linux 数据安全/隐私保护
ADFGVX密码
ADFGVX密码
137 0
|
数据安全/隐私保护 计算机视觉
QWE密码
QWE密码
370 0
|
机器学习/深度学习 Linux 数据安全/隐私保护
维吉尼亚密码(Vigenere)
维吉尼亚密码(Vigenere)
214 0
|
安全 算法 数据安全/隐私保护
C/C++编程题之简单密码
密码是我们生活中非常重要的东东,我们的那么一点不能说的秘密就全靠它了。哇哈哈. 接下来渊子要在密码之上再加一套密码,虽然简单但也安全。