培根密码
培根密码或培根密码是弗朗西斯培根于 1605 年设计的一种隐写术方法(一种隐藏秘密消息的方法,而不仅仅是密码)。消息隐藏在文本的呈现中,而不是其内容。
Baconian 密码是一种替换密码,其中每个字母都被一系列 5 个字符替换。在原始密码中,这些是“A”和“B”的序列,例如字母“D”被“aaabb”替换,字母“O”被“abbab”替换等等。每个字母被分配给一个由五个二进制组成的字符串位数。这些可以是字母“A”和“B”、数字 0 和 1 或您可能想要的任何其他内容。
有两种培根密码——
- 24 字母密文:其中 2 对字母 (I, J) & (U, V) 具有相同的密文。
Letter Code Binary N abbaa 01100 O abbab 01101 P abbba 01110 Q abbbb 01111 R baaaa 10000 S baaab 10001 T baaba 10010 U, V baabb 10011 W babaa 10100 X babab 10101 Y babba 10110 Z babbb 10111 - 26 字母密码:所有字母都有唯一的密文。
Letter Code Binary A aaaaa 00000 B aaaab 00001 C aaaba 00010 D aaabb 00011 E aabaa 00100 F aabab 00101 G aabba 00110 H aabbb 00111 I, J abaaa 01000 K abaab 01001 L ababa 01010 M ababb 01011
加密
我们将从字符串中提取单个字符,如果它不是空格,那么我们将根据我们使用的密码将其替换为相应的密文,否则我们将添加一个空格并重复它,直到我们到达字符串的末尾。例如“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
分析:该密码提供的通信安全性非常低,因为它是一种替代密码。因此,所有用于密码分析替换密码的方法都可以用来破解培根密码。密码的主要优点是它允许隐藏已发送秘密消息的事实。
参考:实用密码学