伏羲六十四卦
解压之后有两个文件,一个是加密脚本,一个是txt文件,txt文件给了我们一串密文,就是六十四卦中的汉字,那就是与六十四卦有关,查找六十四卦相关信息,发现有一篇文章是讲六十四卦与二进制的关系,上网查询之后,找到了这样一张图片
那现在就很清楚了,需要把给出的密文转换为二进制数字,
s='升随临损巽睽颐萃小过讼艮颐小过震蛊屯未济中孚艮困恒晋升损蛊萃蛊未济巽解艮贲未济观豫损蛊晋噬嗑晋旅解大畜困未济随蒙升解睽未济井困未济旅萃未济震蒙未济师涣归妹大有'
dic={'坤': '000000', '剥': '000001', '比': '000010', '观': '000011', '豫': '000100', '晋': '000101', '萃': '000110', '否': '000111', '谦': '001000', '艮': '001001', '蹇': '001010', '渐': '001011', '小过': '001100', '旅': '001101', '咸': '001110', '遁': '001111', '师': '010000', '蒙': '010001', '坎': '010010', '涣': '010011', '解': '010100', '未济': '010101', '困': '010110', '讼': '010111', '升': '011000', '蛊': '011001', '井': '011010', '巽': '011011', '恒': '011100', '鼎': '011101', '大过': '011110', '姤': '011111', '复': '100000', '颐': '100001', '屯': '100010', '益': '100011', '震': '100100', '噬嗑': '100101', '随': '100110', '无妄': '100111', '明夷': '101000', '贲': '101001', '既济': '101010', '家人': '101011', '丰': '101100', '离': '101101', '革': '101110', '同人': '101111', '临': '110000', '损': '110001', '节': '110010', '中孚': '110011', '归妹': '110100', '睽': '110101', '兑': '110110', '履': '110111', '泰': '111000', '大畜': '111001', '需': '111010', '小畜': '111011', '大壮': '111100', '大有': '111101', '夬': '111110', '乾': '111111'}
li=[]
k=0
"""
老规矩来解释一下下面的脚本是什么意思:
首先创建一个循环结构,找到每个字相对应的值,但是我们仔细观察可以发现
六十四卦表中并不是一个二进制数字对应一个字,例如 '大过': '011110'就是两个字
所以我们可以使用try语句来尝试,如果碰到对应两个字的,就用expect后的程序
然后关于k值,因为我们在取得了两个字的二进制数后,i就会相对少1,因此我们可以用continue语句来解决
可能说的有一些抽象,可以通过调试来解决一下问题
"""
for i in range(len(s)):
if k ==1:
k=0
continue
try:
li.append(dic[s[i]])
except:
t=''
t=t+s[i]+s[i+1]
li.append(dic[t])
k=1
ss=''.join(li)
print(ss)
得到二进制数后,我试了一下二进制数的转换,但是没有啥用,因此还需要对二进制数动一些手脚,现在就是拼一下脑洞,六十四+二进制,可以试试base64,但是base64是每八个二进制数为一个单位,因此还需要写脚本
enc=''
for i in range(0,len(ss),8):
enc+=chr(eval('0b'+ss[i:i+8]))
print(enc)
eval是返回计算后的字符串值,0b是转换二进制数的意思.
bl1oXF1ra2FbW2VpV1dfUmBiT11dYE5NVVdXSUZYSFVDUA==
base64解码,得到了
n]h\]kka[[eiWW_R`bO]]`NMUWWIFXHUCP
这最后啥也看不出来了,但是题目还给了我们一个加密脚本
from secret import flag
def encrpyt5():
enc=''
for i in flag:
enc+=chr((a*(ord(i)-97)+b)%26+97)
return(enc)
def encrypt4():
temp=''
offset=5
for i in range(len(enc)):
temp+=chr(ord(enc[i])-offset-i)
return(temp)
那就只需要逆着它写了,它先5再4,那我们写的时候就先4再5
def decrypt4(enc):
temp=''
offset=5
for i in range(len(enc)):
temp+=chr(ord(enc[i])+offset+i)
return temp
#decrypt5
def decrypt5(flag):
for a in range(1,200):
enc = ''
for i in flag:
for k in range(200):
if (ord(i) - 97 - 7+26*k)%a==0:
enc+= chr((ord(i) - 97 - 7 + 26 * k) // a + 97)
break
print(enc)
把所有脚本加起来,就是最后的答案了
#decrypt4
def decrypt4(enc):
temp=''
offset=5
for i in range(len(enc)):
temp+=chr(ord(enc[i])+offset+i)
return temp
#decrypt5
def decrypt5(flag):
for a in range(1,200):
enc = ''
for i in flag:
for k in range(200):
if (ord(i) - 97 - 7+26*k)%a==0:
enc+= chr((ord(i) - 97 - 7 + 26 * k) // a + 97)
break
print(enc)
#暴力破解
s='升随临损巽睽颐萃小过讼艮颐小过震蛊屯未济中孚艮困恒晋升损蛊萃蛊未济巽解艮贲未济观豫损蛊晋噬嗑晋旅解大畜困未济随蒙升解睽未济井困未济旅萃未济震蒙未济师涣归妹大有'
dic={'坤': '000000', '剥': '000001', '比': '000010', '观': '000011', '豫': '000100', '晋': '000101', '萃': '000110', '否': '000111', '谦': '001000', '艮': '001001', '蹇': '001010', '渐': '001011', '小过': '001100', '旅': '001101', '咸': '001110', '遁': '001111', '师': '010000', '蒙': '010001', '坎': '010010', '涣': '010011', '解': '010100', '未济': '010101', '困': '010110', '讼': '010111', '升': '011000', '蛊': '011001', '井': '011010', '巽': '011011', '恒': '011100', '鼎': '011101', '大过': '011110', '姤': '011111', '复': '100000', '颐': '100001', '屯': '100010', '益': '100011', '震': '100100', '噬嗑': '100101', '随': '100110', '无妄': '100111', '明夷': '101000', '贲': '101001', '既济': '101010', '家人': '101011', '丰': '101100', '离': '101101', '革': '101110', '同人': '101111', '临': '110000', '损': '110001', '节': '110010', '中孚': '110011', '归妹': '110100', '睽': '110101', '兑': '110110', '履': '110111', '泰': '111000', '大畜': '111001', '需': '111010', '小畜': '111011', '大壮': '111100', '大有': '111101', '夬': '111110', '乾': '111111'}
li=[]
k=0
for i in range(len(s)):
if k ==1:
k=0
continue
try:
li.append(dic[s[i]])
except:
t=''
t=t+s[i]+s[i+1]
li.append(dic[t])
k=1
ss=''.join(li)
print(ss)
#二进制转换
enc=''
for i in range(0,len(ss),8):
enc+=chr(eval('0b'+ss[i:i+8]))
print(enc)
#base64解码
import base64
x=base64.b64decode(enc).decode()
print(x)
decrypt4(x)
decrypt5(x)
36D-Crypto-你rot了吗
W9@F0>:2?0D9:07=28X/3/TUW/o/7/PUo/ST7/T/6/R
提示给我们要先rot,再看键盘,在rot47解码之后,我们得到
(hou_mian_shi_flag)^b^%&(^@^f^!&@^$%f^%^e^#
但后面是错误答案,所以是嵌套类型的,把上面的特殊字符均转换为数字,再16进制解密即可。
The Dancing Men
题目给了我们一张图片
看过福尔摩斯的人都知道,这是出现在其作品里的人形密码
带方框的小人代表着一个单词的结束,这个只能一个一个推导,最后是
please use underslash between every word with initivals in capitals
the flag is everyone loves taoshen
小提示,记得加下划线。
RSAZE
题目给了四个文件,三个加密文件一个密钥文件,老规矩使用代码将它们先提取出来
from Crypto.PublicKey import RSA
import libnum
import gmpy2
from Crypto.Util.number import *
c1 = open('encrypted.message1', 'rb').read()
c2 = open('encrypted.message2', 'rb').read()
c3 = open('encrypted.message3', 'rb').read()
pub1=RSA.importKey(open('public.key').read())
n=pub1.n
e=pub1.e
这次一口气给了3个c不像之前的共模攻击,可以一个一个解解试试,出来n之后,我们需要对其进行分解,得到需要的p和q,然后按寻常的rsa题目解题,依次得到三个c所对应的三个m。
from Crypto.PublicKey import RSA
import libnum
import gmpy2
from Crypto.Util.number import *
c1 = open('encrypted.message1', 'rb').read()
c2 = open('encrypted.message2', 'rb').read()
c3 = open('encrypted.message3', 'rb').read()
pub1=RSA.importKey(open('public.key').read())
n=pub1.n
e=pub1.e
p=302825536744096741518546212761194311477
q=325045504186436346209877301320131277983
phi_n=(p-1)*(q-1)
d=gmpy2.invert(e,phi_n)
c1_a=bytes_to_long(c1)
m1=pow(c1_a,d,n)
c2_a=bytes_to_long(c2)
m2=pow(c2_a,d,n)
c3_a=bytes_to_long(c3)
m3=pow(c3_a,d,n )
print(m1)
print(m2)
print(m3)
print(long_to_bytes(m1))
print(long_to_bytes(m2))
print(long_to_bytes(m3))
最后得到的是
b'\x02Z\x80\x07\xe9\xad(\t\xab\xbfZ\x00flag{3b6d3806-4b2b\n'
b'\x02\xd2\xb9{n\xa0\xd9\xe5\x16\x9e\x1b\xc1LH\xa0\xdb\xecT\x00-11e7-95a0-\n'
b'\x02eN\xe6$Cq\xf5D+O\xc8\xb9m\x7f/\x00000c29d7e93d}\n'
把后面的组合起来就好了。
flag{3b6d3806-4b2b-11e7-95a0-000c29d7e93d}
justshow
hlcgoyfsjqknyifnpd:bcdefghijklmnopqrstuvwxyza
给了一串密文,冒号后面可以看出来是字母表,只不过像是用凯撒加密移动了一位,复原后为
gkbfnxeripjmxhemoc:abcdefghijklmnopqrstuvwxyz
这像是冒号后面是密钥,前面是密文,可以观察一下前面的字符,只由小写字母组成,用后面的字母表推不出来什么,,再看一下个数,18个字母,为偶数,带着该密码的特征:均由小写字母组成且位数为偶数,找到了一个叫playfair密码的,用密码转换器解密Playfair Cipher
flag为flag{ctfshowicome}。