密码学练习

密码学

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加密算法;
  1. 随便找出两个 整数 q 和 p (q,p互素,即:公因数只有1)
  2. 求出n = q * p
  3. φ(n)= (p-1)*(q-1) 欧拉公式
  4. 公钥 e : 随机取,要求 :e 和 φ(n) 互素(公因数只有 1); 1< e < φ(n));
  5. 私钥 d : ed ≡ 1 (mod φ(n) ) (ed 除以 φ(n) 的 余数 为 1 )
  • RSA应用于签名(签名的目的是证明这件事是它干的,不在乎信息保密性,就是 签名消息其实就是一个校验码,确保密文在传播过程中没有被篡改过):RSA也可以用来为一个消息署名。假如Alice想给Bob传递一个署名的消息的话,那么她可以为她的消息计算一个散列值(Message digest),然后用她的私钥“加密”(如同前面“加密消息”的步骤)这个散列值并将这个“署名”加在消息的后面。这个消息只有用她的公钥才能被解密。Bob获得这个消息后可以用Alice的公钥“解密”(如同前面“解密消息”的步骤)这个散列值,然后将这个数据与他自己为这个消息计算的散列值相比较。假如两者相符的话,那么Bob就可以知道发信人持有Alice的私钥,以及这个消息在传播路径上没有被篡改过。
  • 椭圆曲线加解密算法:
  1. 加密机制:需要找到类似于RSA质因子分解或其他求离散对数这样的难题,此处x为私钥,xG为公钥,其中G为G点,椭圆曲线上已知G和xG求x是非常困难的,此即为椭圆曲线上的离线对数问题。

第一题

在这里插入图片描述

  1. 由附件可知:oknqdbqmoq{kag_tmhq_xqmdzqp_omqemd_qzodkbfuaz},是一个flag{}的形式,猜测为凯撒密码。
  • 粗暴法:不断尝试输入数字
  • 代码法:偏移1-26位尝试

第二题:

在这里插入图片描述

  1. 文件中全为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
  • –/—/.-./…/./-.-./—/-…/./…/…/…/—/…/-./-/./.-././…/-/…/-./–.

第三题

在这里插入图片描述

  1. 打开附件发现文件内容: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

第四题

在这里插入图片描述

  1. 题目附件为:ccehgyaefnpeoobe{lcirg}epriec_ora_g
  2. 根据题目表述为栅栏密码,且猜测分为5组。但是放到栅栏密码解密工具中得到的结果不对
  3. 考虑栅栏密码变形:flag的形式为cyberpeace{},所以分组为
    ccehg
    yaefnpeoo
    be{lcirg}
    epriec_o
    ra_g
    发现不均匀分组,结合flag的格式,猜测到1234543212345…

第五题

在这里插入图片描述

  1. 附件文件:
    –/.-/-.–/…–.-/-…/./…–.-/…/.-/…-/./…–.-/.-/-./—/-/…/./.-./…–.-/-…/./-.-./—/-…/./…/…/…/…/.-/.-/.-/.-/.-/-…/.-/.-/-…/-…/-…/.-/.-/-…/-…/.-/.-/.-/.-/.-/.-/.-/.-/-…/.-/.-/-…/.-/-…/.-/.-/.-/.-/.-/.-/.-/-…/-…/.-/-…/.-/.-/.-/-…/-…/.-/.-/.-/-…/-…/.-/.-/-…/.-/.-/.-/.-/-…/.-/-…/.-/.-/-…/.-/.-/.-/-…/-…/.-/-…/.-/.-/.-/-…/.-/.-/.-/-…/.-/.-/-…/.-/-…/-…/.-/.-/-…/-…/-…/.-/-…/.-/.-/.-/-…/.-/-…/.-/-…/-…/.-/.-/.-/-…/-…/.-/-…/.-/.-/.-/-…/.-/.-/-…/.-/.-/-…/.-/.-/.-/.-/-…/-…/.-/-…/-…/.-/.-/-…/-…/.-/.-/-…/.-/.-/-…/.-/.-/.-/-…/.-/.-/-…/.-/.-/-…/.-/.-/-…/.-/-…/.-/.-/-…/-…/.-/-…/.-/.-/.-/.-/-…/-…/.-/-…/.-/.-/-…/-…/.-
  2. 把/用空格代替是摩斯密码,进行摩斯密码解密得到
    在这里插入图片描述
    hhhh后面是abab,结合题目说是一种食物,推测为培根密码
  3. 进行培根密码解密得到
    在这里插入图片描述
    进行大小写转换得到flag,str=str1.lower。

第六题

在这里插入图片描述

  1. 附件:JiM3NjsmIzEyMjsmIzY5OyYjMTIwOyYjNzk7JiM4MzsmIzU2OyYjMTIwOyYjNzc7JiM2ODsmIzY5OyYjMTE4OyYjNzc7JiM4NDsmIzY1OyYjNTI7JiM3NjsmIzEyMjsmIzEwNzsmIzUzOyYjNzY7JiMxMjI7JiM2OTsmIzEyMDsmIzc3OyYjODM7JiM1NjsmIzEyMDsmIzc3OyYjNjg7JiMxMDc7JiMxMTg7JiM3NzsmIzg0OyYjNjU7JiMxMjA7JiM3NjsmIzEyMjsmIzY5OyYjMTIwOyYjNzg7JiMxMDU7JiM1NjsmIzEyMDsmIzc3OyYjODQ7JiM2OTsmIzExODsmIzc5OyYjODQ7JiM5OTsmIzExODsmIzc3OyYjODQ7JiM2OTsmIzUwOyYjNzY7JiMxMjI7JiM2OTsmIzEyMDsmIzc4OyYjMTA1OyYjNTY7JiM1MzsmIzc4OyYjMTIxOyYjNTY7JiM1MzsmIzc5OyYjODM7JiM1NjsmIzEyMDsmIzc3OyYjNjg7JiM5OTsmIzExODsmIzc5OyYjODQ7JiM5OTsmIzExODsmIzc3OyYjODQ7JiM2OTsmIzExOTsmIzc2OyYjMTIyOyYjNjk7JiMxMTk7JiM3NzsmIzY3OyYjNTY7JiMxMjA7JiM3NzsmIzY4OyYjNjU7JiMxMTg7JiM3NzsmIzg0OyYjNjU7JiMxMjA7JiM3NjsmIzEyMjsmIzY5OyYjMTE5OyYjNzc7JiMxMDU7JiM1NjsmIzEyMDsmIzc3OyYjNjg7JiM2OTsmIzExODsmIzc3OyYjODQ7JiM2OTsmIzExOTsmIzc2OyYjMTIyOyYjMTA3OyYjNTM7JiM3NjsmIzEyMjsmIzY5OyYjMTE5OyYjNzc7JiM4MzsmIzU2OyYjMTIwOyYjNzc7JiM4NDsmIzEwNzsmIzExODsmIzc3OyYjODQ7JiM2OTsmIzEyMDsmIzc2OyYjMTIyOyYjNjk7JiMxMjA7JiM3ODsmIzY3OyYjNTY7JiMxMjA7JiM3NzsmIzY4OyYjMTAzOyYjMTE4OyYjNzc7JiM4NDsmIzY1OyYjMTE5Ow==
  2. 最后面的==证明是base64,解码后得到LzExOS8xMDEvMTA4Lzk5LzExMS8xMDkvMTAxLzExNi8xMTEvOTcvMTE2LzExNi85Ny85OS8xMDcvOTcvMTEwLzEwMC8xMDAvMTAxLzEwMi8xMDEvMTEwLzk5LzEwMS8xMTkvMTExLzExNC8xMDgvMTAw观察能够证明是unicode解码
  3. 解码后得到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
  1. 得到,welcometoattackanddefenceworld

第七题

在这里插入图片描述

  1. 附件为:在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17,求解出d
  2. 使用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)

在这里插入图片描述

  1. 附件下载下来是.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'
  1. 经过分析Python 代码发现,final进行三次解密即可得到flag,解密顺序为321,异或解密还为异或,加法变减法,减法变加法
  2. 代码如下:
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
  1. 得到结果:cyberpeace{interestinghhhhh}

第九题(5.14)

在这里插入图片描述

  1. 轮转机密码,打开附件如下:
    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

  1. 这里有一个容易犯错的地方: 将附件中字符串根据正则表达式提取出来:空格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

第十题(5.15)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值