初级密码学题,由蓝鲸安全平台提供

题目:培根的愤怒,文件中包含两个文件RSA.txt和bacon.docx

知识点:RSA加密,bacon密码

目录

  1. 背景知识
    1. 培根密码
  2. 题目解析
    1. RSA
    2. 总结

背景知识

培根密码

培根密码是以他的发明者而命名的—-英国人 弗朗西斯.培根,他使用二进制的思想制作了培根密码,但是却讲普通的二进制的0和1替换成a和b。让密码变得看上去很普通不会一起过多的主要。

培根密码也同样有两种编码模式密码表(大小写不同):

第一种密码表:

第二种密码表:

当这种密码出现后,人们当然遵从培根替换二进制元素的思想,对培根进行了各种各样的变化与进化。例如:可以用两种字体表示a和b,也可以用字体大小写等不同的两种表达方式来代替a和b字母。(密文:SuLyi XuanQ uJuZi HEwEN 按照大小写表示a和b,明文:LOVE)

题目解析

RSA

打开.txt文件发现

1
2
3
4
e=65537
d=1764836219594882187843234147880131121771889292946179667759840214035309185449143902593959870508966515039587677582858798736388141160230363016947313129036070636861863062274037967590147497869727514848002031984248933650359661708519627935253774817417127743601824768881728368241731993209298718491920343736819541250453047663176408059126018948310585981572755980858657248028686387003137268571851611561132111915826966459925826207250507344818626890563618085762697380861169320463283242104640942973559724123517932751088369262105675358771667412984908724301206109885898719604228198681639407843267405644475201507847567204728939638145
n=20136154478340841564185591286493759284046711105817161714132424809754884764411654586403263933416806841251646522588408268242804597356897162437617698561566323350977701864946661957164954137863567573223103964162904311393388083111290190806533189451439119243111558126427895555267825494247529615913123880132301928087149633155689369834486059262333901654707896271411583403909233265498204545037789075685761561868755049395178667956582626590509735929833007473306687014665509839236897398732632601168593411571576144377460423772237026851061695263350092752542823717948134419111797673566903960499882658784242463197583753031104747152067
c=22F4ECF53A876B17DA59DFA44235B8AB08F93D337D79427B13BC3036933FC850E0697926C625B6DCD5D21955D2BB43CB5348197FA6F79C74424D13B0157914E81BF462FF96FABF9E152284732C12148C4FAAF3FD04BDE5E97DCAE7DD41046BD7340FE024767003DC79B5CABD50738886F54D8FFDC2B81AD57EDEF35AD54D58B7BD9A15380BF5BB88A82EEF4148C4EE27589122C9FC9E9BEE94B235FD8FA77C431290A56BC13269FD1171AF8A382A3A6919C7F2B1CC8758DB0AE9982BB02EB37499F211D215C9C62CFE379ED63EC248939458D7498E224F6FA13F816E54504986B8CC391160CB527D4D54DB7B23CC7C29420B996D168E5C6990DBA72E9FA93C37

E表示公钥

D表示私钥

N表示模数

C表示为密文

直接运行解密脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import gmpy2
import binascii
d = 1764836219594882187843234147880131121771889292946179667759840214035309185449143902593959870508966515039587677582858798736388141160230363016947313129036070636861863062274037967590147497869727514848002031984248933650359661708519627935253774817417127743601824768881728368241731993209298718491920343736819541250453047663176408059126018948310585981572755980858657248028686387003137268571851611561132111915826966459925826207250507344818626890563618085762697380861169320463283242104640942973559724123517932751088369262105675358771667412984908724301206109885898719604228198681639407843267405644475201507847567204728939638145

n = 20136154478340841564185591286493759284046711105817161714132424809754884764411654586403263933416806841251646522588408268242804597356897162437617698561566323350977701864946661957164954137863567573223103964162904311393388083111290190806533189451439119243111558126427895555267825494247529615913123880132301928087149633155689369834486059262333901654707896271411583403909233265498204545037789075685761561868755049395178667956582626590509735929833007473306687014665509839236897398732632601168593411571576144377460423772237026851061695263350092752542823717948134419111797673566903960499882658784242463197583753031104747152067

c = 0x22F4ECF53A876B17DA59DFA44235B8AB08F93D337D79427B13BC3036933FC850E0697926C625B6DCD5D21955D2BB43CB5348197FA6F79C74424D13B0157914E81BF462FF96FABF9E152284732C12148C4FAAF3FD04BDE5E97DCAE7DD41046BD7340FE024767003DC79B5CABD50738886F54D8FFDC2B81AD57EDEF35AD54D58B7BD9A15380BF5BB88A82EEF4148C4EE27589122C9FC9E9BEE94B235FD8FA77C431290A56BC13269FD1171AF8A382A3A6919C7F2B1CC8758DB0AE9982BB02EB37499F211D215C9C62CFE379ED63EC248939458D7498E224F6FA13F816E54504986B8CC391160CB527D4D54DB7B23CC7C29420B996D168E5C6990DBA72E9FA93C37

m = pow(c,d,n)
print(hex(m).replace("L",""))
b = hex(m).replace("L","")
b = b[2:]
c = binascii.a2b_hex(b)
print(c)

结果得:

1
2
0x7768616c65435446435231707430
whaleCTFCR1pt0

利用解密后得到的明文就是bacon.docx的加密文档密码,成功打开一个“空”文档。

打开word后,没有任何内容,全选也无法看到。猜想是字体隐藏,于是关闭隐藏后能够看到换行符。

全选之后发现有内容,然后讲字体颜色更改后得到字符串。

结合培根密码,发现题中是用斜体表示的培根密码(正常为a,斜体为b),讲培根密码还原

最终通过脚本或者在线的解密可以得到flag

培根密码解密脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#!/usr/bin/python
# -*- coding: utf-8 -*-
import re

alphabet = ['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']

first_cipher = ["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"]

second_cipher = ["aaaaa","aaaab","aaaba","aaabb","aabaa","aabab","aabba","aabbb","abaaa","abaaa","abaab","ababa","ababb","abbaa","abbab","abbba","abbbb","baaaa","baaab","baaba","baabb","baabb","babaa","babab","babba","babbb"]

def encode():
string = raw_input("please input string to encode:\n")
e_string1 = ""
e_string2 = ""
for index in string:
for i in range(0,26):
if index == alphabet[i]:
e_string1 += first_cipher[i]
e_string2 += second_cipher[i]
break
print "first encode method result is:\n"+e_string1
print "second encode method result is:\n"+e_string2
return


def decode():
e_string = raw_input("please input string to decode:\n")
e_array = re.findall(".{5}",e_string)
d_string1 = ""
d_string2 = ""
for index in e_array:
for i in range(0,26):
if index == first_cipher[i]:
d_string1 += alphabet[i]
if index == second_cipher[i]:
d_string2 += alphabet[i]
print "first decode method result is:\n"+d_string1
print "second decode method result is:\n"+d_string2
return


if __name__ == '__main__':
while True:
print "\t*******Bacon Encode_Decode System*******"
print "input should be lowercase,cipher just include a b"
print "1.encode\n2.decode\n3.exit"
s_number = raw_input("please input number to choose\n")
if s_number == "1":
encode()
raw_input()
elif s_number == "2":
decode()
raw_input()
elif s_number == "3":
break
else:
continue

总结

本题相对简单,主要是介绍古典密码学中培根密码,至于RSA非对称加密,之后我会专门写一篇相关介绍以及分析各种RSA题型。