CTF中的加密问题

   练习题中是一些加解密小练习题,可以参考加解密小结1和加解密小结2中的特征对应进行加解密。可以利用工具。

RSA练习题:python脚本解RSA,脚本代码为(这里给出了p,q实际做题过程中是需要利用工具解p,q):

#!/usr/bin/env python


import gmpy
from Crypto.PublicKey import RSA

n = 41069065654959614597750207738698085798765257876378561837894254544512565197793
c = 27990707239527629138352696377606718299992092729307910015562504696905353450041
e = long(11)

p = 218538667198531171522213512860093810267
q = 187925853952657607512617865502535480179

d = long(gmpy.invert(e,(p-1)*(q-1)))

key = RSA.construct((n,e,d))

print key

print key.decrypt(c)

print hex(key.decrypt(c))

print hex(key.decrypt(c))[2:-1].decode('hex')

上面脚本中给出了p,q。做题过程中可以利用 yafu-1.34大数分解N 工具来求解p,q。解压后的文件为:

CTF中的加密问题_第1张图片

双击运行yafu-Win32.exe,用命令factor(N)来大数分解N

CTF中的加密问题_第2张图片

分解前,将factor.log中的内容清空。分解过程太快了,来不及截图,分解完成后,在factor.log中可以得到分解的p,q:

CTF中的加密问题_第3张图片

然后运行rsa脚本解题得:

CTF中的加密问题_第4张图片

红色部分即为flag,这里我是在kali中运行的脚本。

再来一道加解密的题,题目:

0x253464253534253435253335253433253661253435253737253464253531253666253738253464253434253637253462253466253534253662253462253464253534253435253738253433253661253435253737253466253531253666253738253464253434253435253462253464253534253435253332253433253661253435253738253464253531253666253738253464253534253535253462253464253534253431253330253433253661253435253737253465253531253666253738253464253661253435253462253466253534253633253462253464253534253435253737253433253661253662253334253433253661253662253333253433253661253435253738253465253431253364253364

编写python脚本:decode.py:

str='253464253534253435253335253433253661253435253737253464253531253666253738253464253434253637253462253466253534253662253462253464253534253435253738253433253661253435253737253466253531253666253738253464253434253435253462253464253534253435253332253433253661253435253738253464253531253666253738253464253534253535253462253464253534253431253330253433253661253435253737253465253531253666253738253464253661253435253462253466253534253633253462253464253534253435253737253433253661253662253334253433253661253662253333253433253661253435253738253465253431253364253364'

def HexDe(str):
    decstr = ''
    for i in range(0,len(str),2):
        decstr +=chr(int(str[i:i + 2],16))
    return decstr

print(HexDe(str))

运行得:

CTF中的加密问题_第5张图片

明显看出是url编码,利用工具解码:

CTF中的加密问题_第6张图片

解出的答案为:

MTE5CjEwMQoxMDgKOTkKMTExCjEwOQoxMDEKMTE2CjExMQoxMTUKMTA0CjEwNQoxMjEKOTcKMTEwCjk4Cjk3CjExNA==

base64解码之:

CTF中的加密问题_第7张图片

得到一串数字:119 101 108 99 111 109 101 116 111 115 104 105 121 97 110 98 97 114,然后ASCII转字符得:

CTF中的加密问题_第8张图片

得到:welcometoshiyanbar,即为flag。题目及工具。

再来看一个栅栏解码题目:Alice和Bob用栅栏密码传递了一个消息,解开它。cytgahicorporpysol

利用工具解得:

CTF中的加密问题_第9张图片

题目及工具。最后来上传一个密码学文档。题目资料汇总。

 

再来看一道RSA的题目,RSA2,是i春秋上的一道题目:https://www.ichunqiu.com/battalion,RSA256.下载附件内容为:

CTF中的加密问题_第10张图片

首先看到公钥文件public.key,放到kali,用openssl解出e、n,命令为:openssl rsa -pubin -text -modulus -in warmup -in public.key 

CTF中的加密问题_第11张图片

可以得到e为:65537,n为16进制:D99E952296A6D960DFC2504ABA545B9442D60A7B9E930AFF451C78EC55D555EB

利用python,转换为10进制:98432079271513130981267919056149161631892822707167177858831841699521774310891

CTF中的加密问题_第12张图片

 

转换时要去掉结尾的L,L是表示长整型。然后利用工具yafu-1.34大数分解N,解得p,q:

有了n,e,p,q就可以利用下面脚本解出flag:

# encoding: utf-8
import gmpy2
import rsa
p = 302825536744096741518546212761194311477
q = 325045504186436346209877301320131277983
n = 98432079271513130981267919056149161631892822707167177858831841699521774310891
e = 65537
d = int(gmpy2.invert(e , (p-1) * (q-1)))
privatekey = rsa.PrivateKey(n , e , d , p , q)      #根据已知参数,计算私钥
with open("encrypted.message1" , "rb") as f:
    print(rsa.decrypt(f.read(), privatekey).decode())       #使用私钥对密文进行解密,并打印
with open("encrypted.message2" , "rb") as f:
    print(rsa.decrypt(f.read(), privatekey).decode())       #使用私钥对密文进行解密,并打印
with open("encrypted.message3" , "rb") as f:
    print(rsa.decrypt(f.read(), privatekey).decode())       #使用私钥对密文进行解密,并打印

这里把python代码文件和附件放在同一文件夹内。

CTF中的加密问题_第13张图片

解得flag:

CTF中的加密问题_第14张图片

注意:这里运行rsa2.py的代码需要gmpy2的库和rsa库,并且在文件头加上# encoding: utf-8是为了解决编码问题。

首先安装gmpy2库,:

1. 执行pip install gmpy2, 报错,提示  src/gmpy.h:252:20: fatal error: mpfr.h: 没有那个文件或目录
    

                        ^CTF中的加密问题_第15张图片

 

 

2. Google一下,找到了解决方案:

首先从  ftp://ftp.gnu.org/gnu/mpfr/   下载最新的mpfr的压缩包,这里我下载的是  mpfr-3.1.5.zip

在Kali中执行以下命令:

unzip mpfr-3.1.5.zip   (这里需要根据下载的压缩包所在的实际目录修改一下)

cd mpfr-3.1.5

./configure

make

make check

VERBOSE=1 make check

make install

如果以上过程中不报错的话,mpfr就安装好了。

本以为mpfr安装好就解决问题了,运行  pip install gmpy2   ,刚才的问题没有了,又出现了新的问题,缺少mpc.h头文件,如下图,Excuse me?    

 CTF中的加密问题_第16张图片

 

然后就有了第3步:

 

3.  从  ftp://gcc.gnu.org/pub/gcc/infrastructure/  下载最新的mpc压缩包,这里我下载的是  mpc-1.0.3.tar.gz  ,接着在 Kali 中执行以下命令:

tar -xzvf  mpc-1.0.3.tar.gz     (这里需要根据下载的压缩包所在的实际目录修改一下)

cd mpc-1.0.3

./configure

make

make install

若以上过程没报错,问题就已经解决,然后执行  pip install gmpy2   ,提示  gmpy2  安装成功,

但是在运行脚本时又报错,缺少libmpfr.so.4,解决办法:

locate libmpfr:

CTF中的加密问题_第17张图片

然后:gedit /etc/ld.so.conf,将上面的那些目录贴进去:

CTF中的加密问题_第18张图片

然后执行:ldconfig,ldconfig 命令主要是为了更新 /etc/ld.so.cache 文件,为了加快程序执行时对共享库的定位速度,避免使用收索路径查找共享库的低效率。

然后利用命令:pip install rsa 安装rsa库。然后就可以顺利运行rsa2脚本了。

你可能感兴趣的:(CTF)