📜  培根密码

📅  最后修改于: 2022-05-13 01:57:06.879000             🧑  作者: Mango

培根密码

培根密码或培根密码是弗朗西斯培根于 1605 年设计的一种隐写术方法(一种隐藏秘密消息的方法,而不仅仅是密码)。消息隐藏在文本的呈现中,而不是其内容。
Baconian 密码是一种替换密码,其中每个字母都被一系列 5 个字符替换。在原始密码中,这些是“A”和“B”的序列,例如字母“D”被“aaabb”替换,字母“O”被“abbab”替换等等。每个字母被分配给一个由五个二进制组成的字符串位数。这些可以是字母“A”和“B”、数字 0 和 1 或您可能想要的任何其他内容。
有两种培根密码——

  1. 24 字母密文:其中 2 对字母 (I, J) & (U, V) 具有相同的密文。
    LetterCodeBinary
    Nabbaa01100
    Oabbab01101
    Pabbba01110
    Qabbbb01111
    Rbaaaa10000
    Sbaaab10001
    Tbaaba10010
    U, Vbaabb10011
    Wbabaa10100
    Xbabab10101
    Ybabba10110
    Zbabbb10111
  2. 26 字母密码:所有字母都有唯一的密文。
    LetterCodeBinary
    Aaaaaa00000
    Baaaab00001
    Caaaba00010
    Daaabb00011
    Eaabaa00100
    Faabab00101
    Gaabba00110
    Haabbb00111
    I, Jabaaa01000
    Kabaab01001
    Lababa01010
    Mababb01011

加密

我们将从字符串中提取单个字符,如果它不是空格,那么我们将根据我们使用的密码将其替换为相应的密文,否则我们将添加一个空格并重复它,直到我们到达字符串的末尾。例如“A”被替换为“aaaaa”

解密

我们将从加密字符串中提取每组 5 个字符,并检查这组 5 个字符中的第一个字符是否是空格。如果不是,我们将从密码中查找其对应的明文字母,替换它并将字符索引增加 5(以获取接下来 5 个字符的集合),否则如果它是空格,我们添加一个空格并通过增加当前字符来重复一个过程字符索引 1

方法

在Python中,我们可以使用称为字典的数据结构来映射键值对。我们将只使用一个字典,我们将在其中将明文-密文对映射为键值对。
对于加密,我们将通过使用相应的明文字符作为密钥访问值来简单地查找相应的密文。
在解密中,我们将提取每 5 组密文字符,并使用它们作为对应值从字典中检索它们的密钥。为了准确解密,我们将使用 26 个字母的密码。如果您不是在Python中编码,那么您可以提出自己的方法。

# Python program to implement Baconian cipher
  
'''This script uses a dictionary instead of 'chr()' & 'ord()' function'''
  
'''
Dictionary to map plaintext with ciphertext
(key:value) => (plaintext:ciphertext)
This script uses the 26 letter baconian cipher
in which I, J & U, V have distinct patterns
'''
lookup = {'A':'aaaaa', 'B':'aaaab', 'C':'aaaba', 'D':'aaabb', 'E':'aabaa',
        'F':'aabab', 'G':'aabba', 'H':'aabbb', 'I':'abaaa', 'J':'abaab',
        'K':'ababa', 'L':'ababb', 'M':'abbaa', 'N':'abbab', 'O':'abbba',
        'P':'abbbb', 'Q':'baaaa', 'R':'baaab', 'S':'baaba', 'T':'baabb',
        'U':'babaa', 'V':'babab', 'W':'babba', 'X':'babbb', 'Y':'bbaaa', 'Z':'bbaab'}
  
# Function to encrypt the string according to the cipher provided
def encrypt(message):
    cipher = ''
    for letter in message:
        # checks for space
        if(letter != ' '):
            # adds the ciphertext corresponding to the 
            # plaintext from the dictionary
            cipher += lookup[letter]
        else:
            # adds space
            cipher += ' '
  
    return cipher
  
# Function to decrypt the string 
# according to the cipher provided
def decrypt(message):
    decipher = ''
    i = 0
  
    # emulating a do-while loop
    while True :
        # condition to run decryption till 
        # the last set of ciphertext
        if(i < len(message)-4):
            # extracting a set of ciphertext
            # from the message
            substr = message[i:i + 5]
            # checking for space as the first 
            # character of the substring
            if(substr[0] != ' '):
                '''
                This statement gets us the key(plaintext) using the values(ciphertext)
                Just the reverse of what we were doing in encrypt function
                '''
                decipher += list(lookup.keys())[list(lookup.values()).index(substr)]
                i += 5 # to get the next set of ciphertext
  
            else:
                # adds space
                decipher += ' '
                i += 1 # index next to the space
        else:
            break # emulating a do-while loop
  
    return decipher
  
def main():
    message = "Geeks for Geeks"
    result = encrypt(message.upper())
    print (result)
  
    message = "AABAAABBABABAABABBBABBAAA"
    result = decrypt(message.lower())
    print (result)
  
#Executes the main function
if __name__ == '__main__':
    main()
Output
aabbaaabaaaabaaabababaaba aabababbbabaaab aabbaaabaaaabaaabababaaba
ENJOY

分析:该密码提供的通信安全性非常低,因为它是一种替代密码。因此,所有用于密码分析替换密码的方法都可以用来破解培根密码。密码的主要优点是它允许隐藏已发送秘密消息的事实。

参考:实用密码学