文章目录
为了11月的比赛,菜鸡又开始速成密码学了…
1.base64
题目
Y3liZXJwZWFjZXtXZWxjb21lX3RvX25ld19Xb3JsZCF9
这题唯一的价值应该是让我熟悉下python内置的base64编码解码
import base64
s = "Y3liZXJwZWFjZXtXZWxjb21lX3RvX25ld19Xb3JsZCF9"
a = base64.b64decode(s)
print(a)
#cyberpeace{Welcome_to_new_World!}
2.Caesar
题目
oknqdbqmoq{kag_tmhq_xqmdzqp_omqemd_qzodkbfuaz}
凯撒密码加密,key=12。
凯撒解密在线
3.Morse
题目
11 111 010 000 0 1010 111 100 0 00 000 000 111 00 10 1 0 010 0 000 1 00 10 110
morse密码,数字1对应"-",数字0对应"."
– — .-. … . -.-. — -… . … … … — … -. - . .-. . … - … -. --.
解密得 morsecodeissointeresting
4.幂数加密
题目
88421/0122/048/02244/04/0142242/0248/0122
跟普通的幂数加密不太一样,这个用/划分,每两个//之间数字的和对应字母在字母表中的位置。[A-1,Z-26]
88421/0122/048/02244/04/0142242/0248/0122
23/5/12/12/4/15/14/5
WELLDONE
5.Railfence
题目
ccehgyaefnpeoobe{lcirg}epriec_ora_g
这题又是普通栏栅解密的变种,W型栏栅解密,就是把明文以W行排列,依次从左到右、从上到下,最后从第一行开始,逐行拼在一起形成密文。
cyberpeace{railfence_cipher_gogogo}
在线解密
6.不仅仅是Morse
题目
– .- -.-- …–.- -… . …–.- … .- …- . …–.- .- -. — - … . .-. …–.- -… . -.-. — -… . … … … … .- .- .- .- .- -… .- .- -… -… -… .- .- -… -… .- .- .- .- .- .- .- .- -… .- .- -… .- -… .- .- .- .- .- .- .- -… -… .- -… .- .- .- -… -… .- .- .- -… -… .- .- -… .- .- .- .- -… .- -… .- .- -… .- .- .- -… -… .- -… .- .- .- -… .- .- .- -… .- .- -… .- -… -… .- .- -… -… -… .- -… .- .- .- -… .- -… .- -… -… .- .- .- -… -… .- -… .- .- .- -… .- .- -… .- .- -… .- .- .- .- -… -… .- -… -… .- .- -… -… .- .- -… .- .- -… .- .- .- -… .- .- -… .- .- -… .- .- -… .- -… .- .- -… -… .- -… .- .- .- .- -… -… .- -… .- .- -… -… .-
给了一串morse电码 解密之后得到
may_be_have_another_decodehhhhaaaaabaabbbaabbaaaaaaaabaababaaaaaaabbabaaabbaaabbaabaaaababaabaaabbabaaabaaabaababbaabbbabaaabababbaaabbabaaabaabaabaaaabbabbaabbaabaabaaabaabaabaababaabbabaaaabbabaabba
后面的ab一看就知道是培根密码,用培根密码解密得到attackanddefenceworldisinteresting
7.混合编码
题目
JiM3NjsmIzEyMjsmIzY5OyYjMTIwOyYjNzk7JiM4MzsmIzU2OyYjMTIwOyYjNzc7JiM2ODsmIzY5OyYjMTE4OyYjNzc7JiM4NDsmIzY1OyYjNTI7JiM3NjsmIzEyMjsmIzEwNzsmIzUzOyYjNzY7JiMxMjI7JiM2OTsmIzEyMDsmIzc3OyYjODM7JiM1NjsmIzEyMDsmIzc3OyYjNjg7JiMxMDc7JiMxMTg7JiM3NzsmIzg0OyYjNjU7JiMxMjA7JiM3NjsmIzEyMjsmIzY5OyYjMTIwOyYjNzg7JiMxMDU7JiM1NjsmIzEyMDsmIzc3OyYjODQ7JiM2OTsmIzExODsmIzc5OyYjODQ7JiM5OTsmIzExODsmIzc3OyYjODQ7JiM2OTsmIzUwOyYjNzY7JiMxMjI7JiM2OTsmIzEyMDsmIzc4OyYjMTA1OyYjNTY7JiM1MzsmIzc4OyYjMTIxOyYjNTY7JiM1MzsmIzc5OyYjODM7JiM1NjsmIzEyMDsmIzc3OyYjNjg7JiM5OTsmIzExODsmIzc5OyYjODQ7JiM5OTsmIzExODsmIzc3OyYjODQ7JiM2OTsmIzExOTsmIzc2OyYjMTIyOyYjNjk7JiMxMTk7JiM3NzsmIzY3OyYjNTY7JiMxMjA7JiM3NzsmIzY4OyYjNjU7JiMxMTg7JiM3NzsmIzg0OyYjNjU7JiMxMjA7JiM3NjsmIzEyMjsmIzY5OyYjMTE5OyYjNzc7JiMxMDU7JiM1NjsmIzEyMDsmIzc3OyYjNjg7JiM2OTsmIzExODsmIzc3OyYjODQ7JiM2OTsmIzExOTsmIzc2OyYjMTIyOyYjMTA3OyYjNTM7JiM3NjsmIzEyMjsmIzY5OyYjMTE5OyYjNzc7JiM4MzsmIzU2OyYjMTIwOyYjNzc7JiM4NDsmIzEwNzsmIzExODsmIzc3OyYjODQ7JiM2OTsmIzEyMDsmIzc2OyYjMTIyOyYjNjk7JiMxMjA7JiM3ODsmIzY3OyYjNTY7JiMxMjA7JiM3NzsmIzY4OyYjMTAzOyYjMTE4OyYjNzc7JiM4NDsmIzY1OyYjMTE5Ow==
给了一串base64编码,也就是多绕几次就能解出来。
base64解码
LzExOS8xMDEvMTA4Lzk5LzExMS8xMDkvMTAxLzExNi8xMTEvOTcvMTE2LzExNi85Ny85OS8xMDcvOTcvMTEwLzEwMC8xMDAvMTAxLzEwMi8xMDEvMTEwLzk5LzEwMS8xMTkvMTExLzExNC8xMDgvMTAw
Unicode编码-->ASCII
LzExOS8xMDEvMTA4Lzk5LzExMS8xMDkvMTAxLzExNi8xMTEvOTcvMTE2LzExNi85Ny85OS8xMDcvOTcvMTEwLzEwMC8xMDAvMTAxLzEwMi8xMDEvMTEwLzk5LzEwMS8xMTkvMTExLzExNC8xMDgvMTAw
ASCII-->base64解码
'/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'
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]
s = []
for i in a:
s.append(chr(i))
print("".join(s))
#welcometoattackanddefenceworld
8.easy_RSA
题目
在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17
求解出d
了解RSA原理即可
#Euler(n) = (p-1)(q-1) = 2135733082216268400
#ed 同余1 mod(p-1)(q-1)
a= inverse_mod(17,2135733082216268400)
print(a)
#125631357777427553
9.easychallenge
这题稍微有点麻烦,给了一个pyc文件,需要先反编译成py文件然后再逆一下函数逻辑。
用kali自带的uncompyle来进行反编译。
root@devil:~/AD-World/CRYPTO/easychallenge# uncompyle6 ec.pyc
# uncompyle6 version 3.5.1
# Python bytecode 2.7 (62211)
# Decompiled from: Python 2.7.17 (default, Oct 19 2019, 23:36:22)
# [GCC 9.2.1 20191008]
# Embedded file name: ans.py
# Compiled at: 2018-08-09 11: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'
# okay decompiling ec.pyc
然后根据加密代码写出解密脚本即可
import base64
def decode1(ans):
s = ''
for i in ans:
x = ord(i) - 25
x = x ^ 36
s += chr(x)
return s
def decode2(ans):
s = ''
for i in ans:
x = ord(i) ^ 36
x = x - 36
s += chr(x)
return s
def decode3(ans):
return base64.b32decode(ans)
final = 'UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E==='
print (decode1(decode2(decode3(final))))
#cyberpeace{interestinghhhhh}
10.转轮机加密
题目
1: < ZWAXJGDLUBVIQHKYPNTCRMOSFE <
2: < KPBELNACZDTRXMJQOYHGVSFUWI <
3: < BDMAIZVRNSJUWFHTEQGYXPLOCK <
4: < RPLNDVHGFCUKTEBSXQYIZMJWAO <
5: < IHFRLABEUOTSGJVDKCPMNZQWXY <
6: < AMKGHIWPNYCJBFZDRUSLOQXVET <
7: < GWTHSPYBXIZULVKMRAFDCEONJQ <
8: < NOZUTWDCVRJLXKISEFAPMYGHBQ <
9: < XPLTDSRFHENYVUBMCQWAOIKZGJ <
10: < UDNAJFBOWTGVRSCZQKELMXYIHP <
11: < MNBVCXZQWERTPOIUYALSKDJFHG <
12: < LVNCMXZPQOWEIURYTASBKJDFHG <
13: < JZQAWSXCDERFVBGTYHNUMKILOP <
密钥为:2,3,7,5,13,12,9,1,8,10,4,11,6
密文为:NFQKSEVOQOFNP
转轮机加密方式:
密钥所代表的数字是将要操作的行数,密文对应的字母’X’表示从字母’X’开始。
比如<2,N>就表示从第2行,字母N开始
原来的是: KPBELNACZDTRXMJQOYHGVSFUWI
重新排序后: NACZDTRXMJQOYHGVSFUWIKPBEL
按照第2,3,7,5,13行…的顺序依次进行排序,得到如下:
2: NACZDTRXMJQOYHGVSFUWIKPBEL
3: FHTEQGYXPLOCKBDMAIZVRNSJUW
7: QGWTHSPYBXIZULVKMRAFDCEONJ
5: KCPMNZQWXYIHFRLABEUOTSGJVD
13: SXCDERFVBGTYHNUMKILOPJZQAW
12: EIURYTASBKJDFHGLVNCMXZPQOW
9: VUBMCQWAOIKZGJXPLTDSRFHENY
1: OSFEZWAXJGDLUBVIQHKYPNTCRM
8: QNOZUTWDCVRJLXKISEFAPMYGHB
10: OWTGVRSCZQKELMXYIHPUDNAJFB
4: FCUKTEBSXQYIZMJWAORPLNDVHG
11: NBVCXZQWERTPOIUYALSKDJFHGM
6: PNYCJBFZDRUSLOQXVETAMKGHIW
按列来找,在倒数第九列找到了一串字符,感觉应该是flag了。
FIREINTHEHOLE–>fireinthehole
11.Normal_RSA
给了一个flag.enc和pubkey.pem
本题需要用到的工具:openssl(kali自带)
-----BEGIN PUBLIC KEY-----
MDwwDQYJKoZIhvcNAQEBBQADKwAwKAIhAMJjauXD2OQ/+5erCQKPGqxsC/bNPXDr
yigb/+l/vjDdAgMBAAE=
-----END PUBLIC KEY-----公钥解析得到
e:65537
n:87924348264132406875276140514499937145050893665602592992418171647042491658461
p: 275127860351348928173285174381581152299
q:319576316814478949870590164193048041239
通过脚本计算私钥
#coding=utf-8
import math
import sys
from Crypto.PublicKey import RSA
arsa=RSA.generate(1024)
arsa.p=275127860351348928173285174381581152299
arsa.q=319576316814478949870590164193048041239
arsa.e=65537
arsa.n=arsa.p*arsa.q
Fn=long((arsa.p-1)*(arsa.q-1))
i=1
while(True):
x=(Fn*i)+1
if(x%arsa.e==0):
arsa.d=x/arsa.e
break
i=i+1
private=open('private.pem','w')
private.write(arsa.exportKey())
private.close()
再用私钥解密公钥
OpenSSL> rsautl -decrypt -in flag.enc -inkey private.pem
PCTF{256b_i5_m3dium}
12.easy_ECC
已知椭圆曲线加密Ep(a,b)参数为
p = 15424654874903
a = 16546484
b = 4548674875
G(6478678675,5636379357093)
私钥为
k = 546768
求公钥K(x,y)
先用ECCTOOL跑了一遍
x=13957031351290,y=5520194834100
x+y = 19477226185390
算法实现
#先实现椭圆曲线上的加法运算
# encoding=utf-8
p = 15424654874903
a = 16546484
b = 4548674875
def add(A, B):
if A == (0, 0): return B
if B == (0, 0): return A
x1, y1 = A
x2, y2 = B
if A != B:
λ = (y2 - y1) * pow((x2 - x1), p-2, p)
else:
λ = (x1*x1*3 + a) * pow(2*y1, p-2, p)
x3 = λ * λ - x1 - x2
y3 = λ * (x1 - x3) - y1
return (x3 % p, y3 % p)
由于 M 是素数,所以由费马小定理可知 (x2−x1)M−1
≡
\equiv
≡ 1(modM),
所以 x2−x1 的乘法逆元是 (x2−x1)M−2,同理,y2−y1 的乘法逆元是 (y2−y1)M−2.
接下来进行乘法运算(加密)
G = (6478678675,5636379357093)
k = 546768
C = (0, 0)
for i in range(k):
C = add(C, G)
print(C)
print("cyberpeace{%d}"%(C[0]+C[1]))
# cyberpeace{19477226185390}