本文主要是介绍CRYPTO-2BJDCTF2020-伏羲六十四卦,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
0x00 前言
- CTF 加解密合集
- CTF Web合集
- 网络安全知识库
- 溯源相关
文中工具皆可关注 皓月当空w 公众号 发送关键字 工具 获取
0x01 题目
这是什么,怎么看起来像是再算64卦!!!密文:升随临损巽睽颐萃小过讼艮颐小过震蛊屯未济中孚艮困恒晋升损蛊萃蛊未济巽解艮贲未济观豫损蛊晋噬嗑晋旅解大畜困未济随蒙升解睽未济井困未济旅萃未济震蒙未济师涣归妹大有嗯?为什么还有个b呢?
b=7flag:请按照格式BJD{}
# -- coding:UTF-8 --
# from secret import flag
flag="asdasd"
def encrpyt5():enc=''for i in flag:enc+=chr((a*(ord(i)-97)+b)%26+97)return(enc)def encrypt4():temp=''offset=5for i in range(len(enc)):temp+=chr(ord(enc[i])-offset-i)return(temp)
0x02 Write Up
首先知道六十四卦的转换,就是每一卦都换成六位二进制,不知道谁能想到,反正我想不到
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'}
然后6为换成8为,转换为字符,也就是转换为base64的过程
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'}cc=""
i=0
while True:if i >=len(s):breaktry:cc+=dic[s[i]]except:cc+=dic[s[i] + s[i + 1]]i+=1i+=1
x=""
end=cc
for i in range(0,len(end),8):ins=end[i:i+8]x+=chr(int(ins,2))
可以拿到一个bl1oXF1ra2FbW2VpV1dfUmBiT11dYE5NVVdXSUZYSFVDUA==
然后解码:
然后先解de4
def de4():temp = ''offset = 5for i in range(len(enc)):temp += chr(ord(enc[i]) + offset + i)return (temp)
然后再解de5,查了一些资料发现这种方式是仿射加密算法,仿射算法可以通过爆破的方式进行解密:
加密函数:Y=(AX+B)%26
解密函数:Y=(AX+B)%26,得到:X=(A的逆元)*(Y-B)%26
逆元可以通过爆破的方式得到:
def get_multiplicative_inverse(a):for i in range(1, 27):if a * i % 26 == 1:return i
最终进行运算得到
for a in range(1,27):flag=""for i in temp:# print((((ord(i) - 97) - 7) * get_multiplicative_inverse(a)) % 26 + 97)try:s=chr((((ord(i) - 97) - 7) * get_multiplicative_inverse(a)) % 26 + 97)flag+=sexcept:breakprint(flag)
bjdcongratulationsongettingtheflag
以上
other
欢迎大家关注我朋友的公众号 皓月当空w 分享漏洞情报以及各种学习资源,技能树,面试题等。
以上
这篇关于CRYPTO-2BJDCTF2020-伏羲六十四卦的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!