XCTF新手區Crypto writeup

1.base64

直接拿去base64 decode就行:cyberpeace{Welcome_to_new_World!}

2.Caesar

這題凱撒密碼。

分別設置位移量爲1-25,輸出25條結果後看到位移量爲12時有意義,故位移量爲12:cyberpeace{you_have_learned_caesar_encryption}

3.Morse

摩斯密碼,我們在記事本里將1全部替換成“-”,將0全部替換成“.”,得到密文:

-- --- .-. ... . -.-. --- -.. . .. ... ... --- .. -. - . .-. . ... - .. -. --.

摩斯密碼解碼:

將其轉成小寫就拿到了flag。

4.混合編碼

原文:JiM3NjsmIzEyMjsmIzY5OyYjMTIwOyYjNzk7JiM4MzsmIzU2OyYjMTIwOyYjNzc7JiM2ODsmIzY5OyYjMTE4OyYjNzc7JiM4NDsmIzY1OyYjNTI7JiM3NjsmIzEyMjsmIzEwNzsmIzUzOyYjNzY7JiMxMjI7JiM2OTsmIzEyMDsmIzc3OyYjODM7JiM1NjsmIzEyMDsmIzc3OyYjNjg7JiMxMDc7JiMxMTg7JiM3NzsmIzg0OyYjNjU7JiMxMjA7JiM3NjsmIzEyMjsmIzY5OyYjMTIwOyYjNzg7JiMxMDU7JiM1NjsmIzEyMDsmIzc3OyYjODQ7JiM2OTsmIzExODsmIzc5OyYjODQ7JiM5OTsmIzExODsmIzc3OyYjODQ7JiM2OTsmIzUwOyYjNzY7JiMxMjI7JiM2OTsmIzEyMDsmIzc4OyYjMTA1OyYjNTY7JiM1MzsmIzc4OyYjMTIxOyYjNTY7JiM1MzsmIzc5OyYjODM7JiM1NjsmIzEyMDsmIzc3OyYjNjg7JiM5OTsmIzExODsmIzc5OyYjODQ7JiM5OTsmIzExODsmIzc3OyYjODQ7JiM2OTsmIzExOTsmIzc2OyYjMTIyOyYjNjk7JiMxMTk7JiM3NzsmIzY3OyYjNTY7JiMxMjA7JiM3NzsmIzY4OyYjNjU7JiMxMTg7JiM3NzsmIzg0OyYjNjU7JiMxMjA7JiM3NjsmIzEyMjsmIzY5OyYjMTE5OyYjNzc7JiMxMDU7JiM1NjsmIzEyMDsmIzc3OyYjNjg7JiM2OTsmIzExODsmIzc3OyYjODQ7JiM2OTsmIzExOTsmIzc2OyYjMTIyOyYjMTA3OyYjNTM7JiM3NjsmIzEyMjsmIzY5OyYjMTE5OyYjNzc7JiM4MzsmIzU2OyYjMTIwOyYjNzc7JiM4NDsmIzEwNzsmIzExODsmIzc3OyYjODQ7JiM2OTsmIzEyMDsmIzc2OyYjMTIyOyYjNjk7JiMxMjA7JiM3ODsmIzY3OyYjNTY7JiMxMjA7JiM3NzsmIzY4OyYjMTAzOyYjMTE4OyYjNzc7JiM4NDsmIzY1OyYjMTE5Ow==

一看就是base64,先解碼,解碼出來是這樣:

LzExOS8xMDEvMTA4Lzk5LzExMS8xMDkvMTAxLzExNi8xMTEvOTcvMTE2LzExNi85Ny85OS8xMDcvOTcvMTEwLzEwMC8xMDAvMTAxLzEwMi8xMDEvMTEwLzk5LzEwMS8xMTkvMTExLzExNC8xMDgvMTAw

猜想是unicode的HEX編碼,拿去解碼:

LzExOS8xMDEvMTA4Lzk5LzExMS8xMDkvMTAxLzExNi8xMTEvOTcvMTE2LzExNi85Ny85OS8xMDcvOTcvMTEwLzEwMC8xMDAvMTAxLzEwMi8xMDEvMTEwLzk5LzEwMS8xMTkvMTExLzExNC8xMDgvMTAw

再次猜想是baae64:

/119/101/108/99/111/109/101/116/111/97/116/116/97/99/107/97/110/100/100/101/102/101/110/99/101/119/111/114/108/100

這裏大佬說是ASCII,把它放進eclipse,將所有“/”替換爲“,”,構建數組,轉爲字符串:


public class Main {
	public static void main(String[] args) {
		int[] a = {119,101,108,99,111,109,101,116,111,97,116,116,97,99,107,97,110,100,100,101,102,101,110,99,101,119,111,114,108,100};
		String result = "";
		for(int i:a){
			char c = (char)i;
			result+=c;
		}
		System.out.println(result);
	}
}

得到結果:

5.冪數加密

密文:8842101220480224404014224202480122

提示:flag爲八位大寫字母

這裏學習一波冪數加密的知識:

二進制冪數加密法:

二進制冪數加密法,由於英文字母只有26個字母。只要2的0、1、2、3、4、5次冪就可以表示31個單元。通過用二進制冪數表示字母序號數來加密。

二進制數除了0和1的表示方法外,在由二進制轉換成十進制的時候,還可以表示成2的N次方的形式。例如:

15=2^0+2^1+2^2+2^3

並且我們發現,任意的十進制數都可以用2^n或2^n+2^m+……的形式表示出來,可以表示的單元數由使用的max n來決定。

可表示的單元數=2^(n+1)-1

也就是說,根據提示,在0之前分,將密文分爲8段:88421 0122  048 02244 04 0142242  0248 0122

但是如果是2的冪的話只需要0-5就行,密文中不會出現8,因此這和上面說的還有點不太一樣。

百度了一下,說是另一種01248密碼:

01248密碼,又稱雲影密碼…與二進制冪加密不同,這個加密法採用的是0作間隔,其他非0數隔開後組合起來相加表示序號1-26之一的字母(a/A,b/B,c/C…z/Z)

上python3代碼:

#01248密碼
def zeronetfe(m):
    alpha = ['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']
    m = m.split("0")
    c = ""
    for i in range(0,len(m)):
        str = m[i]
        num = 0;
        for j in range(0,len(str)):
            num += int(str[j])
        c += alpha[num-1]
    return c
def main():
    print(zeronetfe("8842101220480224404014224202480122"))
if __name__ == '__main__':
    main()

運行之後就得到結果。

6.Railfence

密文:ccehgyaefnpeoobe{lcirg}epriec_ora_g

這題是柵欄密碼,但是和常見的柵欄密碼不一樣,拿去在工具裏解密失敗:

根據提示:

到了一看,這個謎面看起來就已經有點像答案了樣子了,旁邊還畫着一張畫,是一副農家小院的 圖畫,上面畫着一個農婦在柵欄裏面喂5只小雞,

暗示柵欄是5。

百度了一下發現是一種叫WWW的變種:

此段介紹來自https://blog.csdn.net/qq_43504939/article/details/98473847
1 2 3 4 5 6 # key=3 Rail-fence Cipher

1 . . . 5 . ↘      ↗ ↘
. 2 . 4 . 6    ↘   ↗
. . 3 . . .     ↘ ↗

結果爲 1 5 2 4 6 3

此處貼一波其他大佬的python加解密代碼:

def encode(string, key):#需要加密的字符串以及加密欄數
    i = 0
    enlist = []
    for j in range(0, key):
        enlist.append('')#添加分組,列表的一個元素相當於一個分組

    while i < len(string):#分組重排進行加密
        for k in range(0, key):
            if i >= len(string):
                break
            enlist[k] += string[i]
            i += 1
        for k in range(1, key-1):
            if i >= len(string):
                break
            enlist[key-1-k] += string[i]
            i += 1
        enstr = ''
    for i in range(key):
       	enstr += enlist[i]
    return enstr

代碼來自https://blog.csdn.net/qinying001/article/details/96134356

def decode(string, key):#解密字符串以及解密欄數
    de_key = 2*key - 2#一個部分的長度
    length = len(string)//de_key#確定有多少個完整部分
    r = len(string)%de_key#最後不完整部分的長度
    delist = []
    for i in range(key):
        delist.append('')#重新排布分組
    #確定第一個分組
    if r == 0:
        delist[0] += string[0:length]
        s = length
    else:
        delist[0] += string[0:length+1]
        s = length+1
    #確定第二個到第key-1個分組
    for i in range(1, key-1):
        l = length*2#這幾個分組長度至少是完整部分數量的兩倍
        #最後一個不完整部分對應當前分組有幾個元素
        if r > i:
            l += 1
        if r > de_key-i:
            l += 1
     
        delist[i] += string[s:s+l]
        s = s+l
    #確定最後一個分組
    delist[key-1] += string[s:]
	#排布分組確定原文字符串
    destr = ''
    j = 0
    for i in range(0, len(string)):
        destr += delist[j][0]
        delist[j] = delist[j][1:]
        if j == key-1:
            flag = 0
        if j == 0:
            flag = 1
        if flag:
            j += 1
        else:
            j -= 1
    return destr

運行之,拿到明文:

7.easy_RSA

在一次RSA密鑰對生成中,假設p=473398607161,q=4511491,e=17
求解出d

這道題簡單粗暴,直接上python3代碼:


#已知p,q,e,求解密密鑰d
def egcd(a, b):
    if a == 0:
      return (b, 0, 1)
    else:
      g, y, x = egcd(b % a, a)
      return (g, x - (b // a) * y, y)
def modinv(a, m):
    g, x, y = egcd(a, m)
    if g != 1:
      raise Exception('模數分解失敗')
    else:
      return x % m
def main():
    e=17
    p=473398607161
    q=4511491
    d = modinv(e,(p-1)*(q-1))
    print(d) 
if __name__ == '__main__':
    main()

執行上述代碼就得到flag:

8.不僅僅是Morse

--/.-/-.--/..--.-/-..././..--.-/..../.-/...-/./..--.-/.-/-./---/-/...././.-./..--.-/-.././-.-./---/-.././..../..../..../..../.-/.-/.-/.-/.-/-.../.-/.-/-.../-.../-.../.-/.-/-.../-.../.-/.-/.-/.-/.-/.-/.-/.-/-.../.-/.-/-.../.-/-.../.-/.-/.-/.-/.-/.-/.-/-.../-.../.-/-.../.-/.-/.-/-.../-.../.-/.-/.-/-.../-.../.-/.-/-.../.-/.-/.-/.-/-.../.-/-.../.-/.-/-.../.-/.-/.-/-.../-.../.-/-.../.-/.-/.-/-.../.-/.-/.-/-.../.-/.-/-.../.-/-.../-.../.-/.-/-.../-.../-.../.-/-.../.-/.-/.-/-.../.-/-.../.-/-.../-.../.-/.-/.-/-.../-.../.-/-.../.-/.-/.-/-.../.-/.-/-.../.-/.-/-.../.-/.-/.-/.-/-.../-.../.-/-.../-.../.-/.-/-.../-.../.-/.-/-.../.-/.-/-.../.-/.-/.-/-.../.-/.-/-.../.-/.-/-.../.-/.-/-.../.-/-.../.-/.-/-.../-.../.-/-.../.-/.-/.-/.-/-.../-.../.-/-.../.-/.-/-.../-.../.-

將斜槓去除得到摩斯密碼:

-- .- -.-- ..--.- -... . ..--.- .... .- ...- . ..--.- .- -. --- - .... . .-. ..--.- -.. . -.-. --- -.. . .... .... .... .... .- .- .- .- .- -... .- .- -... -... -... .- .- -... -... .- .- .- .- .- .- .- .- -... .- .- -... .- -... .- .- .- .- .- .- .- -... -... .- -... .- .- .- -... -... .- .- .- -... -... .- .- -... .- .- .- .- -... .- -... .- .- -... .- .- .- -... -... .- -... .- .- .- -... .- .- .- -... .- .- -... .- -... -... .- .- -... -... -... .- -... .- .- .- -... .- -... .- -... -... .- .- .- -... -... .- -... .- .- .- -... .- .- -... .- .- -... .- .- .- .- -... -... .- -... -... .- .- -... -... .- .- -... .- .- -... .- .- .- -... .- .- -... .- .- -... .- .- -... .- -... .- .- -... -... .- -... .- .- .- .- -... -... .- -... .- .- -... -... .-

解碼:

MAYnullBEnullHAVEnullANOTHERnullDECODEHHHHAAAAABAABBBAABBAAAAAAAABAABABAAAAAAABBABAAABBAAABBAABAAAABABAABAAABBABAAABAAABAABABBAABBBABAAABABABBAAABBABAAABAABAABAAAABBABBAABBAABAABAAABAABAABAABABAABBABAAAABBABAABBA

may be have another decode hhhh AAAAABAABBBAABBAAAAAAAABAABABAAAAAAABBABAAABBAAABBAABAAAABABAABAAABBABAAABAAABAABABBAABBBABAAABABABBAAABBABAAABAABAABAAAABBABBAABBAABAABAAABAABAABAABABAABBABAAAABBABAABBA

根據提示,後面這截由A和B組成的估計是培根密碼,直接拿來解密,得到:

這裏也可以自己寫python代碼:

https://blog.csdn.net/weixin_42109012/article/details/97644262

9.easychallenge

下載下來是一個pyc文件,使用反編譯工具反編譯:

得到源代碼:

# uncompyle6 version 3.7.2
# Python bytecode 2.7 (62211)
# Decompiled from: Python 3.5.2 (default, Apr 16 2020, 17:47:17) 
# [GCC 5.4.0 20160609]
# Embedded file name: ans.py
# Compiled at: 2018-08-08 20:29:44
import base64

def encode1(ans):
    s = ''
    for i in ans:
        x = ord(i) ^ 36
        x = x + 25
        s += chr(x)

    return s


def encode2(ans):
    s = ''
    for i in ans:
        x = ord(i) + 36
        x = x ^ 36
        s += chr(x)

    return s


def encode3(ans):
    return base64.b32encode(ans)


flag = ' '
print 'Please Input your flag:'
flag = raw_input()
final = 'UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E==='
if encode3(encode2(encode1(flag))) == final:
    print 'correct'
else:
    print 'wrong'

根據源代碼編寫一個decode方法:

import base64
def decode(c):
    mid = base64.b32decode(c)
    mid2 = ''
    for i in mid:
        i = ord(i)^36
        x = chr(i-36)
        mid2 += x
    mid3 = ''
    for i in mid2:
        i = ord(i)-25
        x = chr(i^36)
        mid3 += x
    print mid3
decode('UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E===')

執行上述代碼得到flag:

10.

11.Normal_RSA

下載下來是一個enc和一個pem文件。

在linux裏使用命令:openssl rsa -pubin -text modulus in warmup -in pubkey.pem

提取公鑰:

將十六進制的公鑰放進RSATool,暴力分解,20分鐘之後得到結果:

p:319576316814478949870590164193048041239

q:275127860351348928173285174381581152299

然後點擊Calc D,計算私鑰d:

10866948760844599168252082612378495977388271279679231539839049698621994994673

然後根據上述生成私鑰文件:

python rsatool.py -f PEM -o private.pem -p 275127860351348928173285174381581152299 -q 319576316814478949870590164193048041239 -e 65537

再使用peivate.pem解密enc文件:

openssl rsautl -decrypt -in flag.enc -inkey private.pem -out flag.txt
就能拿到flag

12.easy_ECC

已知橢圓曲線加密Ep(a,b)參數爲

p = 15424654874903

a = 16546484

b = 4548674875

G(6478678675,5636379357093)

私鑰爲

k = 546768

求公鑰K(x,y)

使用大佬寫的工具ecctool,參數設置如下:

點擊calc R就得到結果 R(x,y)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章