Single

[ACTF新生赛2020]crypto部分题解2 min read

[ACTF新生赛2020]crypto-classic0

题目下载

提示压缩包密码是小Z童鞋的生日,可以知道是8位数字。爆破得到密码为:19990306,拿到classic0.c:

#include<stdio.h>

char flag[25] = ***

int main()
{
	int i;
	for(i=0;i<25;i++)
	{
		flag[i] -= 3;
		flag[i] ^= 0x7;
		printf("%c",flag[i]);
	}
	return 0; 
}

根据它反写解密脚本即可。

c = "Ygvdmq[lYate[elghqvakl}"
flag = ""
for i in c:
    i = ord(i)^0x7
    i = i+3
    flag = flag+chr(i)
print(flag)

 

[ACTF新生赛2020]crypto-classic1

题目下载

根据hint:

哇,这里有压缩包的密码哦,于是我低下了头,看向了我的双手,试图从中找到某些规律:

xdfv ujko98 edft54 xdfv pok,.; wsdr43

拿手在键盘上画画,明文为圈起来的字符。可以得到压缩密码:circle

解压得到维吉尼亚密文:SRLU{LZPL_S_UASHKXUPD_NXYTFTJT}

已知flag的前四个字母格式为actf,对其进行维吉尼亚加密得到spsp,然后去重,得到密钥为:sp

解密得到: actf{tkxw_a_fidpvffxo_vigenere}

下面这一步还没太明白,参考了别的师傅的WP,可能就是猜的吧

密文:fidpvffxo
密码:dx
明文:classical

密文:tkxw
密码:xd
明文:what

马克一下TaQini师傅的WP

最后可以得到flag为actf{what_a_classical_vigenere}

 

[ACTF新生赛2020]crypto-rsa0

题目下载

改掉伪加密位。拿到rsa0.py

from Cryptodome.Util.number import *
import random

FLAG=#hidden, please solve it
flag=int.from_bytes(FLAG,byteorder = 'big')


p=getPrime(512)
q=getPrime(512)

print(p)
print(q)
N=p*q
e=65537
enc = pow(flag,e,N)
print (enc)

已知pqc,直接拿RSATool解了。

 

[ACTF新生赛2020]crypto-rsa3

题目下载

给了c、e、n。其中n可以用yafu工具分解:

同上提直接工具解就好惹。

 

[ACTF新生赛2020]crypto-aes

题目下载

aes.py:

from Cryptodome.Cipher import AES
import os
import gmpy2
from flag import FLAG
from Cryptodome.Util.number import *

def main():
    key=os.urandom(2)*16
    iv=os.urandom(16)
    print(bytes_to_long(key)^bytes_to_long(iv))
    aes=AES.new(key,AES.MODE_CBC,iv)
    enc_flag = aes.encrypt(FLAG)
    print(enc_flag)
if __name__=="__main__":
    main()

output:

91144196586662942563895769614300232343026691029427747065707381728622849079757
b'\x8c-\xcd\xde\xa7\xe9\x7f.b\x8aKs\xf1\xba\xc75\xc4d\x13\x07\xac\xa4&\xd6\x91\xfe\xf3\x14\x10|\xf8p'

key的长度为2*16,iv的长度为16。

它们俩进行异或时,key后16位是与0进行异或,得到的还是其本身。

马克一下TaQini师傅的脚本:

#!/usr/bin/python3
#__author__:TaQini

from Crypto.Cipher import AES
import os
import gmpy2
from Crypto.Util.number import *

out = long_to_bytes(91144196586662942563895769614300232343026691029427747065707381728622849079757)

key = out[:16]*2

xor_res = out[16:]

iv = bytes_to_long(xor_res)^bytes_to_long(key[16:])
iv = long_to_bytes(iv)

aes=AES.new(key,AES.MODE_CBC,iv)

out = b'\x8c-\xcd\xde\xa7\xe9\x7f.b\x8aKs\xf1\xba\xc75\xc4d\x13\x07\xac\xa4&\xd6\x91\xfe\xf3\x14\x10|\xf8p'

flag = aes.decrypt(out)

print(flag)