随波逐流工作室—-探索前沿科技,分享最新软件。点击标题下蓝字“长弓三皮”关注,我们将为您提供有深度、有价值、有意思的阅读。
朋友们,现在只对常读和星标的公众号才展示大图推送,建议大家把长弓三皮“设为星标”,否则可能就看不到了啦!
作者:随波逐流
生活如梦,我愿随风起,随波流,享受每一刻的自在与轻盈。
字密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 reimport stringfrom collections import OrderedDictfrom cnradical import Radical, RunOptiondef 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 Nonedef 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]breakreturn 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_plaintextelse: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_text2elif len(decrypted_text1) == int(len(plaintext) / 5):decrypted_text = decrypted_text1elif len(decrypted_text2) == int(len(plaintext) / 5):decrypted_text = decrypted_text2else:decrypted_text = ''print('不是培根密码。')return decrypted_text# 使用示例cipher_text = "aaaaaBAABBBAABBA"print(bacon_decrypt(cipher_text))
公众号内回复 writeup 或 flag 下载公众号文章
你若喜欢,为“长弓三皮”点个赞和在看哦
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……




还没有评论,来说两句吧...