bmzctf-crypto writeup(一) (持续更新)

4进制

4进制转16进制,再转字符串。

2018 AFCTF Morse

摩斯电码解密得16进制。

16进制转字符串得flag。

2018 HEBTUCTF 社会主义接班人

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

这是社会主义编码,解码工具:https://atool.vip/corevalue/

Ook!

这是Ook编码。解密工具:Brainfuck/Ook! Obfuscation/Encoding [splitbrain.org]

栅栏密码

栅栏中的base

4C4A5645455232524B3533544B544C4C4A5A5545324D434749564E48553344474A564548495A53524E595944323D3D3D

给了16进制,先16进制转字符串,得base32。

base32解码得base64。

base64解码得栅栏密码。

栅栏密码解密,组数为5,得flag。

easy_base

题目说影分身之术*40,也就是说,base加密了40次。

解密:BASE64加密解密 点上40次也不是很久。

2018 HEBTUCTF Sudoku&Viginere

做数独,做出来才能得到维吉尼亚的密码。

数独就是每个单元格所在行所在列,该字符都是唯一的。

做出来了但是不知道密码在哪里,看到维吉尼亚的数字,应该是每个分组指向一个字符,合起来就是密码。如45指向1,4行5列。以此类推....得到15_1t_3a5y

这就是flag,但是要加上HEBTUCTF{},题目没说明。

CRC32 BOOM

给了一个三个文件。

因为1.txt和2.txt比较小,可以爆破。flag.jpg估计是用爆破出来的crc32再去爆破它。

爆破脚本:https://github.com/theonlypwner/crc32

这里爆破出来的是文件内容,并不是压缩包的密码。

把两个文件爆破的结果进行组合,制作成爆破flag.jpg的字典。

dic = []
# 已t1开头,t2结尾的字典
for k in range((len(t1)+len(t2))):
for i in t1:
for j in t2:
dic.append(i+j)
# 已t1开头,t2结尾的字典
for k in range((len(t1)+len(t2))):
for i in t2:
for j in t1:
dic.append(i+j)
print(dic)

with open('dic.txt','w') as f:
for i in dic:
f.write(i+'\n')

然后使用archpr等工具进行字典爆破,或者ziperello。

把解密出来的flag.jpg扔进16进制工具看到flag,这个图片估计是损坏的。

看键盘

ujn njkm ijnmhjk fgtrdcv tgvgy njkm hjuygbn ijnmhjk

实际上,就是在键盘上,安装这个字母比划,每组就是划一个单词,第一个ujn是比划i,njkm是比划n,第三个是比划t,一次类推,最后是Internet。

可怜的RSA

给了两个文件,flag.enc是加密后的密文,public.key是公钥文件。

相当于我们知道了c,n,e。n和e可以从公钥文件中分离出来。

分离方法:yafu工具。

即分离出来q,p,n=q*p。

接下来需要求私钥d。知道e,n就可以求d。

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

到这里就知道了n , e , d , q , p , c(密文c只是base64加密了而已)

本来这里pow(c, d, n)就可以出来了,但是c 和n 长度一样,明文空间m和密文空间c都必须满足0<c<n-1,所以这里需要对密文c进行分组来求,有点麻烦,而PKCS1_OAEP这个库可以padding,就直接用。

脚本:

import base64
from Crypto.Cipher import PKCS1_OAEP
from Crypto.PublicKey import RSA
import gmpy2

# 分离公钥文件,求n ,e。也可以使用openssl:openssl rsa -pubin -text -modulus -in pubkey.pem
f = open('C:\\Users\\n0r1and3r\\Desktop\\RSA\\public.key','rb').read()
pub = RSA.importKey(f)
n = pub.n
e = pub.e

# 大素数分解,yafu工具
p = 3133337
q = 25478326064937419292200172136399497719081842914528228316455906211693118321971399936004729134841162974144246271486439695786036588117424611881955950996219646807378822278285638261582099108339438949573034101215141156156408742843820048066830863814362379885720395082318462850002901605689761876319151147352730090957556940842144299887394678743607766937828094478336401159449035878306853716216548374273462386508307367713112073004011383418967894930554067582453248981022011922883374442736848045920676341361871231787163441467533076890081721882179369168787287724769642665399992556052144845878600126283968890273067575342061776244939

# 得到私钥d
d = gmpy2.invert(e,(q-1)*(p-1))

key_info = RSA.construct((n,e,int(d),p,q))
key = RSA.importKey(key_info.exportKey())
key = PKCS1_OAEP.new(key)

# 读密文
f1 = open('C:\\Users\\n0r1and3r\\Desktop\\RSA\\flag.enc','rb').read()
C = base64.b64decode(f1)
flag = key.decrypt(C)
print(flag)

small_RSA

给了一个加密脚本:

# -*- coding: utf-8 -*-

from Crypto.PublicKey import RSA

import libnum

import uuid

flag = "flag{***************}"

rsa = RSA.generate(4096,e=3)

p = rsa.p

d = rsa.d

e = rsa.e

N = rsa.n

m = libnum.s2n(flag)

c = pow(m, e, N)

print "[+]c:",c

print "[+]N:",N

'''

[+]c: 3442467842482561323703237574537907554035337622762971103210557480050349359873041624336261782731509068910003360547049942482415036862904844600484976674423604861710166033558576921438068555951948966099658902606725292551952345193132973996288566246138708754810511646811362017769063041425115712305629748341207792305694590742066971202523405301561233341991037374101265623265332070787449332991792097090044761973705909217137119649091313457206589803479797894924402017273543719924849592070328396276760381501612934039653

[+]N: 691316677109436623113422493782665795857921917893759942123087462879884062720557906429183155859597756890896192044003240821906332575292476160072039505771794531255542244123516929671277306361467074545720823735806308003091983427678300287709469582282466572230066580195227278214776280213722215953097747453437289734469454712426107967188109548966907237877840316009828476200388327329144783877033491238709954473809991152727333616022406517443130542713167206421787038596312975153165848625721911080561242646092299016802662913017071685740548699163836007474224715426587609549372289181977830092677128368806113131459831182390520942892670696447128631485606579943885812260640805756035377584155135770155915782120025116486061540105139339655722904721294629149025033066823599823964444620779259106176913478839370100891213072100063101232635183636552360952762838656307300621195248059253614745118852163569388418086291748805100175008658387803878200034840215506516715640621165661642177371863874586069524022258642915100615596032443145034847031564356671559179212705466145609698475546210994748949121359853094247990533075004393534565421776468785821261291309463205314057882016266066365636018084499158806717036972590848458891019171583268920180

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值