密码学
xctf新手篇
知识点
- 凯撒密码(适用于字母):明文上的所有字母,按字母表上的顺序向前(或向后)偏移N位,常用词频分析解码。
- 基于密钥的凯撒密码:利用一个密钥加密明文,将密钥的每个字母转化成其在字母表中的顺序,每个明文字母移动对应的顺序即得到密文。
例: - 栅栏密码:明文分成N组,依次取每个组的第1,2…位组成一组无序字符,再将无序字符依次拼接起来得到密文
- 移位密码:与凯撒相似,但是可以处理数字和特殊字符(工具待寻找)
- Atbash Cipher:简单的单表替换密码,最后一位替换第一位,倒数第二位替换第二位(词频分析)
- 单表替换密码:(词频分析)
- 摩斯密码:只有两种信号,.和-,需要判断01哪个是.和-
- 云影密码:又叫01248密码,能够表示26个字母,每个字母用0分隔开,分割开部分相加,得到字母在字母表中的顺序。
- 培根密码:将进制信息通过样式表现出来
- base64:将一个字节8位拆出来6位,并将拆出来的6位按一个字节存储,如果拆出来后剩下的不足6位,进行补足,用特殊的6位符号“=”,?:为什么需要满足补足后也是8的位数。因此看到“=”想到base64
- unicode编码:该网址解释的很好:添加链接描述,unicode的编码形式有UTF-8,UTF-16,UTF-32
- 明文:m,密文c,加密E,解密D
- RSA加密算法;
- 随便找出两个 整数 q 和 p (q,p互素,即:公因数只有1)
- 求出n = q * p
- φ(n)= (p-1)*(q-1) 欧拉公式
- 公钥 e : 随机取,要求 :e 和 φ(n) 互素(公因数只有 1); 1< e < φ(n));
- 私钥 d : ed ≡ 1 (mod φ(n) ) (ed 除以 φ(n) 的 余数 为 1 )
- RSA应用于签名(签名的目的是证明这件事是它干的,不在乎信息保密性,就是 签名消息其实就是一个校验码,确保密文在传播过程中没有被篡改过):RSA也可以用来为一个消息署名。假如Alice想给Bob传递一个署名的消息的话,那么她可以为她的消息计算一个散列值(Message digest),然后用她的私钥“加密”(如同前面“加密消息”的步骤)这个散列值并将这个“署名”加在消息的后面。这个消息只有用她的公钥才能被解密。Bob获得这个消息后可以用Alice的公钥“解密”(如同前面“解密消息”的步骤)这个散列值,然后将这个数据与他自己为这个消息计算的散列值相比较。假如两者相符的话,那么Bob就可以知道发信人持有Alice的私钥,以及这个消息在传播路径上没有被篡改过。
- 椭圆曲线加解密算法:
- 加密机制:需要找到类似于RSA质因子分解或其他求离散对数这样的难题,此处x为私钥,xG为公钥,其中G为G点,椭圆曲线上已知G和xG求x是非常困难的,此即为椭圆曲线上的离线对数问题。
第一题
- 由附件可知:oknqdbqmoq{kag_tmhq_xqmdzqp_omqemd_qzodkbfuaz},是一个flag{}的形式,猜测为凯撒密码。
- 粗暴法:不断尝试输入数字
- 代码法:偏移1-26位尝试
第二题:
- 文件中全为01数字,根据title为摩斯密码,将01换位.和-,密文中空格用/代替。得到flag
- 11 111 010 000 0 1010 111 100 0 00 000 000 111 00 10 1 0 010 0 000 1 00 10 110
- –/—/.-./…/./-.-./—/-…/./…/…/…/—/…/-./-/./.-././…/-/…/-./–.
第三题
- 打开附件发现文件内容:8842101220480224404014224202480122,发现为01248密码,即为云影密码,云影密码解题脚本
#encoding: utf-8
#云影密码
a="8842101220480224404014224202480122"
a=a.split("0")
print a
flag=''
for i in range(0,len(a)):
str = a[i]
list=[]
sum=0
for j in str:
list.append(j)
length = len(list)
for k in range(0,length):
sum+=int(list[k])
# print sum
# print sum
flag+=chr(sum+64)
print flag
得到WELLDONE
第四题
- 题目附件为:ccehgyaefnpeoobe{lcirg}epriec_ora_g
- 根据题目表述为栅栏密码,且猜测分为5组。但是放到栅栏密码解密工具中得到的结果不对
- 考虑栅栏密码变形:flag的形式为cyberpeace{},所以分组为
ccehg
yaefnpeoo
be{lcirg}
epriec_o
ra_g
发现不均匀分组,结合flag的格式,猜测到1234543212345…
第五题
- 附件文件:
–/.-/-.–/…–.-/-…/./…–.-/…/.-/…-/./…–.-/.-/-./—/-/…/./.-./…–.-/-…/./-.-./—/-…/./…/…/…/…/.-/.-/.-/.-/.-/-…/.-/.-/-…/-…/-…/.-/.-/-…/-…/.-/.-/.-/.-/.-/.-/.-/.-/-…/.-/.-/-…/.-/-…/.-/.-/.-/.-/.-/.-/.-/-…/-…/.-/-…/.-/.-/.-/-…/-…/.-/.-/.-/-…/-…/.-/.-/-…/.-/.-/.-/.-/-…/.-/-…/.-/.-/-…/.-/.-/.-/-…/-…/.-/-…/.-/.-/.-/-…/.-/.-/.-/-…/.-/.-/-…/.-/-…/-…/.-/.-/-…/-…/-…/.-/-…/.-/.-/.-/-…/.-/-…/.-/-…/-…/.-/.-/.-/-…/-…/.-/-…/.-/.-/.-/-…/.-/.-/-…/.-/.-/-…/.-/.-/.-/.-/-…/-…/.-/-…/-…/.-/.-/-…/-…/.-/.-/-…/.-/.-/-…/.-/.-/.-/-…/.-/.-/-…/.-/.-/-…/.-/.-/-…/.-/-…/.-/.-/-…/-…/.-/-…/.-/.-/.-/.-/-…/-…/.-/-…/.-/.-/-…/-…/.- - 把/用空格代替是摩斯密码,进行摩斯密码解密得到
hhhh后面是abab,结合题目说是一种食物,推测为培根密码 - 进行培根密码解密得到
进行大小写转换得到flag,str=str1.lower。
第六题
- 附件:JiM3NjsmIzEyMjsmIzY5OyYjMTIwOyYjNzk7JiM4MzsmIzU2OyYjMTIwOyYjNzc7JiM2ODsmIzY5OyYjMTE4OyYjNzc7JiM4NDsmIzY1OyYjNTI7JiM3NjsmIzEyMjsmIzEwNzsmIzUzOyYjNzY7JiMxMjI7JiM2OTsmIzEyMDsmIzc3OyYjODM7JiM1NjsmIzEyMDsmIzc3OyYjNjg7JiMxMDc7JiMxMTg7JiM3NzsmIzg0OyYjNjU7JiMxMjA7JiM3NjsmIzEyMjsmIzY5OyYjMTIwOyYjNzg7JiMxMDU7JiM1NjsmIzEyMDsmIzc3OyYjODQ7JiM2OTsmIzExODsmIzc5OyYjODQ7JiM5OTsmIzExODsmIzc3OyYjODQ7JiM2OTsmIzUwOyYjNzY7JiMxMjI7JiM2OTsmIzEyMDsmIzc4OyYjMTA1OyYjNTY7JiM1MzsmIzc4OyYjMTIxOyYjNTY7JiM1MzsmIzc5OyYjODM7JiM1NjsmIzEyMDsmIzc3OyYjNjg7JiM5OTsmIzExODsmIzc5OyYjODQ7JiM5OTsmIzExODsmIzc3OyYjODQ7JiM2OTsmIzExOTsmIzc2OyYjMTIyOyYjNjk7JiMxMTk7JiM3NzsmIzY3OyYjNTY7JiMxMjA7JiM3NzsmIzY4OyYjNjU7JiMxMTg7JiM3NzsmIzg0OyYjNjU7JiMxMjA7JiM3NjsmIzEyMjsmIzY5OyYjMTE5OyYjNzc7JiMxMDU7JiM1NjsmIzEyMDsmIzc3OyYjNjg7JiM2OTsmIzExODsmIzc3OyYjODQ7JiM2OTsmIzExOTsmIzc2OyYjMTIyOyYjMTA3OyYjNTM7JiM3NjsmIzEyMjsmIzY5OyYjMTE5OyYjNzc7JiM4MzsmIzU2OyYjMTIwOyYjNzc7JiM4NDsmIzEwNzsmIzExODsmIzc3OyYjODQ7JiM2OTsmIzEyMDsmIzc2OyYjMTIyOyYjNjk7JiMxMjA7JiM3ODsmIzY3OyYjNTY7JiMxMjA7JiM3NzsmIzY4OyYjMTAzOyYjMTE4OyYjNzc7JiM4NDsmIzY1OyYjMTE5Ow==
- 最后面的==证明是base64,解码后得到LzExOS8xMDEvMTA4Lzk5LzExMS8xMDkvMTAxLzExNi8xMTEvOTcvMTE2LzExNi85Ny85OS8xMDcvOTcvMTEwLzEwMC8xMDAvMTAxLzEwMi8xMDEvMTEwLzk5LzEwMS8xMTkvMTExLzExNC8xMDgvMTAw观察能够证明是unicode解码
- 解码后得到LzExOS8xMDEvMTA4Lzk5LzExMS8xMDkvMTAxLzExNi8xMTEvOTcvMTE2LzExNi85Ny85OS8xMDcvOTcvMTEwLzEwMC8xMDAvMTAxLzEwMi8xMDEvMTEwLzk5LzEwMS8xMTkvMTExLzExNC8xMDgvMTAw,再次进行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,将ASSII转为对应的字符
str="/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"
str=str.split("/")
result=''
for i in range(1,len(str)):
result+=chr(int(str[i]))
print result
- 得到,welcometoattackanddefenceworld
第七题
- 附件为:在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17,求解出d
- 使用gmpy2工具包,gmpy2.mpz()初始化一个大整数,gmpy2.invert()求逆元
import gmpy2
p=473398607161
q=4511491
e=17
n=p*q
z=(p-1)*(q-1)
d=gmpy2.invert(e,z)
print(d)
第八题(5.13)
- 附件下载下来是.pyc文件,利用uncompyle6进行反编译,得到python代码
# uncompyle6 version 3.7.4
# Python bytecode 2.7 (62211)
# Decompiled from: Python 2.7.18 (v2.7.18:8d21aa21f2, Apr 20 2020, 13:25:05) [MSC v.1500 64 bit (AMD64)]
# 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'
- 经过分析Python 代码发现,final进行三次解密即可得到flag,解密顺序为321,异或解密还为异或,加法变减法,减法变加法
- 代码如下:
import base64
def decode3(ans):
return base64.b32decode(ans)
def decode2(ans):
s=''
for i in ans:
x=ord(i)^36
x=x-36
s+=chr(x)
return s
def decode1(ans):
s=''
for i in ans:
x=ord(i)-25
x=x^36
s+=chr(x)
return s
flag="UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E==="
flag3=decode3(flag)
print flag3
flag2=decode2(flag3)
print flag2
flag1=decode1(flag2)
print flag1
- 得到结果:cyberpeace{interestinghhhhh}
第九题(5.14)
- 轮转机密码,打开附件如下:
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
2. 一共13行,且秘钥为1-13的数字,每行为26个字母,且每个字母不重复,每行按秘钥顺序调整,即第二行放在第一行处,第3行放第二行处
3. 根据密文:NFQKSEVOQOFNP,密文13个字母对应13行,将每行出现密文字母及以后的字母调整至前面,剩下的字母发放到后面。
4. 13行字母的各个列,代码如下,手动调整会更快出结果:
#10题
import re
init="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 <"
key=[2,3,7,5,13,12,9,1,8,10,4,11,6]
cipher="NFQKSEVOQOFNP"
content=re.findall(r'<(.*?)<',init,re.S)
print content
final=[]
result=[]
resultfinal=[]
for i in range(0,13):
final.append(content[key[i]-1])
print(content[key[i]-1])
# print final
for i in range(0,13):
text=final[i]
# print(len(final[i]))
# text=text[1:len(final[0])]
# print text
index=text.find(cipher[i])
print index
res=text[index:-1]+text[1:index]
print res
result.append(res)
print result
print(len(result[0]))
for i in range(0,len(result[0])):
res2=''
for j in range(0,13):
res2+=result[j][i]
print(res2)
print resultfinal
- 这里有一个容易犯错的地方: 将附件中字符串根据正则表达式提取出来:空格ZWAXJGDLUBVIQHKYPNTCRMOSFE 空格,需要将空格删除掉,因为根据密文轮转时会出现这样的结果:
NACZDTRXMJQOYHGVSFUWI KPBEL
FHTEQGYXPLOCK BDMAIZVRNSJUW
Q GWTHSPYBXIZULVKMRAFDCEONJ
KCPMNZQWXY IHFRLABEUOTSGJVD
SXCDERFVBGTYHNUMKILOP JZQAW
EIURYTASBKJDFHG LVNCMXZPQOW
VUBMCQWAOIKZGJ XPLTDSRFHENY
OSFE ZWAXJGDLUBVIQHKYPNTCRM
Q NOZUTWDCVRJLXKISEFAPMYGHB
OWTGVRSCZQKELMXYIHP UDNAJFB
FCUKTEBSXQYIZMJWAO RPLNDVHG
NBVCXZQWERTPOIUYALSKDJFHG M
PNYCJBFZDRUSLOQXVET AMKGHIW
提取列信息时,会出现有的列提取出来时13个字母,有的不够,从而得不到正确结果:
NFQKSEVOQOFNP
AH CXIUS WCBN
CT PCUBF TUVY
ZEGMDRMENGKCC
DQWNEYC OVTXJ
TGTZRTQ ZREZB
RYHQFAWZUSBQF
XXSWVSAWTCSWZ
MPPXBBOAWZXED
JLYYGKIXDQQRR
QOB TJKJCKYTU
OCX YDZGVEIPS
YKIIHFGDRLZOL
H ZHNHJLJMMIO
G UFUG ULXJUQ
VBLRM BXYWYX
SDVLK XVKIAAV
FMKAILPIIHOLE
UAMBLVLQSP ST
WIREONTHE K
IZAUPCDKF RD
VFO MSYAUPJA
RDT XRPPDLFM
KNCSJZFNMNNHK
PSEGZPHTYADGG
BJOJQQECGJV H
EUNVAONRHFH I
LWJDWWYMBBGMW