Crypto(Buu 题解,第一页部分以及第二页的题目)

目录

RSA

RSAROLL

异性相吸

还原大师

Dangerous RSA

[HDCTF2019]basic rsa

[GXYCTF2019]CheckIn

Cipher

密码学的心声

[GUET-CTF2019]BabyRSA

[BJDCTF2020]这是base??

robomunication

rsa2

RSA5

达芬奇密码

[WUSTCTF2020]佛说:只能四天

[MRCTF2020]古典密码知多少

rot

这是什么

[NCTF2019]childRSA

[HDCTF2019]bbbbbbrsa

[NCTF2019]Keyboard

RSA4

[MRCTF2020]天干地支+甲子

[BJDCTF2020]RSA

[BJDCTF2020]rsa_output

[BJDCTF2020]signin

传感器

[ACTF新生赛2020]crypto-rsa0

[WUSTCTF2020]babyrsa

[MRCTF2020]vigenere

[MRCTF2020]keyboard

一张谍报

[GWCTF 2019]BabyRSA

[ACTF新生赛2020]crypto-rsa3

[NPUCTF2020]这是什么觅🐎


RSA

题目:

解题分析:

首先下载压缩包之后可以看到两个文件:pub.key和flag.enc

打开pub.key可以看到:

-----BEGIN PUBLIC KEY-----
MDwwDQYJKoZIhvcNAQEBBQADKwAwKAIhAMAzLFxkrkcYL2wch21CM2kQVFpY9+7+
/AvKr1rzQczdAgMBAAE=
-----END PUBLIC KEY-----

这个其实就是pem文件,那么什么是pem文件呢?

pem 文件这种格式就是用于 ASCII(Base64) 编码的各种 X.509 v3 证书。

文件开始由一行 -----BEGIN PUBLIC KEY----- 开始,由 -----END PUBLIC KEY----- 结束

pem 类型的数据除去 begin 和 end 之外的内容,要根据 base64 编码解码后,得到的数据需要进行增加或裁剪特殊字符-、 \n 、 \r 、 begin 信息、 end 信息等。

那么解密可以使用网站或者脚本

网站:SSL在线工具-公钥解析 (hiencode.com)

RSA公私钥分解 Exponent、Modulus,Rsa公私钥指数、系数(模数)分解--查错网 (chacuo.net)

这两个网站都可以(第二个解出来的是16进制需要转换一下)

脚本:(记得要把pub.key文件和脚本放在一个目录下)

from Crypto.PublicKey import RSA
with open('pub.key','rb') as f:#with打开文件可以不需要关闭,它会自动关闭
    key = RSA.import_key(f.read())
    print(key.n)
    print(key.e)

于是可以得到:

n=86934482296048119190666062003494800588905656017203025617216654058378322103517 e=65537

现在我们来看flag.enc文件,我们用记事本打开可以看到一堆乱码

.enc文件名扩展名的作用是表明一个文件以某种方式进行了ENC编码或ENC加密(ENC)。在许多情况下,.enc作为第二个扩展名出现(例如,文件名.txt.enc)。这通常意味着文件的内容已经被替换为加密形式的内容。当然,这使得该文件在原来的关联中无法读取。一个ENC文件不能以任何方式被读取,而且是没有意义的,除非它先被解密。

所以应该可以借助工具把flag.enc文件打开(这里我没下载工具)

于是我们这里可以直接使用python把文件读出(同样要把flag.enc文件和脚本放在一个目录下)

f=open('flag.enc','rb')
c=f.read()
f.close()
c=bytes_to_long(c)

那么既可以得到:

c=29666689760194689065394649908301285751747553295673979512822807815563732622178

则按照正常RSA解密即可

解密代码:

from Crypto.Util.number import *
from Crypto.PublicKey import RSA
from gmpy2 import *
import rsa

n=86934482296048119190666062003494800588905656017203025617216654058378322103517
e=65537
p=285960468890451637935629440372639283459
q=304008741604601924494328155975272418463

f=open('flag.enc','rb')
c=f.read()
f.close()
c=bytes_to_long(c)
phi=(p-1)*(q-1)
d=invert(e,phi)
m=pow(c,d,n)
print(long_to_bytes(m))

答案:flag{decrypt_256}


RSAROLL

根据题目可以得到n,e,和c(一段段的)

对于c有两种可能:

1.flag分开单独求的c,还原回去一样一段段拼接出明文

2.c是一段一段连在一起的,只是分开了

经测试可以知道是第一种,那么对应写出解密代码即可(注意拷贝数据的时候要小心,我一不小心数据拷贝的有点问题,导致一直写不出来)

from Crypto.Util.number import *
from gmpy2 import *

n=920139713
e=19
c1=[
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]
p=18443
q=49891
phi=(p-1)*(q-1)
d=invert(e,phi)
for i in c1:
    m=pow(i,d,n)
    print(chr(m),end='')

答案:flag{13212je2ue28fy71w8u87y31r78eu1e2}

异性相吸

题目:

打开压缩包得到两个文件

密文:

key:

解题分析:一开始打开傻乎乎的开始寻找是不是一种特殊的密码,结果没找到,主要是打开密文有一堆方框,后来看了wp,才知道自己打开文件的格式错了,才会出现方框(但是后面改格式也没改出来,啊啊啊啊,这个先放一下吧)

正确格式打开的密文应该是:ἇ̀Ј唒ဃ塔屋䩘卖剄䐃堂ن䝔嘅均ቄ䩝ᬔ

很明显这是一堆乱码,那么根据题目所说的异性相吸,由性别进而联想到在计算机中相对立的是1和0(说实话我也不知道咋想到的,嗯,记住有这么一种方式就行了吧),然后把密文和key转为二进制,再进行异或操作(就是题目所说的异性相吸)

文件转二进制网站:文本到二进制转换器 (rapidtables.org)

注意在写代码的时候要去掉空格,我因为没有去掉空格导致答案计算错误,应该是在运算的时候把空格也给自动转化参与运算了,最后转不回去文本了

二进制转文本网站:字符串二进制转换 (lddgo.net)

replace()可以替换字符串中的内容,这里用来删除空格

string.replace( old, new, count )

  • old :(必选,字符串类型)被替换的字符串
  • new :(必选,字符串类型)替换后的字符串
  • count :(可选,整型)替换的次数

注意:

1.因为Python中的字符串是 不可变 的,所以 replace() 不会改变原字符串的内容,而是返回一个新的字符串。

2. 不指定 次数,默认替换 所有 匹配到的字符串

解密代码:

from Crypto.Util.number import *
from gmpy2 import *
p='00000111 00011111 00000000 00000011 00001000 00000100 00010010 01010101 00000011 00010000 01010100 01011000 01001011 01011100 01011000 01001010 01010110 01010011 01000100 01010010 00000011 01000100 00000010 01011000 01000110 00000110 01010100 01000111 00000101 01010110 01000111 01010111 01000100 00010010 01011101 01001010 00010100 00011011'
key='01100001 01110011 01100001 01100100 01110011 01100001 01110011 01100100 01100001 01110011 01100100 01100001 01110011 01100100 01100001 01110011 01100100 01100001 01110011 01100100 01100001 01110011 01100100 01100001 01110011 01100100 01100001 01110011 01100100 01100001 01110011 01100100 01110001 01110111 01100101 01110011 01110001 01100110'
p=p.replace(" ","")
key=key.replace(" ","")
m=''
for i in range(len(p)):
    if p[i]==key[i] :
        m+="0"
    else:
        m+="1"
print(m)
# 01100110001101100001000001001100111001111011001100101001100001000110001001100010001100011000110000000111001000111000000111000000111001000111001000110010000110010000110111000110110001100010000110111001100110000111001000110101001100010000110101000110100001100001000110111000110100000110011000110101001100101000111000000111001001100101001111101

答案:flag{ea1bc0988992276b7f95b54a7435e89e}

还原大师

题目:

我们得到了一串神秘字符串:TASC?O3RJMV?WDJKX?ZM,问号部分是未知大写字母,为了确定这个神秘字符串,我们通过了其他途径获得了这个字串的32位MD5码。但是我们获得它的32位MD5码也是残缺不全,E903???4DAB????08?????51?80??8A?,请猜出神秘字符串的原本模样,并且提交这个字串的32位MD5码作为答案。 注意:得到的 flag 请包上 flag{} 提交

解题分析:

因为字符串和md5都缺失,然后字符串只缺少3个字母,因此可以直接爆破

然后根据部分MD5进行确定(注意要用小写字母)

解密代码:

from Crypto.Util.number import *
from gmpy2 import *
import hashlib
#md5=E903???4DAB????08?????51?80??8A?
m='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
for i in m:
    for j in m:
        for k in m:
            str='TASC'+i+'O3RJMV'+j+'WDJKX'+k+'ZM'
            md=hashlib.md5(str.encode()).hexdigest()
            if 'e903' in md:
                print(md)
                break

答案:flag{E9032994DABAC08080091151380478A2}

Dangerous RSA

题目:

#n:  0x52d483c27cd806550fbe0e37a61af2e7cf5e0efb723dfc81174c918a27627779b21fa3c851e9e94188eaee3d5cd6f752406a43fbecb53e80836ff1e185d3ccd7782ea846c2e91a7b0808986666e0bdadbfb7bdd65670a589a4d2478e9adcafe97c6ee23614bcb2ecc23580f4d2e3cc1ecfec25c50da4bc754dde6c8bfd8d1fc16956c74d8e9196046a01dc9f3024e11461c294f29d7421140732fedacac97b8fe50999117d27943c953f18c4ff4f8c258d839764078d4b6ef6e8591e0ff5563b31a39e6374d0d41c8c46921c25e5904a817ef8e39e5c9b71225a83269693e0b7e3218fc5e5a1e8412ba16e588b3d6ac536dce39fcdfce81eec79979ea6872793L
#e:  0x3
#c:0x10652cdfaa6b63f6d7bd1109da08181e500e5643f5b240a9024bfa84d5f2cac9310562978347bb232d63e7289283871efab83d84ff5a7b64a94a79d34cfbd4ef121723ba1f663e514f83f6f01492b4e13e1bb4296d96ea5a353d3bf2edd2f449c03c4a3e995237985a596908adc741f32365
so,how to get the message?

解题分析:

首先把n,e,c转为10进制,然后观察数据,可以发现e很小,且n很大,很明显n是无法分解

根据题目危险的RSA,联系到加密过程:c=m^e %n

大胆猜测n可能很大,比m^e还要大,那么c=m ^ e,则m可以直接求解出

n= 0x52d483c27cd806550fbe0e37a61af2e7cf5e0efb723dfc81174c918a27627779b21fa3c851e9e94188eaee3d5cd6f752406a43fbecb53e80836ff1e185d3ccd7782ea846c2e91a7b0808986666e0bdadbfb7bdd65670a589a4d2478e9adcafe97c6ee23614bcb2ecc23580f4d2e3cc1ecfec25c50da4bc754dde6c8bfd8d1fc16956c74d8e9196046a01dc9f3024e11461c294f29d7421140732fedacac97b8fe50999117d27943c953f18c4ff4f8c258d839764078d4b6ef6e8591e0ff5563b31a39e6374d0d41c8c46921c25e5904a817ef8e39e5c9b71225a83269693e0b7e3218fc5e5a1e8412ba16e588b3d6ac536dce39fcdfce81eec79979ea6872793L

这里n后面的L表示的是n是一个长整型的数据,可以删去

解密代码:

from Crypto.Util.number import *
from gmpy2 import *
# 0x后面的L表示长整型
# n=0x52d483c27cd806550fbe0e37a61af2e7cf5e0efb723dfc81174c918a27627779b21fa3c851e9e94188eaee3d5cd6f752406a43fbecb53e80836ff1e185d3ccd7782ea846c2e91a7b0808986666e0bdadbfb7bdd65670a589a4d2478e9adcafe97c6ee23614bcb2ecc23580f4d2e3cc1ecfec25c50da4bc754dde6c8bfd8d1fc16956c74d8e9196046a01dc9f3024e11461c294f29d7421140732fedacac97b8fe50999117d27943c953f18c4ff4f8c258d839764078d4b6ef6e8591e0ff5563b31a39e6374d0d41c8c46921c25e5904a817ef8e39e5c9b71225a83269693e0b7e3218fc5e5a1e8412ba16e588b3d6ac536dce39fcdfce81eec79979ea6872793L
# e=0x3
# c=0x10652cdfaa6b63f6d7bd1109da08181e500e5643f5b240a9024bfa84d5f2cac9310562978347bb232d63e7289283871efab83d84ff5a7b64a94a79d34cfbd4ef121723ba1f663e514f83f6f01492b4e13e1bb4296d96ea5a353d3bf2edd2f449c03c4a3e995237985a596908adc741f32365
n=10456335904838169914349646852830082932152130624533179855437700729986430916359910968035371355128152016750075271161129744979254605922991030753616570849211931989112941277121682363790710646503345520505931418350219098036569932546893477983585713668853372819392130314661542626399462820378837771792293945490048339575869129479058678981790418112887403292721775644533540769467889512773382494878291574262142755186374570245813695390664702262226281601456889176191920270658811753696081082528539263191477192236336112147705564796435800152614366113854349615104191052807647128834113146535639155857819697492608839941056356828288393881491
c=2217344750798296091193230394221582894657909643174934416842588335871298152598368701484028832407289746218387783855373449002121088413603751014125921242419602155087438902181522441026460003722677539409576093794862185483713606547386172606576925933695952279401957552813065318376293
e=3
m=iroot(c,e)[0]
print(long_to_bytes(m))

答案:flag{25df8caf006ee5db94d48144c33b2c3b}

[HDCTF2019]basic rsa

题目:

import gmpy2
from Crypto.Util.number import *
from binascii import a2b_hex,b2a_hex

flag = "*****************"

p = 262248800182277040650192055439906580479
q = 262854994239322828547925595487519915551

e = 65533
n = p*q


c = pow(int(b2a_hex(flag),16),e,n)

print(c)

# 27565231154623519221597938803435789010285480123476977081867877272451638645710

解题分析:

根据题目可以发现其实是很简单的RSA加密,对于写出解密代码即可

binascii模块中的a2b_hex,b2a_hex

1. binascii.a2b_hex(hexstr) 函数

将十六进制字符串hexstr转为二进制数据


fth = b'46494E530000000C00000000000000000000006B'  # 16进制bytes类型
fth = binascii.a2b_hex(fth)
print(fth)

输出:
b'FINS\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00k'

2. binascii.b2a_hex(data) 函数

将二进制数据data转为十六进制


fth = b'FINS\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00k'  # 字节流
fth = binascii.b2a_hex(fth)
print(fth, type(fth))
 
 
输出:
b'46494e530000000c00000000000000000000006b' <class 'bytes'>

解密代码:

from Crypto.Util.number import *
from gmpy2 import *
p = 262248800182277040650192055439906580479
q = 262854994239322828547925595487519915551

e = 65533
c=27565231154623519221597938803435789010285480123476977081867877272451638645710

n=p*q
phi=(p-1)*(q-1)
d=invert(e,phi)
m=pow(c,d,n)
print(long_to_bytes(m))

答案:flag{B4by_Rs4}

[GXYCTF2019]CheckIn

题目:dikqTCpfRjA8fUBIMD5GNDkwMjNARkUwI0BFTg==

解题分析:

看到密文后面的=,第一反应是base密码,然后用base64进行解密得到:v)*L*_F0<}@H0>F49023@FE0#@EN

到这里就不知道怎么处理了,试过base85和base91都不行,在自己了解的所有密码里好像都没有这种类型的,看了一下wp,才知道是rot密码,没见过(但其实就是一种移位密码,和凯撒密码很类似)

rot密码分为以下几种:

rot5:将字符串中的数字进行加密,步数为5,同时在0-9十个数字进行循环,比如1在rot5加密后为6,而6在rot5加密后为1

rot13:将字符串中的字母进行加密,步数为13,加密方式上最接近凯撒密码,分别在A-Z或a-z之间循环,如A在rot13加密后为N,Z在rot13加密后为M

rot18:字面意思(5+13=18) 即将上述两种加密方式结合,分别对数字和字母进行相应的操作

rot47:由于无论是rot5、rot13或rot18都只能对数字和字母进行相应的加密,而对“!@#¥%&”之类的符号却缺少加密,因此在此基础上引入ASCII码

rot47与上面几种也是类似的,只是将步数改为47而已(同样存在循环)

对数字、字母、常用符号进行编码,按照它们的ASCII值进行位置替换,用当前字符ASCII值往前数的第47位对应字符替换当前字符,例如当前为小写字母z,编码后变成大写字母K,当前为数字0,编码后变成符号_。

那么很明显是rot47加密了,直接搜在线网站即可得到答案

解密网站:ROT47编码/解码 - ROT47加密/解密—LZL在线工具 (lzltool.cn)

答案:flag{Y0u_kNow_much_about_Rot}(注意最后要用flag{}包裹)

Cipher

题目:

还能提示什么呢?公平的玩吧(密钥自己找) Dncnoqqfliqrpgeklwmppu 注意:得到的 flag 请包上 flag{} 提交, flag{小写字母}

解题分析:

拿到题目非常的懵,不知道从哪里入手,看了wp,才知道这是playfair密码(好的,也是没见过的密码),密钥正好是playfair,直接查找在线网站即可解密

在线网站:Playfair加密解密_普莱费尔加密解密-ME2在线工具 (metools.info)

Playfair加密流程:PlayFair密码原理、代码-CSDN博客 (写的很详细)

答案:flag{itisnotaproblemhavefun}

密码学的心声

题目:

解题分析:

根据题目给出的提示知道是八进制,所以要先把八进制转为十进制,再转为ascll码(即题目中所说的埃塞克码),根据ascll码中可见字符范围为32~126,所以对于上面的数据进行三个一组,再转为十进制

八进制:

111 114 157 166 145 123 145 143 165 162 151 164 171 126 145 162 171 115 165 143 150

十进制:

73   76  111  118 101 83   101 99   117  114 105 116 121  86  101  114 121 77   117 99  104

list1=[73,76,111,118,101,83,101,99,117,114,105,116,121,86,101,114,121,77,117,99,104]
for i in range(len(list1)):
    print(chr(list1[i]),end="")

最后转为ascll码得到答案

答案:flag{ILoveSecurityVeryMuch}

[GUET-CTF2019]BabyRSA

题目:

p+q : 0x1232fecb92adead91613e7d9ae5e36fe6bb765317d6ed38ad890b4073539a6231a6620584cea5730b5af83a3e80cf30141282c97be4400e33307573af6b25e2ea
(p+1)(q+1) : 0x5248becef1d925d45705a7302700d6a0ffe5877fddf9451a9c1181c4d82365806085fd86fbaab08b6fc66a967b2566d743c626547203b34ea3fdb1bc06dd3bb765fd8b919e3bd2cb15bc175c9498f9d9a0e216c2dde64d81255fa4c05a1ee619fc1fc505285a239e7bc655ec6605d9693078b800ee80931a7a0c84f33c851740
e : 0xe6b1bee47bd63f615c7d0a43c529d219
d : 0x2dde7fbaed477f6d62838d55b0d0964868cf6efb2c282a5f13e6008ce7317a24cb57aec49ef0d738919f47cdcd9677cd52ac2293ec5938aa198f962678b5cd0da344453f521a69b2ac03647cdd8339f4e38cec452d54e60698833d67f9315c02ddaa4c79ebaa902c605d7bda32ce970541b2d9a17d62b52df813b2fb0c5ab1a5
enc_flag : 0x50ae00623211ba6089ddfae21e204ab616f6c9d294e913550af3d66e85d0c0693ed53ed55c46d8cca1d7c2ad44839030df26b70f22a8567171a759b76fe5f07b3c5a6ec89117ed0a36c0950956b9cde880c575737f779143f921d745ac3bb0e379c05d9a3cc6bf0bea8aa91e4d5e752c7eb46b2e023edbc07d24a7c460a34a9a

 

解题分析:

题目给出了p+q和(p+1)*(q+1)=p*q+(p+q)+1=n+(p+q)+1

则可以求出n=(p+1)*(q+1)-(p+q)-1

题目给出了d和密文c,直接按照公式求解即可

解密代码:

from Crypto.Util.number import *
from gmpy2 import *
from Crypto.Util.number import isPrime, sieve_base as primes
pq=0x1232fecb92adead91613e7d9ae5e36fe6bb765317d6ed38ad890b4073539a6231a6620584cea5730b5af83a3e80cf30141282c97be4400e33307573af6b25e2ea
pqc=0x5248becef1d925d45705a7302700d6a0ffe5877fddf9451a9c1181c4d82365806085fd86fbaab08b6fc66a967b2566d743c626547203b34ea3fdb1bc06dd3bb765fd8b919e3bd2cb15bc175c9498f9d9a0e216c2dde64d81255fa4c05a1ee619fc1fc505285a239e7bc655ec6605d9693078b800ee80931a7a0c84f33c851740
e=0xe6b1bee47bd63f615c7d0a43c529d219
d=0x2dde7fbaed477f6d62838d55b0d0964868cf6efb2c282a5f13e6008ce7317a24cb57aec49ef0d738919f47cdcd9677cd52ac2293ec5938aa198f962678b5cd0da344453f521a69b2ac03647cdd8339f4e38cec452d54e60698833d67f9315c02ddaa4c79ebaa902c605d7bda32ce970541b2d9a17d62b52df813b2fb0c5ab1a5
enc_flag=0x50ae00623211ba6089ddfae21e204ab616f6c9d294e913550af3d66e85d0c0693ed53ed55c46d8cca1d7c2ad44839030df26b70f22a8567171a759b76fe5f07b3c5a6ec89117ed0a36c0950956b9cde880c575737f779143f921d745ac3bb0e379c05d9a3cc6bf0bea8aa91e4d5e752c7eb46b2e023edbc07d24a7c460a34a9a
n=pqc-pq-1
m=pow(enc_flag,d,n)
print(long_to_bytes(m))

答案:flag{cc7490e-78ab-11e9-b422-8ba97e5da1fd}

[BJDCTF2020]这是base??

题目:

dict:{0: 'J', 1: 'K', 2: 'L', 3: 'M', 4: 'N', 5: 'O', 6: 'x', 7: 'y', 8: 'U', 9: 'V', 10: 'z', 11: 'A', 12: 'B', 13: 'C', 14: 'D', 15: 'E', 16: 'F', 17: 'G', 18: 'H', 19: '7', 20: '8', 21: '9', 22: 'P', 23: 'Q', 24: 'I', 25: 'a', 26: 'b', 27: 'c', 28: 'd', 29: 'e', 30: 'f', 31: 'g', 32: 'h', 33: 'i', 34: 'j', 35: 'k', 36: 'l', 37: 'm', 38: 'W', 39: 'X', 40: 'Y', 41: 'Z', 42: '0', 43: '1', 44: '2', 45: '3', 46: '4', 47: '5', 48: '6', 49: 'R', 50: 'S', 51: 'T', 52: 'n', 53: 'o', 54: 'p', 55: 'q', 56: 'r', 57: 's', 58: 't', 59: 'u', 60: 'v', 61: 'w', 62: '+', 63: '/', 64: '='}

chipertext:
FlZNfnF6Qol6e9w17WwQQoGYBQCgIkGTa9w3IQKw

解题分析:

根据题目知道是base密码,然后由给出的表可知是base64编码,但是不是base64的标准表,所以把密文转为标准表下的密文,然后base64解密即可(一开始真的没看出来,主要是base64密码没有那么熟悉,可是已经见过很多次了)

把密文在dict中的对应键求出,然后在标准表中寻找键对应的字符即可得到标准base64下的密文(因为即使base64表变了,但是下标不会改变)

python中在字典中根据值寻找键:

dict={0:'你',1:'好'}
key = list(dict.keys())
value = list(dict.values())
for i in str:
    position = value.index(i)
    print(key[position],end=",")

解密代码:

from Crypto.Util.number import *
from gmpy2 import *
dict={0: 'J', 1: 'K', 2: 'L', 3: 'M', 4: 'N', 5: 'O', 6: 'x', 7: 'y', 8: 'U', 9: 'V', 10: 'z', 11: 'A', 12: 'B', 13: 'C', 14: 'D', 15: 'E', 16: 'F', 17: 'G', 18: 'H', 19: '7', 20: '8', 21: '9', 22: 'P', 23: 'Q', 24: 'I', 25: 'a', 26: 'b', 27: 'c', 28: 'd', 29: 'e', 30: 'f', 31: 'g', 32: 'h', 33: 'i', 34: 'j', 35: 'k', 36: 'l', 37: 'm', 38: 'W', 39: 'X', 40: 'Y', 41: 'Z', 42: '0', 43: '1', 44: '2', 45: '3', 46: '4', 47: '5', 48: '6', 49: 'R', 50: 'S', 51: 'T', 52: 'n', 53: 'o', 54: 'p', 55: 'q', 56: 'r', 57: 's', 58: 't', 59: 'u', 60: 'v', 61: 'w', 62: '+', 63: '/', 64: '='}
str='FlZNfnF6Qol6e9w17WwQQoGYBQCgIkGTa9w3IQKw'
key = list(dict.keys())
value = list(dict.values())
for i in str:
    position = value.index(i)
    print(key[position],end=",")
base='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='    #base64标准表 A-Z,a-z,0-9,+/=
list1=[16,36,41,4,30,52,16,48,23,53,36,48,29,21,61,43,19,38,61,23,23,53,17,40,12,23,13,31,24,35,17,51,25,21,61,45,24,23,1,61]
m1=''
for i in range(len(list1)):
    m1+=base[list1[i]]#把密文转成在标准base64表中的密文
print('\n'+m1)
# 密文QkpEe0QwX1kwdV9rTm9XX1RoMXNfYjRzZV9tYXB9

然后直接用base64解密即可

答案:flag{D0_Y0u_kNoW_Th1s_b4se_map}

base64加密原理:彻底搞懂base64加解密原理和隐写技术_base64隐写解密-CSDN博客

robomunication

解题分析:打开文件是一个音频,很明显是莫斯密码,根据音频写出莫斯密码(最好多听几遍,一不小心就听错了)

...././.-../.-../---/.--/..../.-/-/../.../-/...././-.-/./-.--/..-/../.../-.../---/---/.--./-.../././.--.(注意要划分节奏)

在找对应的摩斯解码器即可,解得

HELLOWHATISTHEKEYUISBOOPBEEP

摩斯解密网站:摩斯密码在线加密解密 - Bugku

答案:flag{BOOPBEEP}

rsa2

题目:

N = 101991809777553253470276751399264740131157682329252673501792154507006158434432009141995367241962525705950046253400188884658262496534706438791515071885860897552736656899566915731297225817250639873643376310103992170646906557242832893914902053581087502512787303322747780420210884852166586717636559058152544979471
e = 46731919563265721307105180410302518676676135509737992912625092976849075262192092549323082367518264378630543338219025744820916471913696072050291990620486581719410354385121760761374229374847695148230596005409978383369740305816082770283909611956355972181848077519920922059268376958811713365106925235218265173085

import hashlib
flag = "flag{" + hashlib.md5(hex(d)).hexdigest() + "}"

解题分析:

首先根据题目求出d,先分解N得到p和q即可求得

然后再MD5加密即可

这里需要注意一点:

python3中使用flag = "flag{" + hashlib.md5(hex(d)).hexdigest() + "}"会报错(我也不知道为啥)

查了一下解决方法,有两种:

1.flag = "flag{" + hashlib.md5(hex(d).encode()).hexdigest() + "}"

需要加个.encode('utf-8')在调用方法时调用将字符串转换为字节

2.使用字节对象(b''前缀),hex(d)的前面加上b‘’,转为字节

但是用了上面的方法之后得到flag{8159e6c4abdd3b94ce461ed9a1a24017},答案错误

这里真的不知道怎么办了,看来一下wp,才知道原来是python3里hex(d)的结果和python2里hex(d)的结果还相差了一个末尾的L,所以再计算md5的结果也就不一样,需要手动加上L再放到md5函数里面。

即在写代码的时候把hex(d)先算出来,然后转为字节形式,还要再hex(d)后面加上L

flag = "flag{" + hashlib.md5(b'0x13b8f87d588e2aa4a27296cf2898f56ab4c8deb5a1222ec080e23afecaf7f975L').hexdigest() + "}"

解密代码:

from gmpy2 import *
from Crypto.Util.number import *
import hashlib
N = 101991809777553253470276751399264740131157682329252673501792154507006158434432009141995367241962525705950046253400188884658262496534706438791515071885860897552736656899566915731297225817250639873643376310103992170646906557242832893914902053581087502512787303322747780420210884852166586717636559058152544979471
e = 46731919563265721307105180410302518676676135509737992912625092976849075262192092549323082367518264378630543338219025744820916471913696072050291990620486581719410354385121760761374229374847695148230596005409978383369740305816082770283909611956355972181848077519920922059268376958811713365106925235218265173085

p=9046853915223503351787031888977627106934564043204783593118678181991596316582877057556463152579621699010610569526573031954779520781448550677767565207407183
q=11273732364123571293429600400343309403733952146912318879993851141423284675797325272321856863528776914709992821287788339848962916204774010644058033316303937
phi=(p-1)*(q-1)
d=invert(e,phi)
print(hex(d))
flag = "flag{" + hashlib.md5(b'0x13b8f87d588e2aa4a27296cf2898f56ab4c8deb5a1222ec080e23afecaf7f975L').hexdigest() + "}"
print(flag)

答案:flag{47bf28da384590448e0b0d23909a25a4}

RSA5

解题分析:

题目给了许多n和c,很明显是n不互素,直接遍历找出符合条件的p和q,然后rsa解密即可

解密代码:

from Crypto.Util.number import *
from gmpy2 import *
n1 = 20474918894051778533305262345601880928088284471121823754049725354072477155873778848055073843345820697886641086842612486541250183965966001591342031562953561793332341641334302847996108417466360688139866505179689516589305636902137210185624650854906780037204412206309949199080005576922775773722438863762117750429327585792093447423980002401200613302943834212820909269713876683465817369158585822294675056978970612202885426436071950214538262921077409076160417436699836138801162621314845608796870206834704116707763169847387223307828908570944984416973019427529790029089766264949078038669523465243837675263858062854739083634207
c1 = 974463908243330865728978769213595400782053398596897741316275722596415018912929508637393850919224969271766388710025195039896961956062895570062146947736340342927974992616678893372744261954172873490878805483241196345881721164078651156067119957816422768524442025688079462656755605982104174001635345874022133045402344010045961111720151990412034477755851802769069309069018738541854130183692204758761427121279982002993939745343695671900015296790637464880337375511536424796890996526681200633086841036320395847725935744757993013352804650575068136129295591306569213300156333650910795946800820067494143364885842896291126137320

n2 = 20918819960648891349438263046954902210959146407860980742165930253781318759285692492511475263234242002509419079545644051755251311392635763412553499744506421566074721268822337321637265942226790343839856182100575539845358877493718334237585821263388181126545189723429262149630651289446553402190531135520836104217160268349688525168375213462570213612845898989694324269410202496871688649978370284661017399056903931840656757330859626183773396574056413017367606446540199973155630466239453637232936904063706551160650295031273385619470740593510267285957905801566362502262757750629162937373721291789527659531499435235261620309759
c2 = 15819636201971185538694880505120469332582151856714070824521803121848292387556864177196229718923770810072104155432038682511434979353089791861087415144087855679134383396897817458726543883093567600325204596156649305930352575274039425470836355002691145864435755333821133969266951545158052745938252574301327696822347115053614052423028835532509220641378760800693351542633860702225772638930501021571415907348128269681224178300248272689705308911282208685459668200507057183420662959113956077584781737983254788703048275698921427029884282557468334399677849962342196140864403989162117738206246183665814938783122909930082802031855

n3 = 25033254625906757272369609119214202033162128625171246436639570615263949157363273213121556825878737923265290579551873824374870957467163989542063489416636713654642486717219231225074115269684119428086352535471683359486248203644461465935500517901513233739152882943010177276545128308412934555830087776128355125932914846459470221102007666912211992310538890654396487111705385730502843589727289829692152177134753098649781412247065660637826282055169991824099110916576856188876975621376606634258927784025787142263367152947108720757222446686415627479703666031871635656314282727051189190889008763055811680040315277078928068816491
c3 = 4185308529416874005831230781014092407198451385955677399668501833902623478395669279404883990725184332709152443372583701076198786635291739356770857286702107156730020004358955622511061410661058982622055199736820808203841446796305284394651714430918690389486920560834672316158146453183789412140939029029324756035358081754426645160033262924330248675216108270980157049705488620263485129480952814764002865280019185127662449318324279383277766416258142275143923532168798413011028271543085249029048997452212503111742302302065401051458066585395360468447460658672952851643547193822775218387853623453638025492389122204507555908862

n4 = 21206968097314131007183427944486801953583151151443627943113736996776787181111063957960698092696800555044199156765677935373149598221184792286812213294617749834607696302116136745662816658117055427803315230042700695125718401646810484873064775005221089174056824724922160855810527236751389605017579545235876864998419873065217294820244730785120525126565815560229001887622837549118168081685183371092395128598125004730268910276024806808565802081366898904032509920453785997056150497645234925528883879419642189109649009132381586673390027614766605038951015853086721168018787523459264932165046816881682774229243688581614306480751
c4 = 4521038011044758441891128468467233088493885750850588985708519911154778090597136126150289041893454126674468141393472662337350361712212694867311622970440707727941113263832357173141775855227973742571088974593476302084111770625764222838366277559560887042948859892138551472680654517814916609279748365580610712259856677740518477086531592233107175470068291903607505799432931989663707477017904611426213770238397005743730386080031955694158466558475599751940245039167629126576784024482348452868313417471542956778285567779435940267140679906686531862467627238401003459101637191297209422470388121802536569761414457618258343550613

n5 = 22822039733049388110936778173014765663663303811791283234361230649775805923902173438553927805407463106104699773994158375704033093471761387799852168337898526980521753614307899669015931387819927421875316304591521901592823814417756447695701045846773508629371397013053684553042185725059996791532391626429712416994990889693732805181947970071429309599614973772736556299404246424791660679253884940021728846906344198854779191951739719342908761330661910477119933428550774242910420952496929605686154799487839923424336353747442153571678064520763149793294360787821751703543288696726923909670396821551053048035619499706391118145067
c5 = 15406498580761780108625891878008526815145372096234083936681442225155097299264808624358826686906535594853622687379268969468433072388149786607395396424104318820879443743112358706546753935215756078345959375299650718555759698887852318017597503074317356745122514481807843745626429797861463012940172797612589031686718185390345389295851075279278516147076602270178540690147808314172798987497259330037810328523464851895621851859027823681655934104713689539848047163088666896473665500158179046196538210778897730209572708430067658411755959866033531700460551556380993982706171848970460224304996455600503982223448904878212849412357

n6 = 21574139855341432908474064784318462018475296809327285532337706940126942575349507668289214078026102682252713757703081553093108823214063791518482289846780197329821139507974763780260290309600884920811959842925540583967085670848765317877441480914852329276375776405689784571404635852204097622600656222714808541872252335877037561388406257181715278766652824786376262249274960467193961956690974853679795249158751078422296580367506219719738762159965958877806187461070689071290948181949561254144310776943334859775121650186245846031720507944987838489723127897223416802436021278671237227993686791944711422345000479751187704426369
c6 = 20366856150710305124583065375297661819795242238376485264951185336996083744604593418983336285185491197426018595031444652123288461491879021096028203694136683203441692987069563513026001861435722117985559909692670907347563594578265880806540396777223906955491026286843168637367593400342814725694366078337030937104035993569672959361347287894143027186846856772983058328919716702982222142848848117768499996617588305301483085428547267337070998767412540225911508196842253134355901263861121500650240296746702967594224401650220168780537141654489215019142122284308116284129004257364769474080721001708734051264841350424152506027932

n7 = 25360227412666612490102161131174584819240931803196448481224305250583841439581008528535930814167338381983764991296575637231916547647970573758269411168219302370541684789125112505021148506809643081950237623703181025696585998044695691322012183660424636496897073045557400768745943787342548267386564625462143150176113656264450210023925571945961405709276631990731602198104287528528055650050486159837612279600415259486306154947514005408907590083747758953115486124865486720633820559135063440942528031402951958557630833503775112010715604278114325528993771081233535247118481765852273252404963430792898948219539473312462979849137
c7 = 19892772524651452341027595619482734356243435671592398172680379981502759695784087900669089919987705675899945658648623800090272599154590123082189645021800958076861518397325439521139995652026377132368232502108620033400051346127757698623886142621793423225749240286511666556091787851683978017506983310073524398287279737680091787333547538239920607761080988243639547570818363788673249582783015475682109984715293163137324439862838574460108793714172603672477766831356411304446881998674779501188163600664488032943639694828698984739492200699684462748922883550002652913518229322945040819064133350314536378694523704793396169065179

n8 = 22726855244632356029159691753451822163331519237547639938779517751496498713174588935566576167329576494790219360727877166074136496129927296296996970048082870488804456564986667129388136556137013346228118981936899510687589585286517151323048293150257036847475424044378109168179412287889340596394755257704938006162677656581509375471102546261355748251869048003600520034656264521931808651038524134185732929570384705918563982065684145766427962502261522481994191989820110575981906998431553107525542001187655703534683231777988419268338249547641335718393312295800044734534761692799403469497954062897856299031257454735945867491191
c8 = 6040119795175856407541082360023532204614723858688636724822712717572759793960246341800308149739809871234313049629732934797569781053000686185666374833978403290525072598774001731350244744590772795701065129561898116576499984185920661271123665356132719193665474235596884239108030605882777868856122378222681140570519180321286976947154042272622411303981011302586225630859892731724640574658125478287115198406253847367979883768000812605395482952698689604477719478947595442185921480652637868335673233200662100621025061500895729605305665864693122952557361871523165300206070325660353095592778037767395360329231331322823610060006

n9 = 23297333791443053297363000786835336095252290818461950054542658327484507406594632785712767459958917943095522594228205423428207345128899745800927319147257669773812669542782839237744305180098276578841929496345963997512244219376701787616046235397139381894837435562662591060768476997333538748065294033141610502252325292801816812268934171361934399951548627267791401089703937389012586581080223313060159456238857080740699528666411303029934807011214953984169785844714159627792016926490955282697877141614638806397689306795328344778478692084754216753425842557818899467945102646776342655167655384224860504086083147841252232760941
c9 = 5418120301208378713115889465579964257871814114515046096090960159737859076829258516920361577853903925954198406843757303687557848302302200229295916902430205737843601806700738234756698575708612424928480440868739120075888681672062206529156566421276611107802917418993625029690627196813830326369874249777619239603300605876865967515719079797115910578653562787899019310139945904958024882417833736304894765433489476234575356755275147256577387022873348906900149634940747104513850154118106991137072643308620284663108283052245750945228995387803432128842152251549292698947407663643895853432650029352092018372834457054271102816934

n10 = 28873667904715682722987234293493200306976947898711255064125115933666968678742598858722431426218914462903521596341771131695619382266194233561677824357379805303885993804266436810606263022097900266975250431575654686915049693091467864820512767070713267708993899899011156106766178906700336111712803362113039613548672937053397875663144794018087017731949087794894903737682383916173267421403408140967713071026001874733487295007501068871044649170615709891451856792232315526696220161842742664778581287321318748202431466508948902745314372299799561625186955234673012098210919745879882268512656931714326782335211089576897310591491
c10 = 9919880463786836684987957979091527477471444996392375244075527841865509160181666543016317634963512437510324198702416322841377489417029572388474450075801462996825244657530286107428186354172836716502817609070590929769261932324275353289939302536440310628698349244872064005700644520223727670950787924296004296883032978941200883362653993351638545860207179022472492671256630427228461852668118035317021428675954874947015197745916918197725121122236369382741533983023462255913924692806249387449016629865823316402366017657844166919846683497851842388058283856219900535567427103603869955066193425501385255322097901531402103883869

n11 = 22324685947539653722499932469409607533065419157347813961958075689047690465266404384199483683908594787312445528159635527833904475801890381455653807265501217328757871352731293000303438205315816792663917579066674842307743845261771032363928568844669895768092515658328756229245837025261744260614860746997931503548788509983868038349720225305730985576293675269073709022350700836510054067641753713212999954307022524495885583361707378513742162566339010134354907863733205921845038918224463903789841881400814074587261720283879760122070901466517118265422863420376921536734845502100251460872499122236686832189549698020737176683019
c11 = 1491527050203294989882829248560395184804977277747126143103957219164624187528441047837351263580440686474767380464005540264627910126483129930668344095814547592115061057843470131498075060420395111008619027199037019925701236660166563068245683975787762804359520164701691690916482591026138582705558246869496162759780878437137960823000043988227303003876410503121370163303711603359430764539337597866862508451528158285103251810058741879687875218384160282506172706613359477657215420734816049393339593755489218588796607060261897905233453268671411610631047340459487937479511933450369462213795738933019001471803157607791738538467

n12 = 27646746423759020111007828653264027999257847645666129907789026054594393648800236117046769112762641778865620892443423100189619327585811384883515424918752749559627553637785037359639801125213256163008431942593727931931898199727552768626775618479833029101249692573716030706695702510982283555740851047022672485743432464647772882314215176114732257497240284164016914018689044557218920300262234652840632406067273375269301008409860193180822366735877288205783314326102263756503786736122321348320031950012144905869556204017430593656052867939493633163499580242224763404338807022510136217187779084917996171602737036564991036724299
c12 = 21991524128957260536043771284854920393105808126700128222125856775506885721971193109361315961129190814674647136464887087893990660894961612838205086401018885457667488911898654270235561980111174603323721280911197488286585269356849579263043456316319476495888696219344219866516861187654180509247881251251278919346267129904739277386289240394384575124331135655943513831009934023397457082184699737734388823763306805326430395849935770213817533387235486307008892410920611669932693018165569417445885810825749609388627231235840912644654685819620931663346297596334834498661789016450371769203650109994771872404185770230172934013971

n13 = 20545487405816928731738988374475012686827933709789784391855706835136270270933401203019329136937650878386117187776530639342572123237188053978622697282521473917978282830432161153221216194169879669541998840691383025487220850872075436064308499924958517979727954402965612196081404341651517326364041519250125036424822634354268773895465698920883439222996581226358595873993976604699830613932320720554130011671297944433515047180565484495191003887599891289037982010216357831078328159028953222056918189365840711588671093333013117454034313622855082795813122338562446223041211192277089225078324682108033843023903550172891959673551
c13 = 14227439188191029461250476692790539654619199888487319429114414557975376308688908028140817157205579804059783807641305577385724758530138514972962209062230576107406142402603484375626077345190883094097636019771377866339531511965136650567412363889183159616188449263752475328663245311059988337996047359263288837436305588848044572937759424466586870280512424336807064729894515840552404756879590698797046333336445465120445087587621743906624279621779634772378802959109714400516183718323267273824736540168545946444437586299214110424738159957388350785999348535171553569373088251552712391288365295267665691357719616011613628772175

n14 = 27359727711584277234897157724055852794019216845229798938655814269460046384353568138598567755392559653460949444557879120040796798142218939251844762461270251672399546774067275348291003962551964648742053215424620256999345448398805278592777049668281558312871773979931343097806878701114056030041506690476954254006592555275342579529625231194321357904668512121539514880704046969974898412095675082585315458267591016734924646294357666924293908418345508902112711075232047998775303603175363964055048589769318562104883659754974955561725694779754279606726358588862479198815999276839234952142017210593887371950645418417355912567987
c14 = 3788529784248255027081674540877016372807848222776887920453488878247137930578296797437647922494510483767651150492933356093288965943741570268943861987024276610712717409139946409513963043114463933146088430004237747163422802959250296602570649363016151581364006795894226599584708072582696996740518887606785460775851029814280359385763091078902301957226484620428513604630585131511167015763190591225884202772840456563643159507805711004113901417503751181050823638207803533111429510911616160851391754754434764819568054850823810901159821297849790005646102129354035735350124476838786661542089045509656910348676742844957008857457

n15 = 27545937603751737248785220891735796468973329738076209144079921449967292572349424539010502287564030116831261268197384650511043068738911429169730640135947800885987171539267214611907687570587001933829208655100828045651391618089603288456570334500533178695238407684702251252671579371018651675054368606282524673369983034682330578308769886456335818733827237294570476853673552685361689144261552895758266522393004116017849397346259119221063821663280935820440671825601452417487330105280889520007917979115568067161590058277418371493228631232457972494285014767469893647892888681433965857496916110704944758070268626897045014782837
c15 = 14069112970608895732417039977542732665796601893762401500878786871680645798754783315693511261740059725171342404186571066972546332813667711135661176659424619936101038903439144294886379322591635766682645179888058617577572409307484708171144488708410543462972008179994594087473935638026612679389759756811490524127195628741262871304427908481214992471182859308828778119005750928935764927967212343526503410515793717201360360437981322576798056276657140363332700714732224848346808963992302409037706094588964170239521193589470070839790404597252990818583717869140229811712295005710540476356743378906642267045723633874011649259842

n16 = 25746162075697911560263181791216433062574178572424600336856278176112733054431463253903433128232709054141607100891177804285813783247735063753406524678030561284491481221681954564804141454666928657549670266775659862814924386584148785453647316864935942772919140563506305666207816897601862713092809234429096584753263707828899780979223118181009293655563146526792388913462557306433664296966331469906428665127438829399703002867800269947855869262036714256550075520193125987011945192273531732276641728008406855871598678936585324782438668746810516660152018244253008092470066555687277138937298747951929576231036251316270602513451
c16 = 17344284860275489477491525819922855326792275128719709401292545608122859829827462088390044612234967551682879954301458425842831995513832410355328065562098763660326163262033200347338773439095709944202252494552172589503915965931524326523663289777583152664722241920800537867331030623906674081852296232306336271542832728410803631170229642717524942332390842467035143631504401140727083270732464237443915263865880580308776111219718961746378842924644142127243573824972533819479079381023103585862099063382129757560124074676150622288706094110075567706403442920696472627797607697962873026112240527498308535903232663939028587036724

n17 = 23288486934117120315036919418588136227028485494137930196323715336208849327833965693894670567217971727921243839129969128783853015760155446770590696037582684845937132790047363216362087277861336964760890214059732779383020349204803205725870225429985939570141508220041286857810048164696707018663758416807708910671477407366098883430811861933014973409390179948577712579749352299440310543689035651465399867908428885541237776143404376333442949397063249223702355051571790555151203866821867908531733788784978667478707672984539512431549558672467752712004519300318999208102076732501412589104904734983789895358753664077486894529499
c17 = 10738254418114076548071448844964046468141621740603214384986354189105236977071001429271560636428075970459890958274941762528116445171161040040833357876134689749846940052619392750394683504816081193432350669452446113285638982551762586656329109007214019944975816434827768882704630460001209452239162896576191876324662333153835533956600295255158377025198426950944040643235430211011063586032467724329735785947372051759042138171054165854842472990583800899984893232549092766400510300083585513014171220423103452292891496141806956300396540682381668367564569427813092064053993103537635994311143010708814851867239706492577203899024

n18 = 19591441383958529435598729113936346657001352578357909347657257239777540424811749817783061233235817916560689138344041497732749011519736303038986277394036718790971374656832741054547056417771501234494768509780369075443550907847298246275717420562375114406055733620258777905222169702036494045086017381084272496162770259955811174440490126514747876661317750649488774992348005044389081101686016446219264069971370646319546429782904810063020324704138495608761532563310699753322444871060383693044481932265801505819646998535192083036872551683405766123968487907648980900712118052346174533513978009131757167547595857552370586353973
c18 = 3834917098887202931981968704659119341624432294759361919553937551053499607440333234018189141970246302299385742548278589896033282894981200353270637127213483172182529890495903425649116755901631101665876301799865612717750360089085179142750664603454193642053016384714515855868368723508922271767190285521137785688075622832924829248362774476456232826885801046969384519549385428259591566716890844604696258783639390854153039329480726205147199247183621535172450825979047132495439603840806501254997167051142427157381799890725323765558803808030109468048682252028720241357478614704610089120810367192414352034177484688502364022887

n19 = 19254242571588430171308191757871261075358521158624745702744057556054652332495961196795369630484782930292003238730267396462491733557715379956969694238267908985251699834707734400775311452868924330866502429576951934279223234676654749272932769107390976321208605516299532560054081301829440688796904635446986081691156842271268059970762004259219036753174909942343204432795076377432107630203621754552804124408792358220071862369443201584155711893388877350138023238624566616551246804054720492816226651467017802504094070614892556444425915920269485861799532473383304622064493223627552558344088839860178294589481899206318863310603
c19 = 6790553533991297205804561991225493105312398825187682250780197510784765226429663284220400480563039341938599783346724051076211265663468643826430109013245014035811178295081939958687087477312867720289964506097819762095244479129359998867671811819738196687884696680463458661374310994610760009474264115750204920875527434486437536623589684519411519100170291423367424938566820315486507444202022408003879118465761273916755290898112991525546114191064022991329724370064632569903856189236177894007766690782630247443895358893983735822824243487181851098787271270256780891094405121947631088729917398317652320497765101790132679171889

n20 = 26809700251171279102974962949184411136459372267620535198421449833298448092580497485301953796619185339316064387798092220298630428207556482805739803420279056191194360049651767412572609187680508073074653291350998253938793269214230457117194434853888765303403385824786231859450351212449404870776320297419712486574804794325602760347306432927281716160368830187944940128907971027838510079519466846176106565164730963988892400240063089397720414921398936399927948235195085202171264728816184532651138221862240969655185596628285814057082448321749567943946273776184657698104465062749244327092588237927996419620170254423837876806659
c20 = 386213556608434013769864727123879412041991271528990528548507451210692618986652870424632219424601677524265011043146748309774067894985069288067952546139416819404039688454756044862784630882833496090822568580572859029800646671301748901528132153712913301179254879877441322285914544974519727307311002330350534857867516466612474769753577858660075830592891403551867246057397839688329172530177187042229028685862036140779065771061933528137423019407311473581832405899089709251747002788032002094495379614686544672969073249309703482556386024622814731015767810042969813752548617464974915714425595351940266077021672409858645427346
e = 65537
# n=[n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14,n15,n16,n17,n18,n19,n20]
# for i in range(len(n)):
#     for j in range(i,len(n)):
#         p=gcd(n[i],n[j])
#         q=n[i]//p
#         if isPrime(p) & isPrime(q) :
#             print(i,j)
#             print(p)
#             print(q)
            # break

p=132585806383798600305426957307612567604223562626764190211333136246643723811046149337852966828729052476725552361132437370521548707664977123165279305052971868012755509160408641100548744046621516877981864180076497524093201404558036301820216274968638825245150755772559259575544101918590311068466601618472464832499
q=172130338499326278748088659642118539903263306644625489813269854049704514120598134934786316771912260248369075948864036229605563950070491992643125838594149381631362120542615545158696925360916086470107987771246645459433841320759048661246016875180635458357799131806734777129141845728102816378815607663660131827433
phi=(p-1)*(q-1)
d=invert(e,phi)
m=pow(c5,d,n5)
print(long_to_bytes(m))

答案:flag{abdcbe5fd94e23b3de429223ab9c2fdf}

达芬奇密码

题目:

达芬奇隐藏在蒙娜丽莎中的数字列:1 233 3 2584 1346269 144 5 196418 21 1597 610 377 10946 89 514229 987 8 55 6765 2178309 121393 317811 46368 4181 1 832040 2 28657 75025 34 13 17711 
记录在达芬奇窗台口的神秘数字串:36968853882116725547342176952286

解题分析:

说实话很懵,拿到题根本没有思路,去看了wp才懂了

题目达芬奇密码好像是一本书,里面有关于斐波那契数列,所以这道题是关于斐波那契数列的一道题(谁想的到啊啊啊啊)

题目中的数字列和数字串长度都是32,正好答案要求32位十进制数

斐波那契数列(前32个)

[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309]

python生成代码:

list1=[1,1]
counter=2
while(counter<32):
    list1.append(list1[counter-1]+list1[counter-2])#生成斐波那契数列前32项
    counter+=1
print(list1)

很重要的一点:题目所给的数字列和斐波那契数列是一样的,只是顺序打乱了

所以根据数字列可以得到一个顺序:(仔细看会发现有两个0,没有1)

[0,12,3,17,30,11,4,26,7,16,14,13,20,10,28,15,5,9,19,31,25,27,23,18,0,29,2,22,24,8,6,21]
list1 = [1, 233, 3, 2584, 1346269, 144, 5, 196418, 21, 1597, 610, 377, 10946, 89, 514229, 987, 8, 55, 6765, 2178309,121393, 317811, 46368, 4181, 1, 832040, 2, 28657, 75025, 34, 13, 17711]
f = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368,75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309]
for i in range(32):
    for j in range(32):
        if list1[i] == f[j]:
            print(j, end=",")
            break#找到后记得要跳出j的循环,否则会被覆盖第一次寻找到的位置

得到了顺序只是第一步,根据题目所说数字串是关键,大胆猜测数字串是flag经过打乱得到的,而打乱的顺序就是我们上面求到的顺序,得到flag:7a995588256861228614165223347687

s = [0,12,3,17,30,11,4,26,7,16,14,13,20,10,28,15,5,9,19,31,25,27,23,18,0,29,2,22,24,8,6,21]
m=['a']*32#这里不要用数字,不然看不出来
for i in range(32):
    m[s[i]]=c[i]
for i in range(len(m)):
    print(m[i],end='')

但是flag中居然有一个a(这是我们初始化列表的值),这是因为斐波那契数列中有两个1所导致的(所以上面求的顺序有两个0,应该是一个1一个0,但是我们没有办法确定哪个是1哪个是0,就都求出来拿去看哪个能够通过)

第一个0对应数字串中的3,第二个0对应数字串中的7

所以flag有两种可能

73995588256861228614165223347687

37995588256861228614165223347687

都拿去试一下得到答案

解密代码:

from Crypto.Util.number import *
from gmpy2 import *

list1 = [1, 233, 3, 2584, 1346269, 144, 5, 196418, 21, 1597, 610, 377, 10946, 89, 514229, 987, 8, 55, 6765, 2178309,
         121393, 317811, 46368, 4181, 1, 832040, 2, 28657, 75025, 34, 13, 17711]
print(len(list1))
c = '36968853882116725547342176952286'
f = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368,
     75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309]
for i in range(32):
    for j in range(32):
        if list1[i] == f[j]:
            print(j, end=",")
            break#找到后记得要跳出j的循环
s = [0,12,3,17,30,11,4,26,7,16,14,13,20,10,28,15,5,9,19,31,25,27,23,18,0,29,2,22,24,8,6,21]
m=['a']*32
for i in range(32):
    m[s[i]]=c[i]
print('\n')
print(len(m))
for i in range(len(m)):
    print(m[i],end='')

# list1=[1,1]
# counter=2
# while(counter<32):
#     list1.append(list1[counter-1]+list1[counter-2])#生成斐波那契数列前32项
#     counter+=1
# print(list1)

答案:flag{37995588256861228614165223347687}

[WUSTCTF2020]佛说:只能四天

解题分析:

根据题目可以知道是与佛论禅密码,直接查找相应网站解密

与佛论禅解密网站:新约佛论禅/佛曰加密 - PcMoe!

解得:

平等文明自由友善公正自由诚信富强自由自由平等民主平等自由自由友善敬业平等公正平等富强平等自由平等民主和谐公正自由诚信平等和谐公正公正自由法治平等法治法治法治和谐和谐平等自由和谐自由自由和谐公正自由敬业自由文明和谐平等自由文明和谐平等和谐文明自由和谐自由和谐和谐平等和谐法治公正诚信平等公正诚信民主自由和谐公正民主平等平等平等平等自由和谐和谐和谐平等和谐自由诚信平等和谐自由自由友善敬业平等和谐自由友善敬业平等法治自由法治和谐和谐自由友善公正法治敬业公正友善爱国公正民主法治文明自由民主平等公正自由法治平等文明平等友善自由平等和谐自由友善自由平等文明自由民主自由平等平等敬业自由平等平等诚信富强平等友善敬业公正诚信平等公正友善敬业公正平等平等诚信平等公正自由公正诚信平等法治敬业公正诚信平等法治平等公正友善平等公正诚信自由公正友善敬业法治法治公正公正公正平等公正诚信自由公正和谐公正平等

很明显是社会主义价值观密码,解密网站:Core Values Decoder

解得:RLJDQTOVPTQ6O6duws5CD6IB5B52CC57okCaUUC3SO4OSOWG3LynarAVGRZSJRAEYEZ_ooe_doyouknowfence

根据后面的提示可以知道是栅栏密码(这里要注意解密的时候要把提示给删掉)

得到:R5UALCUVJDCGD63RQISZTBOSO54JVBORP5SAT2OEQCWY6CGEO53Z67L_doyouknowCaesar@

同样根据提示采用凯撒解密(一样需要删掉提示),但根据题目给的hint可知凯撒不是最后一步,根据凯撒解密的结果中没有大写字母猜测是base32,一个一个的去套,最后得到答案

答案:flag{ni_hao_xiang_xiang_da_wo}

[MRCTF2020]古典密码知多少

题目:

解题分析:

根据题目可以知道是猪圈密码+圣堂武士密码+标准银河字母

对应的解出即可得到:fgcpfki(j)rtuasyon

然后根据提示使用栅栏解密得到:fkagi(j)scryptofun

所以答案是cryptofun,记得要大写

古典密码:(主要是很多奇奇怪怪的密码,很详细)CTF·Crypto·古典密码大全_polybius密码又称为棋盘密码,一般是将给定的明文加密为两两组合的数字,也可以-CSDN博客

答案:flag{CRYPTOFUN}

rot

题目:

破解下面的密文:

83 89 78 84 45 86 96 45 115 121 110 116 136 132 132 132 108 128 117 118 134 110 123 111 110 127 108 112 124 122 108 118 128 108 131 114 127 134 108 116 124 124 113 108 76 76 76 76 138 23 90 81 66 71 64 69 114 65 112 64 66 63 69 61 70 114 62 66 61 62 69 67 70 63 61 110 110 112 64 68 62 70 61 112 111 112

flag格式flag{}

解题分析:

首先根据题目可以知道要用到rot密码,观察密文,由ascll码的范围是32~126,密文中有超出这个范围的,于是用rot13解密(其实我是直接用了凯撒看了一下发现了flag,偏移值正好是13)

得到

FLAG IS flag{www_shiyanbar_com_is_very_good_????}
MD5:38e4c352809e150186920aac37190cbc

然后这里卡着了,主要是md5不太熟

到这里其实已经快出来了,这边需要把后四位爆破出来,因为md5的字符串范围在0-9和a-f,可以直接爆破出来(我写的代码直接取得ascll码的范围,其实可以缩小范围的)

python中的md5加密:

temp为要加密字符串

import hashlib

md = hashlib.md5(temp.encode()) # 创建md5对象

md5pwd= md.hexdigest() # md5加密

解密代码:

from Crypto.Util.number import *
from gmpy2 import *
import hashlib
# list1=[83,89,78,84,45,86,96,45,115,121,110,116,136,132,132,132,108,128,117,118,134,110,123,111,110,127,108,112,124,122,108,118,128,108,131,114,127,134,108,116,124,124,113,108,76,76,76,76,138,23,90,81,66,71,64,69,114,65,112,64,66,63,69,61,70,114,62,66,61,62,69,67,70,63,61,110,110,112,64,68,62,70,61,112,111,112]
# for i in range(len(list1)):
#     print(chr(list1[i]-13),end="")
f='flag{www_shiyanbar_com_is_very_good_'
md="38e4c352809e150186920aac37190cbc"
for i in range(32,126):
    for j in range(32, 126):
        for k in range(32, 126):
            for l in range(32, 126):
                temp=f+chr(i)+chr(j)+chr(k)+chr(l)+'}'
                md5=hashlib.md5(temp.encode('utf-8')).hexdigest()
                # md = hashlib.md5(temp.encode())  # 创建md5对象
                # md5pwd = md.hexdigest()  # md5加密
                if md5==md:
                    print(temp)
                    break

答案:flag{www_shiyanbar_com_is_very_good_@8Mu}

这是什么

解题分析:

题目给的文件是apk文件(给卡这了,因为不知道怎么处理apk文件,没安装apk工具,跑去看了wp)

原来apk文件只是一个幌子(当然也要打开了apk文件才知道,我去下个apk处理工具),把文件的后缀改成.txt,打开后

很明显是JSFuck编码

 特征:

只用 **! + ( ) [ ] **这八个字符就能完成对任意字符串的编码。

解密网站:CoderTab - JSUnFuck - 在这里解码 JSFuck

使用网站解出即可

答案:flag{a0448fd730b62c13ca80200c4529daa2}

[NCTF2019]childRSA

题目:

from random import choice
from Crypto.Util.number import isPrime, sieve_base as primes
from flag import flag


def getPrime(bits):
    while True:
        n = 2
        while n.bit_length() < bits:
            n *= choice(primes)
        if isPrime(n + 1):
            return n + 1

e = 0x10001
m = int.from_bytes(flag.encode(), 'big')
p, q = [getPrime(2048) for _ in range(2)]
n = p * q
c = pow(m, e, n)

# n = 32849718197337581823002243717057659218502519004386996660885100592872201948834155543125924395614928962750579667346279456710633774501407292473006312537723894221717638059058796679686953564471994009285384798450493756900459225040360430847240975678450171551048783818642467506711424027848778367427338647282428667393241157151675410661015044633282064056800913282016363415202171926089293431012379261585078566301060173689328363696699811123592090204578098276704877408688525618732848817623879899628629300385790344366046641825507767709276622692835393219811283244303899850483748651722336996164724553364097066493953127153066970594638491950199605713033004684970381605908909693802373826516622872100822213645899846325022476318425889580091613323747640467299866189070780620292627043349618839126919699862580579994887507733838561768581933029077488033326056066378869170169389819542928899483936705521710423905128732013121538495096959944889076705471928490092476616709838980562233255542325528398956185421193665359897664110835645928646616337700617883946369110702443135980068553511927115723157704586595844927607636003501038871748639417378062348085980873502535098755568810971926925447913858894180171498580131088992227637341857123607600275137768132347158657063692388249513
# c = 26308018356739853895382240109968894175166731283702927002165268998773708335216338997058314157717147131083296551313334042509806229853341488461087009955203854253313827608275460592785607739091992591431080342664081962030557042784864074533380701014585315663218783130162376176094773010478159362434331787279303302718098735574605469803801873109982473258207444342330633191849040553550708886593340770753064322410889048135425025715982196600650740987076486540674090923181664281515197679745907830107684777248532278645343716263686014941081417914622724906314960249945105011301731247324601620886782967217339340393853616450077105125391982689986178342417223392217085276465471102737594719932347242482670320801063191869471318313514407997326350065187904154229557706351355052446027159972546737213451422978211055778164578782156428466626894026103053360431281644645515155471301826844754338802352846095293421718249819728205538534652212984831283642472071669494851823123552827380737798609829706225744376667082534026874483482483127491533474306552210039386256062116345785870668331513725792053302188276682550672663353937781055621860101624242216671635824311412793495965628876036344731733142759495348248970313655381407241457118743532311394697763283681852908564387282605279108

解题分析:

一开始看到这道题以为是p-1光滑,但是没有跑出来,看了wp才知道就是费马小定理的运用

直接求出primes数组所有元素的乘积之和,记作sum

由p-1和q-1都是primes数组中部分元素的乘积,则sum是p-1的倍数即sun=k*(p-1)

根据费马小定理:

若b为一个素数,则对于任意整数a,有a ^ (b-1) = 1 (mod b)

拓展结论:a ^ k *(b-1) = 1 (mod b)

则有2 ^ (p-1) = 1 mod p

2 ^ sum = 2 ^ k*(p-1)=1 mod p

由n=p*q,所有gcd(2 ^ sum -1, n)=p

但是直接这样写代码的话,2 ^sum - 1 可能会很大导致报错

所以这里还需要做一下处理:

2 ^ sum = 1 mod p = 1+ k*p

由2 ^ sum %n =2 ^ sum - k1*n=2 ^ sum - k1*p*q

两边同时模p有:2 ^sum % n = 2 ^ sum % p =1 mod p 

即2 ^ sum %n 也是p的倍数

故求gcd(2 ^ sum % n -1, n)即可

解密代码:

from Crypto.Util.number import *
from gmpy2 import *
from Crypto.Util.number import isPrime, sieve_base as primes
n= 32849718197337581823002243717057659218502519004386996660885100592872201948834155543125924395614928962750579667346279456710633774501407292473006312537723894221717638059058796679686953564471994009285384798450493756900459225040360430847240975678450171551048783818642467506711424027848778367427338647282428667393241157151675410661015044633282064056800913282016363415202171926089293431012379261585078566301060173689328363696699811123592090204578098276704877408688525618732848817623879899628629300385790344366046641825507767709276622692835393219811283244303899850483748651722336996164724553364097066493953127153066970594638491950199605713033004684970381605908909693802373826516622872100822213645899846325022476318425889580091613323747640467299866189070780620292627043349618839126919699862580579994887507733838561768581933029077488033326056066378869170169389819542928899483936705521710423905128732013121538495096959944889076705471928490092476616709838980562233255542325528398956185421193665359897664110835645928646616337700617883946369110702443135980068553511927115723157704586595844927607636003501038871748639417378062348085980873502535098755568810971926925447913858894180171498580131088992227637341857123607600275137768132347158657063692388249513
c = 26308018356739853895382240109968894175166731283702927002165268998773708335216338997058314157717147131083296551313334042509806229853341488461087009955203854253313827608275460592785607739091992591431080342664081962030557042784864074533380701014585315663218783130162376176094773010478159362434331787279303302718098735574605469803801873109982473258207444342330633191849040553550708886593340770753064322410889048135425025715982196600650740987076486540674090923181664281515197679745907830107684777248532278645343716263686014941081417914622724906314960249945105011301731247324601620886782967217339340393853616450077105125391982689986178342417223392217085276465471102737594719932347242482670320801063191869471318313514407997326350065187904154229557706351355052446027159972546737213451422978211055778164578782156428466626894026103053360431281644645515155471301826844754338802352846095293421718249819728205538534652212984831283642472071669494851823123552827380737798609829706225744376667082534026874483482483127491533474306552210039386256062116345785870668331513725792053302188276682550672663353937781055621860101624242216671635824311412793495965628876036344731733142759495348248970313655381407241457118743532311394697763283681852908564387282605279108
e= 65537

sum = 1
for i in primes:
    sum *= i
# p为(2^prd-1)和n的公约数
p = gcd(powmod(2, sum, n) - 1, n)
q = n // p
d = invert(e, (p - 1) * (q - 1))  # 计算私钥d
m = powmod(c, d, n)  # 解密
print(long_to_bytes(m))

答案:flag{Th3r3_ar3_1ns3cure_RSA_m0duli_7hat_at_f1rst_gl4nce_appe4r_t0_be_s3cur3}

[HDCTF2019]bbbbbbrsa

题目:

from base64 import b64encode as b32encode
from gmpy2 import invert,gcd,iroot
from Crypto.Util.number import *
from binascii import a2b_hex,b2a_hex
import random

flag = "******************************"

nbit = 128

p = getPrime(nbit)
q = getPrime(nbit)
n = p*q

print(p)
print(n)

phi = (p-1)*(q-1)

e = random.randint(50000,70000)

while True:
	if gcd(e,phi) == 1:
		break
	else:
		e -= 1

c = pow(int(b2a_hex(flag),16),e,n)

print(b32encode(str(c))[::-1])

# 2373740699529364991763589324200093466206785561836101840381622237225512234632

p = 177077389675257695042507998165006460849
n = 37421829509887796274897162249367329400988647145613325367337968063341372726061
c = ==gMzYDNzIjMxUTNyIzNzIjMyYTM4MDM0gTMwEjNzgTM2UTN4cjNwIjN2QzM5ADMwIDNyMTO4UzM2cTM5kDN2MTOyUTO5YDM0czM3MjM

解题分析:

题目直接给出了n,p,c

c在代码中已经给出,或者求一下也是一样的(把c倒转一下,再base64解密即可,话说代码给的有点奇怪,不是base32加密的吗)

e是未知的,但是有范围,直接爆破即可

解密代码:

from Crypto.Util.number import *
from gmpy2 import *
p = 177077389675257695042507998165006460849
n = 37421829509887796274897162249367329400988647145613325367337968063341372726061
c=2373740699529364991763589324200093466206785561836101840381622237225512234632
q=n//p
phi=(p-1)*(q-1)
for e in range(2,70000):
    if gcd(e,phi)==1 :
        d=invert(e,phi)
        m=pow(c,d,n)
        m=long_to_bytes(m)
        if b'flag' in m :
            print(m)
            break

答案:flag{rs4_1s_s1mpl3!#}

[NCTF2019]Keyboard

题目:

ooo yyy ii w uuu ee uuuu yyy uuuu y w uuu i i rr w i i rr rrr uuuu rrr uuuu t ii uuuu i w u rrr ee www ee yyy eee www w tt ee

解题分析:

根据题目知道是键盘密码,观察给的密文可以发现所有字母都在键盘第一行,(第一行上面正好对应着数字)则转为对应的数字

999,666,88,2,777,33,7777,666,7777,6,2,777,8,8,44,2,8,8,44,444,7777,444,7777,5,88,7777,8,2,7,444,33,222,33,666,333,222,2,55,33

然后想到九宫格(别问,问就是看了wp才知道的),数字代表第几个格,数字重复几次代表是那一格的第几个字母,比如”999“->y

然后得到答案

解密代码:

网上找的代码,自己是手算出来的(要仔细一点,一不小心就看花了眼)

cipher="ooo yyy ii w uuu ee uuuu yyy uuuu y w uuu i i rr w i i rr rrr uuuu rrr uuuu t ii uuuu i w u rrr ee www ee yyy eee www w tt ee"
base=" qwertyuiop"
a=[" "," ","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]
for part in cipher.split(" "):
    s=base.index(part[0])
    count=len(part)
    print(a[s][count-1],end="")

答案:flag{youaresosmartthatthisisjustapieceofcake}

RSA4

题目:

N = 331310324212000030020214312244232222400142410423413104441140203003243002104333214202031202212403400220031202142322434104143104244241214204444443323000244130122022422310201104411044030113302323014101331214303223312402430402404413033243132101010422240133122211400434023222214231402403403200012221023341333340042343122302113410210110221233241303024431330001303404020104442443120130000334110042432010203401440404010003442001223042211442001413004 
c = 310020004234033304244200421414413320341301002123030311202340222410301423440312412440240244110200112141140201224032402232131204213012303204422003300004011434102141321223311243242010014140422411342304322201241112402132203101131221223004022003120002110230023341143201404311340311134230140231412201333333142402423134333211302102413111111424430032440123340034044314223400401224111323000242234420441240411021023100222003123214343030122032301042243

N = 302240000040421410144422133334143140011011044322223144412002220243001141141114123223331331304421113021231204322233120121444434210041232214144413244434424302311222143224402302432102242132244032010020113224011121043232143221203424243134044314022212024343100042342002432331144300214212414033414120004344211330224020301223033334324244031204240122301242232011303211220044222411134403012132420311110302442344021122101224411230002203344140143044114 
c = 112200203404013430330214124004404423210041321043000303233141423344144222343401042200334033203124030011440014210112103234440312134032123400444344144233020130110134042102220302002413321102022414130443041144240310121020100310104334204234412411424420321211112232031121330310333414423433343322024400121200333330432223421433344122023012440013041401423202210124024431040013414313121123433424113113414422043330422002314144111134142044333404112240344

N = 332200324410041111434222123043121331442103233332422341041340412034230003314420311333101344231212130200312041044324431141033004333110021013020140020011222012300020041342040004002220210223122111314112124333211132230332124022423141214031303144444134403024420111423244424030030003340213032121303213343020401304243330001314023030121034113334404440421242240113103203013341231330004332040302440011324004130324034323430143102401440130242321424020323 
c = 10013444120141130322433204124002242224332334011124210012440241402342100410331131441303242011002101323040403311120421304422222200324402244243322422444414043342130111111330022213203030324422101133032212042042243101434342203204121042113212104212423330331134311311114143200011240002111312122234340003403312040401043021433112031334324322123304112340014030132021432101130211241134422413442312013042141212003102211300321404043012124332013240431242

解题分析:

好的,也是拿到就不会的题(太难了),果断去看了wp

首先给的n和c都是五进制的(根本没仔细看数据的我),所以要转为10进制

可以使用int(str,进制)来转化(默认转化为十进制,如果要转化为其他进制则在int前面加上bin()\ oct()\ hex()\str())

比如int('011',2)->3

然后根据中国剩余定理(用于求解同余方程组)

中国剩余定理:设正整数m1,m2,…,mk两两互素,对任意整数a1,a2,…,ak,一次同余方程组

在模m意义下有唯一解,该解表示为
x = M1M1-1a1 + M2M2-1a2 + … + MkMk-1ak(mod m),
其中m = m1m2…mk, Mj = m / mj, MjMj-1 = 1(mod mj), j = 1, 2, …, k

那么根据题目有:(是同余式,但是我同余符号打不出来)

c1=m^e%N1

c2=m^e%N2

c3=m^e%N3

那么根据中国剩余定理即可求解出m^e

但是e没有给出,只能猜了或者爆破(但是这道题因为是别的平台的题目,所以开头不是flag,说实话爆破也不好找条件判断)

解密代码:

from Crypto.Util.number import *
from gmpy2 import *
import libnum
N1 = int(str(331310324212000030020214312244232222400142410423413104441140203003243002104333214202031202212403400220031202142322434104143104244241214204444443323000244130122022422310201104411044030113302323014101331214303223312402430402404413033243132101010422240133122211400434023222214231402403403200012221023341333340042343122302113410210110221233241303024431330001303404020104442443120130000334110042432010203401440404010003442001223042211442001413004),5)
c1 = int(str(310020004234033304244200421414413320341301002123030311202340222410301423440312412440240244110200112141140201224032402232131204213012303204422003300004011434102141321223311243242010014140422411342304322201241112402132203101131221223004022003120002110230023341143201404311340311134230140231412201333333142402423134333211302102413111111424430032440123340034044314223400401224111323000242234420441240411021023100222003123214343030122032301042243),5)

N2 = int(str(302240000040421410144422133334143140011011044322223144412002220243001141141114123223331331304421113021231204322233120121444434210041232214144413244434424302311222143224402302432102242132244032010020113224011121043232143221203424243134044314022212024343100042342002432331144300214212414033414120004344211330224020301223033334324244031204240122301242232011303211220044222411134403012132420311110302442344021122101224411230002203344140143044114),5)
c2 = int(str(112200203404013430330214124004404423210041321043000303233141423344144222343401042200334033203124030011440014210112103234440312134032123400444344144233020130110134042102220302002413321102022414130443041144240310121020100310104334204234412411424420321211112232031121330310333414423433343322024400121200333330432223421433344122023012440013041401423202210124024431040013414313121123433424113113414422043330422002314144111134142044333404112240344),5)

N3 = int(str(332200324410041111434222123043121331442103233332422341041340412034230003314420311333101344231212130200312041044324431141033004333110021013020140020011222012300020041342040004002220210223122111314112124333211132230332124022423141214031303144444134403024420111423244424030030003340213032121303213343020401304243330001314023030121034113334404440421242240113103203013341231330004332040302440011324004130324034323430143102401440130242321424020323),5)
c3 = int(str(10013444120141130322433204124002242224332334011124210012440241402342100410331131441303242011002101323040403311120421304422222200324402244243322422444414043342130111111330022213203030324422101133032212042042243101434342203204121042113212104212423330331134311311114143200011240002111312122234340003403312040401043021433112031334324322123304112340014030132021432101130211241134422413442312013042141212003102211300321404043012124332013240431242),5)
n=[N1,N2,N3]
c=[c1,c2,c3]
m=1
sum=0
for i in n:
    m*=i
for i in range(len(n)):
    M=m//n[i]
    M1=invert(M,n[i])
    sum+=M*M1*c[i]
sum=sum%m
# print(long_to_bytes(sum))
e=2

while(True):
    flag=iroot(sum,e)[0]
    flag=long_to_bytes(flag)
    if b'{' in flag:
        print(flag)
        break
    e+=1
#b'noxCTF{D4mn_y0u_h4s74d_wh47_4_b100dy_b4s74rd!}'

答案:flag{D4mn_y0u_h4s74d_wh47_4_b100dy_b4s74rd!}

中国剩余定理原理以及代码:

中国剩余定理中国剩余定理(Python实现)_中国剩余定理python-CSDN博客

[MRCTF2020]天干地支+甲子

题目:

得到得字符串用MRCTF{}包裹
一天Eki收到了一封来自Sndav的信,但是他有点迷希望您来解决一下
甲戌
甲寅
甲寅
癸卯
己酉 
甲寅
辛丑

解题分析:

根据题目很明显是天干地支,直接对照表得到一串数据:

[11,51,51,40,46,51,38]

再根据题目的+甲子(六十年循环),于是数据都加上60,再转为字符得到答案

解密代码:

list1=[11,51,51,40,46,51,38]
for i in list1:
    print(chr(i+60),end='')

答案:flag{Goodjob}

[BJDCTF2020]RSA

题目:

from Crypto.Util.number import getPrime,bytes_to_long

flag=open("flag","rb").read()

p=getPrime(1024)
q=getPrime(1024)
assert(e<100000)
n=p*q
m=bytes_to_long(flag)
c=pow(m,e,n)
print(c,n)
print(pow(294,e,n))

p=getPrime(1024)
n=p*q
m=bytes_to_long("BJD"*32)
c=pow(m,e,n)
print(c,n)

'''
output:
12641635617803746150332232646354596292707861480200207537199141183624438303757120570096741248020236666965755798009656547738616399025300123043766255518596149348930444599820675230046423373053051631932557230849083426859490183732303751744004874183062594856870318614289991675980063548316499486908923209627563871554875612702079100567018698992935818206109087568166097392314105717555482926141030505639571708876213167112187962584484065321545727594135175369233925922507794999607323536976824183162923385005669930403448853465141405846835919842908469787547341752365471892495204307644586161393228776042015534147913888338316244169120  13508774104460209743306714034546704137247627344981133461801953479736017021401725818808462898375994767375627749494839671944543822403059978073813122441407612530658168942987820256786583006947001711749230193542370570950705530167921702835627122401475251039000775017381633900222474727396823708695063136246115652622259769634591309421761269548260984426148824641285010730983215377509255011298737827621611158032976420011662547854515610597955628898073569684158225678333474543920326532893446849808112837476684390030976472053905069855522297850688026960701186543428139843783907624317274796926248829543413464754127208843070331063037
381631268825806469518166370387352035475775677163615730759454343913563615970881967332407709901235637718936184198930226303761876517101208677107311006065728014220477966000620964056616058676999878976943319063836649085085377577273214792371548775204594097887078898598463892440141577974544939268247818937936607013100808169758675042264568547764031628431414727922168580998494695800403043312406643527637667466318473669542326169218665366423043579003388486634167642663495896607282155808331902351188500197960905672207046579647052764579411814305689137519860880916467272056778641442758940135016400808740387144508156358067955215018
979153370552535153498477459720877329811204688208387543826122582132404214848454954722487086658061408795223805022202997613522014736983452121073860054851302343517756732701026667062765906277626879215457936330799698812755973057557620930172778859116538571207100424990838508255127616637334499680058645411786925302368790414768248611809358160197554369255458675450109457987698749584630551177577492043403656419968285163536823819817573531356497236154342689914525321673807925458651854768512396355389740863270148775362744448115581639629326362342160548500035000156097215446881251055505465713854173913142040976382500435185442521721  12806210903061368369054309575159360374022344774547459345216907128193957592938071815865954073287532545947370671838372144806539753829484356064919357285623305209600680570975224639214396805124350862772159272362778768036844634760917612708721787320159318432456050806227784435091161119982613987303255995543165395426658059462110056431392517548717447898084915167661172362984251201688639469652283452307712821398857016487590794996544468826705600332208535201443322267298747117528882985955375246424812616478327182399461709978893464093245135530135430007842223389360212803439850867615121148050034887767584693608776323252233254261047
'''

解题分析:

根据题目可以知道n1=p*q,n2=p2*q

则可以求到q=gcd(n1,n2)

然后根据pow(294,e,n1)=s,爆破出e

e=2
while(e<100000):
    if pow(294,e,n1)==s:
        print(e)
        break
    e+=1

求得e=52361

然后正常求解即可

解密代码:

from Crypto.Util.number import *
from gmpy2 import *
c1=12641635617803746150332232646354596292707861480200207537199141183624438303757120570096741248020236666965755798009656547738616399025300123043766255518596149348930444599820675230046423373053051631932557230849083426859490183732303751744004874183062594856870318614289991675980063548316499486908923209627563871554875612702079100567018698992935818206109087568166097392314105717555482926141030505639571708876213167112187962584484065321545727594135175369233925922507794999607323536976824183162923385005669930403448853465141405846835919842908469787547341752365471892495204307644586161393228776042015534147913888338316244169120
n1=13508774104460209743306714034546704137247627344981133461801953479736017021401725818808462898375994767375627749494839671944543822403059978073813122441407612530658168942987820256786583006947001711749230193542370570950705530167921702835627122401475251039000775017381633900222474727396823708695063136246115652622259769634591309421761269548260984426148824641285010730983215377509255011298737827621611158032976420011662547854515610597955628898073569684158225678333474543920326532893446849808112837476684390030976472053905069855522297850688026960701186543428139843783907624317274796926248829543413464754127208843070331063037
s=381631268825806469518166370387352035475775677163615730759454343913563615970881967332407709901235637718936184198930226303761876517101208677107311006065728014220477966000620964056616058676999878976943319063836649085085377577273214792371548775204594097887078898598463892440141577974544939268247818937936607013100808169758675042264568547764031628431414727922168580998494695800403043312406643527637667466318473669542326169218665366423043579003388486634167642663495896607282155808331902351188500197960905672207046579647052764579411814305689137519860880916467272056778641442758940135016400808740387144508156358067955215018
c2=979153370552535153498477459720877329811204688208387543826122582132404214848454954722487086658061408795223805022202997613522014736983452121073860054851302343517756732701026667062765906277626879215457936330799698812755973057557620930172778859116538571207100424990838508255127616637334499680058645411786925302368790414768248611809358160197554369255458675450109457987698749584630551177577492043403656419968285163536823819817573531356497236154342689914525321673807925458651854768512396355389740863270148775362744448115581639629326362342160548500035000156097215446881251055505465713854173913142040976382500435185442521721
n2=12806210903061368369054309575159360374022344774547459345216907128193957592938071815865954073287532545947370671838372144806539753829484356064919357285623305209600680570975224639214396805124350862772159272362778768036844634760917612708721787320159318432456050806227784435091161119982613987303255995543165395426658059462110056431392517548717447898084915167661172362984251201688639469652283452307712821398857016487590794996544468826705600332208535201443322267298747117528882985955375246424812616478327182399461709978893464093245135530135430007842223389360212803439850867615121148050034887767584693608776323252233254261047
q=gcd(n1,n2)
p=n1//q
phi=(p-1)*(q-1)
e=52361
d=invert(e,phi)
m=pow(c1,d,n1)
print(long_to_bytes(m))
# e=2
# while(e<100000):
#     if pow(294,e,n1)==s:
#         print(e)
#         break
#     e+=1

答案:flag{p_is_common_divisor}

[BJDCTF2020]rsa_output

题目:

{21058339337354287847534107544613605305015441090508924094198816691219103399526800112802416383088995253908857460266726925615826895303377801614829364034624475195859997943146305588315939130777450485196290766249612340054354622516207681542973756257677388091926549655162490873849955783768663029138647079874278240867932127196686258800146911620730706734103611833179733264096475286491988063990431085380499075005629807702406676707841324660971173253100956362528346684752959937473852630145893796056675793646430793578265418255919376323796044588559726703858429311784705245069845938316802681575653653770883615525735690306674635167111,2767}

{21058339337354287847534107544613605305015441090508924094198816691219103399526800112802416383088995253908857460266726925615826895303377801614829364034624475195859997943146305588315939130777450485196290766249612340054354622516207681542973756257677388091926549655162490873849955783768663029138647079874278240867932127196686258800146911620730706734103611833179733264096475286491988063990431085380499075005629807702406676707841324660971173253100956362528346684752959937473852630145893796056675793646430793578265418255919376323796044588559726703858429311784705245069845938316802681575653653770883615525735690306674635167111,3659}

message1=20152490165522401747723193966902181151098731763998057421967155300933719378216342043730801302534978403741086887969040721959533190058342762057359432663717825826365444996915469039056428416166173920958243044831404924113442512617599426876141184212121677500371236937127571802891321706587610393639446868836987170301813018218408886968263882123084155607494076330256934285171370758586535415136162861138898728910585138378884530819857478609791126971308624318454905992919405355751492789110009313138417265126117273710813843923143381276204802515910527468883224274829962479636527422350190210717694762908096944600267033351813929448599

message2=11298697323140988812057735324285908480504721454145796535014418738959035245600679947297874517818928181509081545027056523790022598233918011261011973196386395689371526774785582326121959186195586069851592467637819366624044133661016373360885158956955263645614345881350494012328275215821306955212788282617812686548883151066866149060363482958708364726982908798340182288702101023393839781427386537230459436512613047311585875068008210818996941460156589314135010438362447522428206884944952639826677247819066812706835773107059567082822312300721049827013660418610265189288840247186598145741724084351633508492707755206886202876227

解题分析:

根据题目可知给出了n,e1,e2,c1,c2,那么很明显是共模攻击,对应求解即可

解密代码:

from Crypto.Util.number import *
from gmpy2 import *
n=21058339337354287847534107544613605305015441090508924094198816691219103399526800112802416383088995253908857460266726925615826895303377801614829364034624475195859997943146305588315939130777450485196290766249612340054354622516207681542973756257677388091926549655162490873849955783768663029138647079874278240867932127196686258800146911620730706734103611833179733264096475286491988063990431085380499075005629807702406676707841324660971173253100956362528346684752959937473852630145893796056675793646430793578265418255919376323796044588559726703858429311784705245069845938316802681575653653770883615525735690306674635167111
e1=2767
e2=3659
c1=20152490165522401747723193966902181151098731763998057421967155300933719378216342043730801302534978403741086887969040721959533190058342762057359432663717825826365444996915469039056428416166173920958243044831404924113442512617599426876141184212121677500371236937127571802891321706587610393639446868836987170301813018218408886968263882123084155607494076330256934285171370758586535415136162861138898728910585138378884530819857478609791126971308624318454905992919405355751492789110009313138417265126117273710813843923143381276204802515910527468883224274829962479636527422350190210717694762908096944600267033351813929448599
c2=11298697323140988812057735324285908480504721454145796535014418738959035245600679947297874517818928181509081545027056523790022598233918011261011973196386395689371526774785582326121959186195586069851592467637819366624044133661016373360885158956955263645614345881350494012328275215821306955212788282617812686548883151066866149060363482958708364726982908798340182288702101023393839781427386537230459436512613047311585875068008210818996941460156589314135010438362447522428206884944952639826677247819066812706835773107059567082822312300721049827013660418610265189288840247186598145741724084351633508492707755206886202876227
s,s1,s2=gcdext(e1,e2)
mt=pow(c1,s1,n)*pow(c2,s2,n)
ms=mt%n
m=iroot(ms,s)[0]
print(long_to_bytes(m))

答案:flag{r3a_C0mmoN_moD@_4ttack}

[BJDCTF2020]signin

题目:

welcome to crypto world!!
密文:
424a447b57653163306d655f74345f424a444354467d

解题分析:

这道题其实真的很简单(对不起我想复杂了),就直接十六进制转ascll码即可

解密网站:16进制到ASCII字符串在线转换工具 - Coding.Tools

答案:flag{We1c0me_t4_BJDCTF}

传感器

题目:

5555555595555A65556AA696AA6666666955
这是某压力传感器无线数据包解调后但未解码的报文(hex)
  
已知其ID为0xFED31F,请继续将报文完整解码,提交hex。

提示1:曼联

解题分析:

话说这道题之前好像见过,但是还是不太会

提示的曼联是指曼彻斯特编码

crypto之曼彻斯特编码-CSDN博客(这篇写的真的挺详细的了)

曼彻斯特编码有两种:802.3曼彻斯特和标准曼彻斯特

1.802.3曼彻斯特

01->0

10->1

2.标准曼彻斯特

01->1

10->0

这道题没有说是哪种,两种都需要试一下

把’5555555595555A65556AA696AA6666666955‘转为二进制(注意位数应为偶数,如果是奇数需要补0,在前面补上)

010101010101010101010101010101011001010101010101010110100110010101010101011010101010011010010110101010100110011001100110011001100110100101010101

再根据曼彻斯特编码解码得到:在线曼彻斯特解码器/编码器 ‐ eleif.net

111111111111111101111111110010111111100000100110000010101010101010011111

然后转为十六进制得到FFFF7FCBF8260AAA9F

这个时候给出的ID就起作用了,用于检验得到的答案是否正确(即答案需要包含ID)

则答案错误

根据八位倒序传输协议(阿巴阿巴阿巴)将二进制每八位reverse,转hex即可得到FFFFFED31F645055F9(这里是真的不知道为什么了,先记住吧)

解密代码:(网上找的脚本,说实话有点不懂)

cipher = '5555555595555A65556AA696AA6666666955'

def iee(cipher):
    tmp = ''
    for i in range(len(cipher)):
        a = bin(eval('0x' + cipher[i]))[2:].zfill(4)  # 补齐四位方便取1和3位
        tmp = tmp + a[1] + a[3]  # 加上1和3位,就是应用了802.3的規則,或者定义一个字典替换也可以
        print(tmp)
    plain = [hex(int(tmp[i:i + 8][::-1], 2))[2:] for i in range(0, len(tmp), 8)]
    print(''.join(plain).upper())


iee(cipher)

答案:flag{FFFFFED31F645055F9}

[ACTF新生赛2020]crypto-rsa0

解题分析:

打开压缩包发现代码伪加密了,需要进行处理才行

CTF常用工具_实时更新_qr research 百度网盘-CSDN博客(可以在这里下载WinHex 16进制编辑器,才好进行处理)

用WinHex 16进制编辑器打开压缩包(这是已经处理好了的)

处理方法:

  • 50 4B 01 02:目录中文件文件头标记(0x02014b50)

        3F 00:压缩使用的 pkware 版本

        14 00:解压文件所需 pkware 版本

        00 00:全局方式位标记(有无加密,这个更改这里进行伪加密,改为09 00打开就会提示 有 密码了)所以要改为00 00

  • 50 4B 03 04:这是头文件标记(0x04034b50)

        14 00:解压文件所需 pkware 版本

        00 00:全局方式位标记(有无加密)同样需要改为00 00

总的来说:

遇到504B0304,把其的第3、4个byte改成0000
遇到504B0102,把其的第5、6个byte改成0000即可破解伪加密。

然后就可以打开代码了,是很简单的RSA加密,对应解密即可

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)

解密代码:

from Crypto.Util.number import *
from gmpy2 import *
p=9018588066434206377240277162476739271386240173088676526295315163990968347022922841299128274551482926490908399237153883494964743436193853978459947060210411
q=7547005673877738257835729760037765213340036696350766324229143613179932145122130685778504062410137043635958208805698698169847293520149572605026492751740223
c=50996206925961019415256003394743594106061473865032792073035954925875056079762626648452348856255575840166640519334862690063949316515750256545937498213476286637455803452890781264446030732369871044870359838568618176586206041055000297981733272816089806014400846392307742065559331874972274844992047849472203390350
e=65537
n=p*q
phi=(p-1)*(q-1)
d=invert(e,phi)
m=pow(c,d,n)
print(long_to_bytes(m))

答案:flag{n0w_y0u_see_RSA}

[WUSTCTF2020]babyrsa

题目:

c = 28767758880940662779934612526152562406674613203406706867456395986985664083182
n = 73069886771625642807435783661014062604264768481735145873508846925735521695159
e = 65537

解题分析:

题目给出了c,n,e,且n比较小,可直接利用工具分解得到

p=189239861511125143212536989589123569301
q=386123125371923651191219869811293586459

根据常规的RSA解密即可(代码不放了)

答案:flag{just_@_piece_0f_cak3}

[MRCTF2020]vigenere

解题分析:

题目给了一大堆的字符,但是是乱的,根据题目可以知道是维吉尼亚密码,虽然代码看不懂,但是有工具,直接爆破即可求得答案

解密网站:

Vigenere Solver | guballa.de

答案:flag{vigenere_crypto_crack_man}

[MRCTF2020]keyboard

题目:

得到的flag用
MRCTF{xxxxxx}形式上叫
都为小写字母

6
666
22
444
555
33
7
44
666
66
3

解题分析:

跟前面的一道题很像,但这道题要简单一些,根据题目知道是键盘密码

根据数据应该是九宫格,直接对照写出来即可

mobilephond(但是答案是错的,额,把d改成了e,答案正确)

答案:flag{mobilephone}

一张谍报

题目:

国家能源总部经过派出卧底长期刺探,终于找到一个潜伏已久的国外内鬼:三楼能源楼管老王。由于抓捕仓促,老王服毒自尽了。侦查部门搜出老王每日看的报纸原来是特制的情报。聪明的你能从附件的报纸中找出情报么?flag是老王说的暗号。(由于老王的线人曾今做的土匪,所以用的行话) 注意:得到的 flag 请包上 flag{} 提交

解题分析:

这道题跟之前的斐波那契数列有点像,但是这也太难想到了吧,看了wp才会的

flag=''
str1='喵天上午,汪歌区哞叽公司决定,在每天八哇天不全免费在各大小区门脑设卡为全城提供双次震耳欲聋的敲哇提醒,呼吁大家早睡早起,不要因为贪睡断送大好人生,时代的编号是前进。为此,全区眠人都足在该公司流边草丛合力抵制,不给公司人员放行,场面混乱。李罗鸟住进汪歌区五十年了,人称眠鸟顶,几年孙叽李熬值刚从流北当屁户回来,每月还寄回来几块报信干。李罗鸟当年遇到的眠婆是汪歌一枝花,所以李值熬是长得非常秀气的一个汉叽。李罗鸟表示:无论哞叽公司做的对错,反正不能打扰他孙叽睡觉,叽叶:‘睡觉乃人之常情’。哞叽公司这是连衣服睡觉都不放过啊。李值熬表示:哞叽公司智商捉急,小心居民猴急跳墙!这八伏天都不给睡觉,这不扯淡么!到了中午人群仍未离散,哇有人提议要烧掉这个公司,公司高层似乎恨不得找个洞钻进去。直到治安人员出现才疏散人群归家,但是李值熬仍旧表示爷爷年纪大了,睡不好对身体不好。'
str2='喵汪哞叽双哇顶,眠鸟足屁流脑,八哇报信断流脑全叽,眠鸟进北脑上草,八枝遇孙叽,孙叽对熬编叶:值天衣服放鸟捉猴顶。鸟对:北汪罗汉伏熬乱天门。合编放行,卡编扯呼。人离烧草,报信归洞,孙叽找爷爷。'
str='今天上午,朝歌区梆子公司决定,在每天三更天不亮免费在各大小区门口设卡为全城提供二次震耳欲聋的敲更提醒,呼吁大家早睡早起,不要因为贪睡断送大好人生,时代的符号是前进。为此,全区老人都蹲在该公司东边树丛合力抵制,不给公司人员放行,场面混乱。李罗鹰住进朝歌区五十年了,人称老鹰头,几年孙子李虎南刚从东北当猎户回来,每月还寄回来几块鼹鼠干。李罗鹰当年遇到的老婆是朝歌一枝花,所以李南虎是长得非常秀气的一个汉子。李罗鹰表示:无论梆子公司做的对错,反正不能打扰他孙子睡觉,子曰:‘睡觉乃人之常情’。梆子公司这是连菩萨睡觉都不放过啊。李南虎表示:梆子公司智商捉急,小心居民猴急跳墙!这三伏天都不给睡觉,这不扯淡么!到了中午人群仍未离散,更有人提议要烧掉这个公司,公司高层似乎恨不得找个洞钻进去。直到治安人员出现才疏散人群归家,但是李南虎仍旧表示爷爷年纪大了,睡不好对身体不好。'
for i in range(len(str2)):
    for j in range(len(str1)):
        if str2[i]==str1[j]:
            flag+=str[j]
            break
print(flag)

在str1和str2中寻找相等的汉字的下标,再在str中根据str1的下标找出对应的汉字,得到:

今朝梆子二更头,老鹰蹲猎东口,三更鼹鼠断东口亮子,老鹰进北口上树,三枝遇孙子,孙子对虎符曰:南天菩萨放鹰捉猴头。鹰对:北朝罗汉伏虎乱天门。合符放行,卡符扯呼。人离烧树,鼹鼠归洞,孙子找爷爷。

有两句暗号,都试一下即可解出

答案:flag{南天菩萨放鹰捉猴头}

[GWCTF 2019]BabyRSA

题目:

import hashlib
import sympy
from Crypto.Util.number import *

flag = 'GWHT{******}'
secret = '******'

assert(len(flag) == 38)

half = len(flag) / 2 #19

flag1 = flag[:half]#把flag切片了
flag2 = flag[half:]

secret_num = getPrime(1024) * bytes_to_long(secret)

p = sympy.nextprime(secret_num)
q = sympy.nextprime(p)

N = p * q

e = 0x10001

F1 = bytes_to_long(flag1)
F2 = bytes_to_long(flag2)

c1 = F1 + F2
c2 = pow(F1, 3) + pow(F2, 3)
assert(c2 < N)

m1 = pow(c1, e, N)
m2 = pow(c2, e, N)

output = open('secret', 'w')
output.write('N=' + str(N) + '\n')
output.write('m1=' + str(m1) + '\n')
output.write('m2=' + str(m2) + '\n')
output.close()

#N=636585149594574746909030160182690866222909256464847291783000651837227921337237899651287943597773270944384034858925295744880727101606841413640006527614873110651410155893776548737823152943797884729130149758279127430044739254000426610922834573094957082589539445610828279428814524313491262061930512829074466232633130599104490893572093943832740301809630847541592548921200288222432789208650949937638303429456468889100192613859073752923812454212239908948930178355331390933536771065791817643978763045030833712326162883810638120029378337092938662174119747687899484603628344079493556601422498405360731958162719296160584042671057160241284852522913676264596201906163
#m1=90009974341452243216986938028371257528604943208941176518717463554774967878152694586469377765296113165659498726012712288670458884373971419842750929287658640266219686646956929872115782173093979742958745121671928568709468526098715927189829600497283118051641107305128852697032053368115181216069626606165503465125725204875578701237789292966211824002761481815276666236869005129138862782476859103086726091860497614883282949955023222414333243193268564781621699870412557822404381213804026685831221430728290755597819259339616650158674713248841654338515199405532003173732520457813901170264713085107077001478083341339002069870585378257051150217511755761491021553239
#m2=487443985757405173426628188375657117604235507936967522993257972108872283698305238454465723214226871414276788912058186197039821242912736742824080627680971802511206914394672159240206910735850651999316100014691067295708138639363203596244693995562780286637116394738250774129759021080197323724805414668042318806010652814405078769738548913675466181551005527065309515364950610137206393257148357659666687091662749848560225453826362271704292692847596339533229088038820532086109421158575841077601268713175097874083536249006018948789413238783922845633494023608865256071962856581229890043896939025613600564283391329331452199062858930374565991634191495137939574539546

解题分析:

根据代码可以知道flag进行了切片,等分为F1和F2,构成了c1和c2

c1 = F1 + F2
c2 = pow(F1, 3) + pow(F2, 3)

那么先把c1和c2求出来,把N分解一下(直接利用因式分解工具即可)得到:

p=797862863902421984951231350430312260517773269684958456342860983236184129602390919026048496119757187702076499551310794177917920137646835888862706126924088411570997141257159563952725882214181185531209186972351469946269508511312863779123205322378452194261217016552527754513215520329499967108196968833163329724620251096080377747699
q=797862863902421984951231350430312260517773269684958456342860983236184129602390919026048496119757187702076499551310794177917920137646835888862706126924088411570997141257159563952725882214181185531209186972351469946269508511312863779123205322378452194261217016552527754513215520329499967108196968833163329724620251096080377748737a

按照RSA解密流程即可解出c1和c2

现在的问题就是如何解方程组了,这里利用到python的sympy模块(真的很方便)

Python 中的Sympy详细介绍_python sympy-CSDN博客

#解方程组
#定义变量
x=sympy.Symbol('x')
y=sympy.Symbol('y')
f1=x+y-3#方程式,x+y-3=0
f2=x-y+5
sympy.solve([f1,f2],[x,y])

利用模块解出方程组,得到F1和F2,拼接得到flag

解密代码:

from Crypto.Util.number import *
from gmpy2 import *
import sympy
N=636585149594574746909030160182690866222909256464847291783000651837227921337237899651287943597773270944384034858925295744880727101606841413640006527614873110651410155893776548737823152943797884729130149758279127430044739254000426610922834573094957082589539445610828279428814524313491262061930512829074466232633130599104490893572093943832740301809630847541592548921200288222432789208650949937638303429456468889100192613859073752923812454212239908948930178355331390933536771065791817643978763045030833712326162883810638120029378337092938662174119747687899484603628344079493556601422498405360731958162719296160584042671057160241284852522913676264596201906163
m1=90009974341452243216986938028371257528604943208941176518717463554774967878152694586469377765296113165659498726012712288670458884373971419842750929287658640266219686646956929872115782173093979742958745121671928568709468526098715927189829600497283118051641107305128852697032053368115181216069626606165503465125725204875578701237789292966211824002761481815276666236869005129138862782476859103086726091860497614883282949955023222414333243193268564781621699870412557822404381213804026685831221430728290755597819259339616650158674713248841654338515199405532003173732520457813901170264713085107077001478083341339002069870585378257051150217511755761491021553239
m2=487443985757405173426628188375657117604235507936967522993257972108872283698305238454465723214226871414276788912058186197039821242912736742824080627680971802511206914394672159240206910735850651999316100014691067295708138639363203596244693995562780286637116394738250774129759021080197323724805414668042318806010652814405078769738548913675466181551005527065309515364950610137206393257148357659666687091662749848560225453826362271704292692847596339533229088038820532086109421158575841077601268713175097874083536249006018948789413238783922845633494023608865256071962856581229890043896939025613600564283391329331452199062858930374565991634191495137939574539546
p=797862863902421984951231350430312260517773269684958456342860983236184129602390919026048496119757187702076499551310794177917920137646835888862706126924088411570997141257159563952725882214181185531209186972351469946269508511312863779123205322378452194261217016552527754513215520329499967108196968833163329724620251096080377747699
q=797862863902421984951231350430312260517773269684958456342860983236184129602390919026048496119757187702076499551310794177917920137646835888862706126924088411570997141257159563952725882214181185531209186972351469946269508511312863779123205322378452194261217016552527754513215520329499967108196968833163329724620251096080377748737
e= 0x10001
phi=(p-1)*(q-1)
d=invert(e,phi)
c1=pow(m1,d,N)
c2=pow(m2,d,N)

# 解方程组c1 = F1 + F2
#      c2 = pow(F1, 3) + pow(F2, 3)
F1 = sympy.Symbol('F1')  # 方程组定义变量
F2 = sympy.Symbol('F2')
f1 = F1 + F2 - c1
f2 = pow(F1, 3) + pow(F2, 3) - c2
result = sympy.solve([f1, f2], [F1, F2])

flag1 = long_to_bytes(result[0][1])
flag2 = long_to_bytes(result[0][0])
flag = flag1 + flag2
print(flag)

#b'30ca8972959a1033b2}GWHT{f709e0e2cfe7e5'这个是顺序错误的结果

答案:flag{f709e0e2cfe7e530ca8972959a1033b2}

[ACTF新生赛2020]crypto-rsa3

题目:

from flag import FLAG
from Cryptodome.Util.number import *
import gmpy2
import random

e=65537
p = getPrime(512)
q = int(gmpy2.next_prime(p))
n = p*q
m = bytes_to_long(FLAG)
c = pow(m,e,n)
print(n)
print(c)

# 177606504836499246970959030226871608885969321778211051080524634084516973331441644993898029573612290095853069264036530459253652875586267946877831055147546910227100566496658148381834683037366134553848011903251252726474047661274223137727688689535823533046778793131902143444408735610821167838717488859902242863683
# 1457390378511382354771000540945361168984775052693073641682375071407490851289703070905749525830483035988737117653971428424612332020925926617395558868160380601912498299922825914229510166957910451841730028919883807634489834128830801407228447221775264711349928156290102782374379406719292116047581560530382210049

解题分析:

这道题其实很简单,根据代码中的q是p的下一个素数可以知道p,q相差不大

因此直接对n开根号,判断一下是否为素数,如果不是则取其下一个素数,这个素数即为p

q=n//p

p和q求出后,按照正常RSA解密即可

解密代码:

from Crypto.Util.number import *
from gmpy2 import *
import sympy
n=177606504836499246970959030226871608885969321778211051080524634084516973331441644993898029573612290095853069264036530459253652875586267946877831055147546910227100566496658148381834683037366134553848011903251252726474047661274223137727688689535823533046778793131902143444408735610821167838717488859902242863683
c=1457390378511382354771000540945361168984775052693073641682375071407490851289703070905749525830483035988737117653971428424612332020925926617395558868160380601912498299922825914229510166957910451841730028919883807634489834128830801407228447221775264711349928156290102782374379406719292116047581560530382210049
e=65537
p1=iroot(n,2)[0]
print(p1,isPrime(p1))
p=next_prime(p1)
q=n//p
phi=(p-1)*(q-1)
d=invert(e,phi)
m=pow(c,d,n)
print(long_to_bytes(m))

答案:flag{p_and_q_should_not_be_so_close_in_value}

[NPUCTF2020]这是什么觅🐎

解题分析:

首先拿到手的文件没有拓展名,说明文件损坏了,需要我们给它加上后缀(好的,到了这里就不会了,不知道怎么去分析,看了wp我懂了)

那么先用记事本打开看一下,一堆乱码,不过看到了flag.jpg,那么试一下改成.jpg,不行

接着用Win Hex查看一下,发现和之前zip伪加密很像,于是后缀改成.zip,可以打开,正确

打开后是一张图片

根据下面的纸条猜测类似矩阵查找,’1‘被划掉了不知道要不要算在矩阵中,就两种情况都写出来,得到:

['3', '1', '12', '5', '14', '4', '1', '18']->calendar
['3', '8', '12', '5', '14', '4', '8', '18']->chlendhr

可以看到数字都比较小,不超过26,对应字母表试下,得到答案(’1‘要算在矩阵中)

答案:flag{calendar}

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值