WhaleCTF 密码学篇~


好久没做题了,这里记录一下做题的过程,积累一下经验~
ps:做题过程中,有些题目参考了某些大佬的wp,望包含~~

Death_Chain

题目如下,经查找发现是夏多密码~:
在这里插入图片描述
直接查表:
在这里插入图片描述
夏多密码规则:
最下面四个图表示方向,1表示向上,2表示顺时针转动90度,其他同理
而且要注意所有的变换都要以原图为准,而不是根据上一次变换而变换
解得flag为:flag{FLAGISHELPMEOUTPLEASE}

先有什么

打开得到题目:
在这里插入图片描述
看着键盘画圈圈,发现每个圈中间都有一个字母
连起来就是flag,得到flag:key{venusectf}

检查符号

题目如下:
在这里插入图片描述
看着题目估摸着就是莫斯电码,把句号替换成空格,把o替换成点,把0替换成杠
得到莫斯密码,使用莫斯解码在线工具进行解码
得到flag:key{welcometovenusctf}

德军密码

题目描述:
二战时盟军截获德军一段密码,密文为:0000011000000000101010110111001011000101100000111001100100111100111001(密钥:helloworld),你可能会解出一个keyxxxxx的答案,请在y后面加{,结尾加},答案的格式是key{xxxxx},所以答案是

根据描述可得知是二战时德军使用过的一种密码,利用了二进制的表示法来替代字母,也被称为费娜姆密码,题目所给出的二进制串的长度为70,刚好是秘钥长度的7倍,猜测是一次一密,解密方法:密文每7个一组,与密钥进行异或处理
编写脚本:

str = "0000011000000000101010110111001011000101100000111001100100111100111001"
key = "helloworld"

flag = ""
for i in range(0,int(len(str)/7)):
	x = str[i*7:(i+1)*7]
	n = int(x,2)
	m = ord(key[i])
	flag += chr(n^m)
print(flag)

得到:
在这里插入图片描述
得到flag:key{[yahkr]}

密钥生成

题目如下:
在这里插入图片描述
求RSA的d,直接使用脚本:

p=473398607161
q=4511491
e=17

def rsa_get_key(e, euler):
    k = 1
    while True:
        if (((euler * k) + 1) % e) == 0:
            return (euler * k + 1)
        k += 1

print(rsa_get_key(e,(p-1)*(q-1)))

得到:
在这里插入图片描述
get flag:key{125631357777427553}

规则很公平

题目如下:
在这里插入图片描述
暗示最公平的游戏,fair,八九不离十是playfair加密~
加密解密规则就不细说了,看这里——palyfair密码
按照规则来进行解密(纯手工~):
在这里插入图片描述
由于编码的规则,不足会补上X,所以X要去掉
得到flag:key{VENUSISAFAIRCOMPANY}

数学小问题

按照题意好像是仿射密码,但是题目中有数字,不知道如何解~ 菜~
目前未解决~

此处应写

打开下载的文件得到一串:

_____*((__//__+___+______-____%____)**((___%(___-_))+________+(___%___+_____+_______%__+______-(______//(_____%___)))))+__*(((________/__)+___%__+_______-(________//____))**(_*(_____+_____)+_______+_________%___))+________*(((_________//__+________%__)+(_______-_))**((___+_______)+_________-(______//__)))+_______*((___+_________-(______//___-_______%__%_))**(_____+_____+_____))+__*(__+_________-(___//___-_________%_____%__))**(_________-____+_______)+(___+_______)**(________%___%__+_____+______)+(_____-__)*((____//____-_____%____%_)+_________)**(_____-(_______//_______+_________%___)+______)+(_____+(_________%_______)*__+_)**_________+_______*(((_________%_______)*__+_______-(________//________))**_______)+(________/__)*(((____-_+_______)*(______+____))**___)+___*((__+_________-_)**_____)+___*(((___+_______-______/___+__-_________%_____%__)*(___-_+________/__+_________%_____))**__)+(_//_)*(((________%___%__+_____+_____)%______)+_______-_)**___+_____*((______/(_____%___))+_______)*((_________%_______)*__+_____+_)+___//___+_________+_________/___

应该是要我们运算出结果吧~
下划线应该是数字,,,,,暴力可能要暴力一年,,,,
看了一下,,,下划线有长有短,有1个的,也有9个的~
直接设置下划线为变量~
直接编写脚本(python3的除会有小数,导致结果不正确,所以使用python2):

_ = 1
__ = 2
___ = 3
____ = 4
_____ = 5
______ = 6
_______ = 7
________ = 8
_________ = 9

a = _____*((__//__+___+______-____%____)**((___%(___-_))+________+(___%___+_____+_______%__+______-(______//(_____%___)))))+__*(((________/__)+___%__+_______-(________//____))**(_*(_____+_____)+_______+_________%___))+________*(((_________//__+________%__)+(_______-_))**((___+_______)+_________-(______//__)))+_______*((___+_________-(______//___-_______%__%_))**(_____+_____+_____))+__*(__+_________-(___//___-_________%_____%__))**(_________-____+_______)+(___+_______)**(________%___%__+_____+______)+(_____-__)*((____//____-_____%____%_)+_________)**(_____-(_______//_______+_________%___)+______)+(_____+(_________%_______)*__+_)**_________+_______*(((_________%_______)*__+_______-(________//________))**_______)+(________/__)*(((____-_+_______)*(______+____))**___)+___*((__+_________-_)**_____)+___*(((___+_______-______/___+__-_________%_____%__)*(___-_+________/__+_________%_____))**__)+(_//_)*(((________%___%__+_____+_____)%______)+_______-_)**___+_____*((______/(_____%___))+_______)*((_________%_______)*__+_____+_)+___//___+_________+_________/___

a = hex(a)
print a

得到一串16进制字符串,转为ASCII码:
在这里插入图片描述
得到:key{I_4m-k3y}

栅栏加密

题目如下:
在这里插入图片描述
根据提示,第一个数和第二个数换了位置,第三个数没动~
三个一组进行替换,然后从上往下,在从左往右链接起来,进行base64解密即可
至于为什么从上往下连接,,,,我只能说自己尝试出来的,,,,,

duJ
mZl
V2Y
uVW
dkx
XXs
N2e
D1V
V59
EXs
Z2d
7ZW
SlN
Vbr
9me
DNS
alF
GX9
F1
dmVudXNDVEZ7SV9DaGFuZ2VkX215X2ZlbmNlX1JlYWxseV9sdWNreSF9

解码可得:venusCTF{I_Changed_my_fence_Really_lucky!}

小明入侵

题目如下:
在这里插入图片描述
猜测是MD5加密!
直接使用脚本来爆破即可:

import hashlib

s = "a74be8e20b"

x = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"

for i in x:
	for j in x:
		for k in x:
			for l in x:
				strs = "key{"+i+j+k+l+"}"
				#rint(i,j,k,l)
				c = hashlib.md5(strs.encode()).hexdigest()
				if s in c:
					print(strs)
					break;

得到:
在这里插入图片描述
所以flag就是:key{BNdE}

RSA破解

下载文件,有两个文件~
看上去这道题就是和前不久buuctf上面的一道逆向题目差不多~
同理利用在线工具分析公钥:
在这里插入图片描述
然后利用yafu分解n:
在这里插入图片描述
利用上一次的解题脚本即可:

import hashlib
import gmpy2
import rsa

q = 286924040788547268861394901519826758027
p = 258631601377848992211685134376492365269
e = 65537

n = 74207624142945242263057035287110983967646020057307828709587969646701361764263

d = gmpy2.invert(e,(q-1)*(p-1))
print(d)

d = 23071769375111040425287244625328797615295772814180109366784249976498215494337

key = rsa.PrivateKey(n,e,d,p,q)
print(key)

with open("flag.enc","rb") as f:
	print(rsa.decrypt(f.read(),key).decode())

得到:
在这里插入图片描述
flag:ISG{256bit_is_weak}

RSA分解

这道题目也不难吧~
直接打开题目:
在这里插入图片描述
给出了n和e,下面应该是密文~
直接分解n,n不大可以直接分解得到p和q,这样也就能够得到d了
由于数字不大,可以直接使用pow进行解密
脚本如下:

import gmpy2

n = 920139713
e = 19

p = 18443
q = 49891

d = int(gmpy2.invert(e,(q-1)*(p-1)))

a = [704796792,752211152,274704164,18414022,368270835,483295235,263072905,459788476,
483295235,459788476,663551792,475206804,459788476,428313374,475206804,459788476,425392137,
704796792,458265677,341524652,483295235,534149509,425392137,428313374,425392137,341524652,
458265677,263072905,483295235,828509797,341524652,425392137,475206804,428313374,483295235,
475206804,459788476,306220148]

for i in a:
	print(chr(pow(i,d,n)),end="")

得到:
在这里插入图片描述
flag:flag{13212je2ue28fy71w8u87y31r78eu1e2}

只有密文

打开文件发现只有密文和n,应该是唯密文攻击~
好像这个是实验吧上面的一道题目~~西普CTF-唯密文攻击
原理还是n是两个质数相乘,所以如果找到他的最大公约数即相当于对n做了分解
找最大公约数时,最大的,其他都为1,所以选取这个为p:
在这里插入图片描述
然后q=n/p不过这里我使用的是python2计算的,因为python3的/会是小数,会对结果造成影响:
在这里插入图片描述
最后进行MD5加密,去前八位
解题过程脚本如下:

import re
import hashlib

#取出所有的数,记得把n的那一行去掉
with open('ciphertext.txt', 'r') as f:
    content = f.readlines()
    e = []
    for line in content:
        res = re.findall('^\d+', line)
        if len(res) > 0:
            e.append(int(res[0]))

n = 135176830582884945708175419898330054260341730432046991449072509302750602166218145078102928897914789996197402658592881347572949256377161172079344803330624352445165759925647345536051853372740246104804540179716136644319380454884518397455488002758429914465640804944658049262500561494830899678619427468784748988379

def gcd(m,n):
	c=1
	while(c!=0):
		c=m%n
		m=n
		n=c
	return m

for i in e:
	print(gcd(i,n))

p = 13038371855775914836995578093728166671103633520203033965827703187246607207039273968425501296569317295959057439253867586769212037981452712871242668046329877

q = int (n / p)

q = 10367615840240242845371941453623373821227053765532752994306127876946421006862147600725324340607889088707606730457021312059130583835286311559997627141422127

m = hashlib.md5(str(q).encode()).hexdigest()

print(m[0:8])

得到:
在这里插入图片描述
提交正确:key{f49d7fe4}

算法问题

打开的到一个py文件,还有一个enc,py源码:

#!/usr/bin/python

flag = 'venuscryptoissimpletodecrypt'
hflag = flag.encode('hex')
iflag = int(hflag[2:], 16)
print iflag

def FAN(n, m):
    i = 0
    z = []
    s = 0
    while n > 0:
    	if n % 2 != 0:
    		z.append(2 - (n % 4))
    	else:
    		z.append(0)
    	n = (n - z[i])/2
    	i = i + 1
    z = z[::-1]
    l = len(z)
    for i in range(0, l):
        s += z[i] * m ** (l - 1 - i)
    return s

i = 0
r = ''
while i < len(str(iflag)):
    d = str(iflag)[i:i+2]
    nf = FAN(int(d), 3)
    r += str(nf)
    i += 2

print r 

直接运行一遍~
发现加密的密文和运行出来的结果一样的,果断提交,正确!
不过我还是选择分析一遍代码!!!(好像也是实验吧上面的一道题目~)
解密过程:利用FAN函数生成0~99的字典,然后查字典,连接起来
本来以为可以做的,结果源码生成FAN的结果有所发现:
在这里插入图片描述
你这叫我怎么判断???如何选择3位或者2位?完蛋,太菜,附上一半的脚本:

def FAN(n, m):
    i = 0
    z = []
    s = 0
    while n > 0:
    	if n % 2 != 0:
    		z.append(2 - (n % 4))
    	else:
    		z.append(0)
    	n = (n - z[i])/2
    	i = i + 1
    z = z[::-1]
    l = len(z)
    for i in range(0, l):
        s += z[i] * m ** (l - 1 - i)
    return s

f = open("enc.txt","r").read().strip()

#生成字典
dir = {}
for i in range(0,100):
    dir[FAN(i,3)] = i;

flag = ''
i = 0
while i < len(f):
    for j in range(4,0,-1):
        tmp = int(f[i:i+j])
        if tmp in dir:
            flag += '%02d'%dir[tmp]
            i += j
            print(tmp)
            break
print(flag)

运行到27的时候会死循环,导致结果出不来~~
不过flag源码中给出了,就是:key{venuscryptoissimpletodecrypt}

大家来解密

暂未写出来~
貌似是什么AES解密吧,不太会~~菜

RSA专家

下载文件,题意已经说了给出了私钥和密文
直接使用openssl进行解密,openssl下载链接
使用命令:

openssl rsautl -decrypt -in hello.en -inkey test.key -out hello.de
-in指定被加密的文件,-inkey指定私钥文件,-out为解密后的文件。

我是在window下运行的:
在这里插入图片描述
得到:
在这里插入图片描述
提交:key{c42bcf773d54cf03}

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值