CG-CTF Crypto WriteUp

第一次写WriteUp,好兴奋。

大一新生,萌新一枚,求关照...

第一题:

这个题,一看字母数字base64跑起,百度或者python一跑,出结果。

Flag:nctf{this_is_base64_encode}

10分到手

base64,base32,base16的区别如下

base64:包含大写字母(A-Z),小写字母(a-z),数字(0-9)以及+和/

base32:大写字母(A-Z)和数字234567

扫描二维码关注公众号,回复: 4738178 查看本文章

base16:数字(0-9),字母(ABCDEF)

当ASCll用Base加密达不到所对应的位数的时候用=号补齐。

所以看到字母数字都有,就确定是base编码;有小写字母,base64,有只大写字母,base32,大写字母A-F和数字,base16。

嗯,记住了。

第二题:

这题,看键盘。

脑洞很重要!!!!看手指的轨迹!!!

百度找个键盘布局画图画一下,然后:

 

Flag:nctf{areuhack}

20分到手。

脑洞很重要,嗯,记住了。

第三题:

看提示:

1.xor 异或

2.hex2binary 十六进制转二进制

3.len(bin(miwen))==len(bin(mingwen)) 密文的二进制长度和明文的二进制长度相等

第一步,异或。

直接C++或者Python,我选择C++。

看一下文件大小,

32个字节,对应32个字符,char类型,嗯,应该没错。

#include <fstream>
using std::ios;
using std::ifstream;
int main() {
	ifstream fr;
	char mingwen[33] = {}, miwen[33] = {};
	fr.open("明文.txt", ios::binary);
	fr.read(mingwen, 32);
	fr.close(); 
	fr.open("密文.txt", ios::binary);
	fr.read(miwen, 32);
	fr.close();
	printf("明文为:%s\n", mingwen);
	printf("密文为:%s\n", miwen);
	printf("异或开始\n");
	int i;
	char cxor[33] = {};
	for (i = 0; i < 32; i++) 
		cxor[i] = mingwen[i] ^ miwen[i];
	printf("异或完成\n");
	printf("异或之后的结果为:%s", cxor);
	return 0;
}

Flag:nctf{xor_xor_xor_biubiubiu}

30分到手,开心!

后面有一个假的第四题:

Flag:nctf{zhaowomen}

一分到手,不说话了…

第四题:

Wiener是啥?

百度搜半天找不到有关的,那就谷歌吧。

 

好像看到了什么不得了的东西…

下载下来看看…

看下Readme

嗯,就知道是个RSA加密,看了还是不会用…

那就直接看主程序吧…

这主程序看着像python3的,看print函数就能看出来

看见用法了。

已知e,n,出来d,大概…懂了?

看一下下载下来的那个py。

逆着走一遍算法,构造一个密钥,然后加密,大概就这样。

RSA中,e,n组成公钥,e,d组成私钥,然后

这两个长整数中有一个是d,有一个是n,于是…

改一下主程序的那个py

试试…

于是挂了…

那就交换一下n,e再来一次…

得到d

查一下RSA.construct在python中的用法

https://www.dlitz.net/software/pycrypto/api/2.6/

文档如上

挑重点!!!construct私钥要n,e,d

所以,改一下CTF下载下来的那个py,那个脚本看着像py2写的

#coding:utf-8
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
import base64
cipher_text = 'AGgt1h6dudnkeoCr7SFclkYYsYa65KZ8V29bbgbf+BDyjnyx5stCYjcyktat73aHs2EOaMgwGUwj3HwPTvT+T5LHIxM4uTnAgWOui4dnb7vF7QizN0ShY2O1h26CgLnf5I0vQWbY7WCC7kA/orNW7F5yxZiKRAawacS2M5ghP4/Q'
key=RSA.construct((1063045321283844468344531168992778520651192162100948533991539097447031440090068191835838938460807260866872379834796862916118785271062209281267667069640000501698142693389209275376843382863579650119977059768375028586326490055087394631528241983631462471709913758728591459476799115050977493979613545056736162868049L, 837165022918376318972691589160491375229372195625940137121740685432530132860541010174727630660292946071507342455170833392895060048564125597915757582027572284342507277083636059558106672685400173531425920294781499112027917632497954958437660357575400222692979844873372105801998210845285775146263117399191185379347L,57899763801722261062891290503559835904571946557258761154422546104824094670843L))
cipher = Cipher_pkcs1_v1_5.new(key)
cipher_text = base64.b64decode(cipher.decrypt(cipher_text))
print cipher_text

改成这样大概,然后跑一下,崩了

decrypt()需要3个参数只提供了两个,于是百度…

来源:https://www.jb51.net/article/86022.htm

后面那个参数加上

需要from Crypto import Random

加上后再跑一下…

Flag:flag{nell_anima_ritrovo_la_speranza_che_nel_corpo_stanco_ormai}

65分到手,兴奋。

第五题:

给了e,n,m(明文),求密文

于是先拿上面的那个wiener跑一下,然后崩了

然后开始RSA的日常,上factordb

http://factordb.com/

这是个分解n的网站,然后就知道p,q了,然后再按照RSA的算法写个脚本跑一下,大概就这样…

先跑一下n的10进制

复制粘贴到factordb

跑出来了

按照RSA的算法,p= 1578173871764844869716052171,q= 10710927547195113973175047066215146269

然后就要求d了,已知p,q,e,求d,找个现成的脚本跑一下就行,我找的这个:

https://blog.csdn.net/zyxyzz/article/details/78205321

跑一下出来d了

然后再拿上面的那个脚本跑一下就出来明文了

from Crypto import Random
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
text = 0x237200C0F72B97DB55BA37C7AACBB61A26A0CB47D294726259C4DF
key = RSA.construct((16903705997349646195704375376941855414691523387719679999999999999L, 65537L,71961395444719033349123712211093410967715759287662860214461993L))
cipher = Cipher_pkcs1_v1_5.new(key)
text = cipher.encrypt(str(text))
print text

然后崩了…

百度一下,发现了

来自:https://blog.csdn.net/orangleliu/article/details/72964948

那就分开加密试试

先得到这个数字

然后分块,每次1个数字不算很长吧…

于是还是一样的崩,我也不知道为啥,也不想看库的文档了…

算了不用这个加密器了…

那就自力更生,丰衣足食

RSA的加密的算法不难,python大数运算没有位数限制,于是搜一下python的运算符

看到了重点

于是写了个脚本:

N=16903705997349646195704375376941855414691523387719679999999999999
e=65537
d=71961395444719033349123712211093410967715759287662860214461993
m=0x237200C0F72B97DB55BA37C7AACBB61A26A0CB47D294726259C4DF
print ((m**d)%N)

跑了一个小时还没出,笔记本都热了…

好像有哪里不对劲…

算了还是百度吧…

https://www.freebuf.com/articles/others-articles/166049.html

这个上面找了个脚本跑了一下,一秒出结果…

import math
N=16903705997349646195704375376941855414691523387719679999999999999
e=65537
d=71961395444719033349123712211093410967715759287662860214461993
m=0x237200C0F72B97DB55BA37C7AACBB61A26A0CB47D294726259C4DF
print (hex(pow(m,d,N))[2:-1].decode('hex'))

Flag:flag{Acdxvf5vD_15_W7f}

30分到手。

不说话了,还是自己太菜…

学习中...

猜你喜欢

转载自blog.csdn.net/weixin_43773570/article/details/85502341