随波逐流工作室—-探索前沿科技,分享最新软件。点击标题下蓝字“长弓三皮”关注,我们将为您提供有深度、有价值、有意思的阅读。
朋友们,现在只对常读和星标的公众号才展示大图推送,建议大家把长弓三皮“设为星标”,否则可能就看不到了啦!
作者:随波逐流
生活如梦,我愿随风起,随波流,享受每一刻的自在与轻盈。
字密1 菜单
培根解密:
执行路径:[随波逐流]CTF编码工具--字密1--培根解密
文本框输入密文,结果区输出明文。
密文:ABAAAABABBABBBABABABAABAABAABAAAAABBBAABABABB
明文:ilovesbzl
解密结果:ilovesbzl
培根密码实际上就是一种替换密码,根据所给表一一对应转换即可加密解密 。它的特殊之处在于:可以通过不明显的特征来隐藏密码信息,比如大小写、正斜体等,只要两个不同的属性,密码即可隐藏。
培根所用的密码是一种本质上用二进制数设计的,没有用通常的0和1来表示,而是采用a和b
加密时,明文中的每个字母都会转换成一组五个英文字母。其转换依靠下表:
第一种方式: 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 第二种方式 a AAAAA g AABBA n ABBAA t BAABA b AAAAB h AABBB o ABBAB u-v BAABB c AAABA i-j ABAAA p ABBBA w BABAA d AAABB k ABAAB q ABBBB x BABAB e AABAA l ABABA r BAAAA y BABBA f AABAB m ABABB s BAAAB z BABBB
加密者需使用两种不同字体,分别代表A和B。准备好一篇包含相同AB字数的假信息后,按照密文格式化假信息,即依密文中每个字母是A还是B分别套用两种字体。
解密时,将上述方法倒转。所有字体一转回A,字体二转回B,以后再按上表拼回字母。
法兰西斯·培根另外准备了一种方法,其将大小写分别看作A与B,可用于无法使用不同字体的场合(例如只能处理纯文本时)。但这样比起字体不同更容易被看出来,而且和语言对大小写的要求也不太兼容。
培根密码本质上是将二进制信息通过样式的区别,加在了正常书写之上。培根密码所包含的信息可以和用于承载其的文章完全无关。
在CTF中一般使用python进行加解码
# 培根密码解密
# 作者:随波逐流
import re
import string
from collections import OrderedDict
from cnradical import Radical, RunOption
def bacon_decrypt(plaintext):
"""
培根密码解密程序,支持两种不同的培根密码变体。
:param plaintext: 培根密码加密的文本
:return: 解密后的文本
"""
def is_chinese(input_string):
"""
判断输入字符串是否全为中文。
:param input_string: 输入的字符串
:return: 如果全为中文返回True,否则返回False
"""
pattern = re.compile(r'[u4e00-u9fa5]+')
match = pattern.fullmatch(input_string)
return match is not None
def decrypt_bacon(bacon_code):
"""
根据培根密码编码表解密文本。
:param bacon_code: 培根密码编码的文本
:return: 解密后的文本
"""
decrypted_text = ""
cipher_tables = [cipher1, cipher2]
letter_tables = [letters1, letters2]
for cipher_table, letter_table in zip(cipher_tables, letter_tables):
for chunk in [bacon_code[i:i + 5] for i in range(0, len(bacon_code), 5)]:
for j in range(26):
if chunk == cipher_table[j]:
decrypted_text += letter_table[j]
break
return decrypted_text
# 培根密码编码表(第一种方式)
cipher1 = ["aaaaa", "aaaab", "aaaba", "aaabb", "aabaa", "aabab", "aabba", "aabbb", "abaaa", "abaab", "ababa",
"ababb", "abbaa", "abbab", "abbba", "abbbb", "baaaa", "baaab", "baaba", "baabb", "babaa", "babab", "babba",
"babbb", "bbaaa", "bbaab", ]
# 培根密码编码表(第二种方式)
cipher2 = ["AAAAA", "AAAAB", "AAABA", "AAABB", "AABAA", "AABAB", "AABBA", "AABBB", "ABAAA", "ABAAB", "ABABA",
"ABABB", "ABBAA", "ABBAB", "ABBBA", "ABBBB", "BAAAA", "BAAAB", "BAABA", "BAABB", "BABAA", "BABAB", "BABBA",
"BABBB", "BBAAA", "BBAAB"]
# 对应的字母表(大写)
letters1 = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
'V', 'W', 'X', 'Y', 'Z', ]
# 对应的字母表(小写)
letters2 = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',
'v', 'w', 'x', 'y', 'z', ]
# 删除中文标点符号
plaintext = ''.join([char for char in plaintext if char not in ',。!?;:‘’“”【】()《》'])
# 删除英文标点符号(._-/除外)
punctuation = string.punctuation.replace('.', '').replace('/', '').replace('_', '').replace('-', '')
plaintext = plaintext.translate(str.maketrans('', '', punctuation))
# 删除空格
plaintext = plaintext.replace(' ', '')
if is_chinese(plaintext):
# 获取偏旁部首
radical = Radical(RunOption.Radical)
radical_out = [radical.trans_ch(ele) for ele in plaintext]
plaindic = ''.join(OrderedDict.fromkeys(radical_out)) # 偏旁字符去重
temp_plaintext = ''
for i in range(len(plaintext)):
temp_plaintext += radical.trans_ch(plaintext[i])
plaintext = temp_plaintext
else:
plaindic = ''.join(OrderedDict.fromkeys(plaintext.upper())) # 字符去重
# 如果只有两个非'AB'字母,自动替换成'AB'
if len(plaindic) == 2 and all(c not in plaintext for c in 'AaBb'):
plaintext = plaintext.upper().replace(plaindic[0], 'A').replace(plaindic[1], 'B')
# 如果字符超过两个,将所有大写小写替换成'A'和'B'
elif len(plaindic) > 2:
plaintext = plaintext.translate(str.maketrans('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
'AAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBB'))
decrypted_text1 = decrypt_bacon(plaintext)
decrypted_text2 = decrypt_bacon(plaintext.translate(str.maketrans('AB', 'BA'))) # AB互换
# 检查解密文本长度是否正确
if len(decrypted_text1) == int(len(plaintext) / 5) and len(decrypted_text2) == int(len(plaintext) / 5):
decrypted_text = decrypted_text1 + '或者' + decrypted_text2
elif len(decrypted_text1) == int(len(plaintext) / 5):
decrypted_text = decrypted_text1
elif len(decrypted_text2) == int(len(plaintext) / 5):
decrypted_text = decrypted_text2
else:
decrypted_text = ''
print('不是培根密码。')
return decrypted_text
# 使用示例
cipher_text = "aaaaaBAABBBAABBA"
print(bacon_decrypt(cipher_text))
公众号内回复 writeup 或 flag 下载公众号文章
你若喜欢,为“长弓三皮”点个赞和在看哦
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...