[BJDCTF2020]伏羲六十四卦

本文讲述了如何通过将六十四卦的卦象转化为二进制,使用字典转换并解码密文,最终通过两次不同的加密方式(encrypto4和encrypto5)找到flag。解题过程涉及base64编码的处理和Python代码的爆破策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.题目

2.分析

3.解题

4.参考


1.题目

题目有两个文件,一个txt文本和一份python的代码文件

txt文本文件:

这是什么,怎么看起来像是再算64卦!!!

密文:升随临损巽睽颐萃小过讼艮颐小过震蛊屯未济中孚艮困恒晋升损蛊萃蛊未济巽解艮贲未济观豫损蛊晋噬嗑晋旅解大畜困未济随蒙升解睽未济井困未济旅萃未济震蒙未济师涣归妹大有

嗯?为什么还有个b呢?
b=7


flag:请按照格式BJD{}

python代码文件:
 

# -- coding:UTF-8 --
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)


2.分析

这个题目脑洞大,需要将六十四卦的卦象按照顺序转化为6位的二进制的数,然后再利用字典将密文转化为二进制字符串,再转化为可见字符,得到的可见字符是base64编码,我们进一步的可以对其进行解析,得到一份乱序的字符,根据所给python代码,我们再进行一些比较简单的爆破工作就能够把题目做出来了。

3.解题

获得六十四卦的字典,这个怎么确定的顺序我也不清楚:

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'}

根据字典将密文转化为二进制字符串:

a = '升随临损巽睽颐萃小过讼艮颐小过震蛊屯未济中孚艮困恒晋升损蛊萃蛊未济巽解艮贲未济观豫损蛊晋噬嗑晋旅解大畜困未济随蒙升解睽未济井困未济旅萃未济震蒙未济师涣归妹大有'
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'}
s = ''
i = 0
while i < len(a):
    try:
        s += dic[a[i]]
    except:
        s += dic[a[i] + a[i + 1]]
        i += 1
    i += 1
print(s)

#011000100110110000110001011011110101100001000110001100010111001001100001001100100100011001100010010101110011001001010110011100000101011000110001011001000110011001010101011011010100001001101001010101000011000100110001011001000101100101000101001101010100111001010110010101100110010001011000010100110101010101011010010110010101001101000110010101100100010001010101010000010011110100111101

八个一组,转化为可见字符:

s = '011000100110110000110001011011110101100001000110001100010111001001100001001100100100011001100010010101110011001001010110011100000101011000110001011001000110011001010101011011010100001001101001010101000011000100110001011001000101100101000101001101010100111001010110010101100110010001011000010100110101010101011010010110010101001101000110010101100100010001010101010000010011110100111101'
b = ''
for i in range(0, len(s), 8):
    b += chr(int(s[i:i + 8], 2))
print(b)

#bl1oXF1ra2FbW2VpV1dfUmBiT11dYE5NVVdXSUZYSFVDUA==

进行base64解码:

import base64

s = 'bl1oXF1ra2FbW2VpV1dfUmBiT11dYE5NVVdXSUZYSFVDUA=='
print(base64.b64decode(s))

#b'n]h\\]kka[[eiWW_R`bO]]`NMUWWIFXHUCP'

根据所给的两次加密的代码进行爆破:

破解encrypto4:


s = 'n]h\\]kka[[eiWW_R`bO]]`NMUWWIFXHUCP'
c = ''
for j in range(len(s)):
    c += chr(ord(s[j]) + 5 + j)
print('c = ' + c)

#c = scodfuvmhityhirfuxfuvziiruvigzkyhv

破解encrypto5:

import gmpy2

c = 'scodfuvmhityhirfuxfuvziiruvigzkyhv'
for i in range(1, 27):
    b = ''
    try:
        for j in range(len(c)):
            n = ((ord(c[j]) - 97) - 7) * gmpy2.invert(i, 26) % 26 + 97
            b += chr(n)
        if 'flag' in b:
            print(b)
    except:
        pass

#bjdcongratulationsongettingtheflag

所给的代码文件中没有明确说明两种加密的顺序,但是经过测试,应该是先进行4的解密,再进行5的解密,好像与正常的顺序有些不一样

flag即为:

BJD{bjdcongratulationsongettingtheflag}

4.参考

文章1文章2

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值