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)