BUUCTF 几道crypto WP

[AFCTF2018]Morse

  • 简单的莫尔斯密码,最直观的莫尔斯密码是直接采用空格分割的点和划线,这题稍微绕了一下使用的是斜杠来划分

    所以首先将斜杠全部替换为空格,然后在在线解密莫尔斯密码,得到一串16进制最后在16进制转字符串即可

[GUET-CTF2019]BabyRSA

  • 给出以下条件

  • 这里直接给出欧拉函数,以及p+q的结果,我们知道要想求解m=pow(c,d,n),而这里d的问题已经是直接给出的,

    所以剩下就是n的求解,n这里只要把欧拉函数展开在和p+q进行运算即可得到
  • (p+1)(q+1)=pq+(p+q)+1 => n=pq=(p-1)(q-1)-(p+q)-1
  • 所以最终exp如下:
# -*- coding:utf-8 -*-
# Author : Konmu
# k=p+q
# phi=(p+1)(q+1) from Crypto.Util.number import long_to_bytes k=int('0x1232fecb92adead91613e7d9ae5e36fe6bb765317d6ed38ad890b4073539a6231a6620584cea5730b5af83a3e80cf30141282c97be4400e33307573af6b25e2ea',16)
phi=int('0x5248becef1d925d45705a7302700d6a0ffe5877fddf9451a9c1181c4d82365806085fd86fbaab08b6fc66a967b2566d743c626547203b34ea3fdb1bc06dd3bb765fd8b919e3bd2cb15bc175c9498f9d9a0e216c2dde64d81255fa4c05a1ee619fc1fc505285a239e7bc655ec6605d9693078b800ee80931a7a0c84f33c851740',16)
e=int('0xe6b1bee47bd63f615c7d0a43c529d219',16)
d=int('0x2dde7fbaed477f6d62838d55b0d0964868cf6efb2c282a5f13e6008ce7317a24cb57aec49ef0d738919f47cdcd9677cd52ac2293ec5938aa198f962678b5cd0da344453f521a69b2ac03647cdd8339f4e38cec452d54e60698833d67f9315c02ddaa4c79ebaa902c605d7bda32ce970541b2d9a17d62b52df813b2fb0c5ab1a5',16)
c=int('0x50ae00623211ba6089ddfae21e204ab616f6c9d294e913550af3d66e85d0c0693ed53ed55c46d8cca1d7c2ad44839030df26b70f22a8567171a759b76fe5f07b3c5a6ec89117ed0a36c0950956b9cde880c575737f779143f921d745ac3bb0e379c05d9a3cc6bf0bea8aa91e4d5e752c7eb46b2e023edbc07d24a7c460a34a9a',16) n=phi-k-1
m=pow(c,d,n)
print(long_to_bytes(m))

[NCTF2019]Keyboard

  • 这题说实话,算作密码的题目有点牵强感觉,脑洞有点多,感觉更加偏向misc的类型
  • 首先密文中给出的字母观察之后发现全是键盘字母键的第一行(从上向下看),并且每一个都按序对应了数字键

    q->1,w->2,e->3,r->4...
  • 其次发现密文中字母重复的次数全是在1-4次,故而猜测是手机九宫格密码

  • 接下来的解决方法两种,一种是手动写,一种是编写脚本
  • 我写的exp如下:
# -*- coding:utf-8 -*-
# Author : Konmu
# [NCTF2019]Keyboard chiper='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'
chiper=chiper.split(' ') keys=['q','w','e','r','t','y','u','i','o']
values=[1,2,3,4,5,6,7,8,9]
dicts=dict(zip(keys,values)) jiugongge=[' ','abc','def','ghi','jkl','mno','pqrs','tuv','wxyz']
new_dicts=dict(zip(values,jiugongge)) for i in range(len(chiper)):
temp=dicts.get(chiper[i][0])
print(''.join(new_dicts[temp][len(chiper[i])-1]),end='')

[HDCTF2019]bbbbbbrsa

  • 这题有个坑的地方就是,一开始没注意他导入库的时候把b64encode重命名成了b32encode,剩下来要解决的问题就是e的求解

    这里这题是取得50000-70000之间的随机与phi互素的数,解决方法也很简单,直接在这个范围内爆破就行了
  • 第二个坑点就是,由于不是直接参赛时做题,所以对于flag的格式并不了解,只好一个个尝试

    (这里你可能会想BUUCTF平台不是告诉你格式了吗?答:由于好多题的最终答案都是改了格式的,所以到底是不是flag{}包裹的,真不好确定இ௰இ)
  • exp示例:
# -*- coding:utf-8 -*-
# Author: Konmu from base64 import b64decode
import gmpy2
from Crypto.Util.number import long_to_bytes p=177077389675257695042507998165006460849
q=211330365658290458913359957704294614589
n=37421829509887796274897162249367329400988647145613325367337968063341372726061
c='==gMzYDNzIjMxUTNyIzNzIjMyYTM4MDM0gTMwEjNzgTM2UTN4cjNwIjN2QzM5ADMwIDNyMTO4UzM2cTM5kDN2MTOyUTO5YDM0czM3MjM'
c=int(b64decode(c[::-1]))
phi=(p-1)*(q-1) for e in range(50000,70000):
if(gmpy2.gcd(e,phi)==1):
d=int(gmpy2.invert(e,phi))
m=pow(c,d,n)
if 'flag{' in long_to_bytes(m):
print(long_to_bytes(m))

鸡藕椒盐味

  • 这题谐音提示奇偶校验位,但实际感觉应该不是奇偶校验码,准确来说应该是个汉明码的奇偶校验分组码

    当监督位为:0000,接收方生成的校验位和收到的校验位相同,否则不同说明出错,所以这题就变成了解决汉明码的校验纠错问题
  • 汉明码纠错分为以下几步,首先根据公式:\(2^r\geq k+r+1\)(k表示数据位数,r表示校验位数,r要是最小的符合不等式的值)

    根据给出的汉明码1100 1010 0000共十二位,说明k+r=12,则大于13的最小r应为4,故k数据位为8
  • 确定共4位校验位,且校验位的排放位置只能在\(2^n\)的位置上,所以确定汉明码中的\(P_1,P_2,P_4,P_8\)这几个位置是校验位

    那么将其剔出后的即为数据k(1100 0100)
  • 又题中说顺序倒了一下,说明正确的数据应该是0000 0010 0011,则剔出后有效数据为0010 0011
  • 到这里已经得到了正确的数据,所以剩下就是求出校验位指出的错误位



    注:\(P_1,P_2,P_4,P_8\)的数据填写其二进制的首位,得到发送方校验码:1000
  • 计算\(P_1,P_2,P_4,P_8\)

    \(P_4=D_5\bigoplus D_6\bigoplus D_7\bigoplus D_8=0\bigoplus 0\bigoplus 1\bigoplus 1=0\)

    \(P_3=D_2\bigoplus D_3\bigoplus D_4\bigoplus D_8=0\bigoplus 1\bigoplus 0\bigoplus 1=0\)

    \(P_2=D_1\bigoplus D_3\bigoplus D_4\bigoplus D_6\bigoplus D_7=0\bigoplus 1\bigoplus 0\bigoplus 0\bigoplus 1=0\)

    \(P_1=D_1\bigoplus D_2\bigoplus D_4\bigoplus D_5\bigoplus D_7=0\bigoplus 0\bigoplus 0\bigoplus 0\bigoplus 1=1\)

    注:以上计算说明:以\(P_4\)为例,其检验位检验的是所有二进制(从左到右)第1位为一的数据,即\(D_5,D_6,D_7,D_8\)
  • 由检验结果可得接收方校验码:0001
  • 接收和发送校验码不一致,说明有错,将其取反即可

    最终数据是:1101 1010 0000,将其用python md5算一下即可

[HDCTF2019]basic rsa

  • 最基本的RSA
  • exp示例:
# -*- coding:utf-8 -*-
# Author: Konmu
# [HDCTF2019]basic rsa
import gmpy2
from Crypto.Util.number import * p=262248800182277040650192055439906580479
q=262854994239322828547925595487519915551
e=65533
n=p*q
c=27565231154623519221597938803435789010285480123476977081867877272451638645710
phi=(p-1)*(q-1) d=int(gmpy2.invert(e,phi))
m=pow(c,d,n) print(long_to_bytes(m))

浪里淘沙

  • 看到密文全是一些单词的重复,所以想到词频统计,首先获取每个单词出现的频率,然后按序排列,最后将排在4,8,11,15,16的单词进行拼接即可
  • exp:
# -*- coding:utf-8 -*-
# Author: Konmu f=open("C:/Users/xxx/Desktop/浪里淘沙.txt",'r')
data=f.read() statistics={}
frequency=[]
num=[4,8,11,15,16]
def zipin(lsit):
for i in lsit:
statistics.setdefault(data.count(i),str(i))
frequency.append(data.count(i))
frequency.sort()
for i in num:
print(''.join(statistics.get(frequency[i-1])),end='')
print('\n')
return(statistics) if __name__ == '__main__':
letters=["tonight","success","notice","example","should","crypto","backspace","learn","found","morning","we","system","sublim","the","user","enter"]
print(zipin(letters))

BUUCTF Crypto的更多相关文章

  1. BUUCTF CRYPTO部分题目wp

    对密码学了解不多,做一下熟悉熟悉 1,看我回旋踢 给的密文synt{5pq1004q-86n5-46q8-o720-oro5on0417r1} 简单的凯撒密码,用http://www.zjslove. ...

  2. BUUCTF 部分wp

    目录 Buuctf crypto 0x01传感器 提示是曼联,猜测为曼彻斯特密码 wp:https://www.xmsec.cc/manchester-encode/ cipher: 55555555 ...

  3. BUUCTF Crypto_WP(2)

    BUUCTF Crypto WP 几道密码学wp [GXYCTF2019]CheckIn 知识点:Base64,rot47 下载文件后,发现一个txt文件,打开发现一串base64,界面之后出现一串乱 ...

  4. 什么是RSA

    一.RSA引入: RSA是什么,嗯,这是一个好问题,有没有兴趣啊 二.RSA的解释: RSA是一种加密方式,它是现代密码学的代表(什么是现代密码学,这个吗,我感觉就是我们所使用的密码的加密的方式之一可 ...

  5. javax.crypto.BadPaddingException: Given final block not properly padded 解决方法

    下面的 Des 加密解密代码,在加密时正常,但是在解密是抛出错误: javax.crypto.BadPaddingException: Given final block not properly p ...

  6. 使用crypto模块实现md5加密功能(解决中文加密前后端不一致的问题)

    正常情况下使用md5加密 var crypto = require('crypto'); var md5Sign = function (data) { var md5 = crypto.create ...

  7. javax.crypto.BadPaddingException: Given final block not properly padded

    一.报错 写了一个加密方法,在Windows上运行没有问题,在Linux上运行时提示如下错误: javax.crypto.BadPaddingException: Given final block ...

  8. Liunx-https-java.lang.NoClassDefFoundError: javax/crypto/SunJCE_b

    错误信息: java.lang.NoClassDefFoundError: javax/crypto/SunJCE_b at javax.crypto.KeyGenerator.a(DashoA13* ...

  9. node crypto md5加密,并解决中文不相同的问题

    在用crypto模块时碰到了加密中文不相同的问题,多谢群里面@蚂蚁指定 1:解决中文不同的问题 function md5Pay(str) { str = (new Buffer(str)).toStr ...

随机推荐

  1. 金钱货币用什么类型--(Java)

    0.前言 项目中,基本上都会涉及到金钱:那么金钱用什么数据类型存储呢? 不少新人都会认为用double,因为它是双精度类型啊,或者float, 其实,float和double都是不能用来表示精确的类型 ...

  2. Java:手写幼儿园级线程安全LRU缓存X探究影响命中率的因素

    最近遇到一个需求,需要频繁访问数据库,但是访问的内容只是 id + 名称 这样的简单键值对. 频繁的访问数据库,网络上和内存上都会给数据库服务器带来不小负担. 于是打算写一个简单的LRU缓存来缓存这样 ...

  3. OpenWrt(LEDE)2020.4.12编译 UnPnP+NAS+多拨+网盘+DNS优化+帕斯沃 无缝集成

    固件说明 基于Lede OpenWrt R2020.4.8版本(源码截止2020.4.12)Lienol Feed及若干自行维护的软件包 结合家庭x86软路由场景需要定制 按照家庭应用场景对固件及软件 ...

  4. python学习(11)文件的读写操作

    1.读文件的7种操作模式 操作模式 具体含义 'r' 读取 (默认) 'w' 写入(会先截断之前的内容) 'x' 写入,如果文件已经存在会产生异常 'a' 追加,将内容写入到已有文件的末尾 'b' 二 ...

  5. [c++ IO加速]快速输入输出

    自己封装的FastIO类,效率虽有所损失,不过实用性提高很多. 测试,写10000000个整数(86M): printf 2.7s cout 27s FastIO 1s 测试,读10000000个整数 ...

  6. JPA 分页处理

    1.要实现jpa分页管理首先得要正确配置jpa环境,在spring环境中的配置如下: 开启注解功能 <bean class="org.springframework.orm.jpa.s ...

  7. 使用反射模拟struts2属性注入功能

    1.在项目开发中,如果没有使用框架进行数据绑定与封装,则可能会写大量的类似下面的代码: String value=request.getParameter("v"); if(nul ...

  8. webpack 中,module,chunk 和 bundle 的区别是什么?

    前两天为了优化公司的代码打包项目,恶补了很多 webpack4 的知识.要是放在几年前让我学习 webpack 我肯定是拒绝的,之前看过 webpack 的旧文档,比我们内部项目的文档还要简陋. 但是 ...

  9. Apache Hudi典型应用场景知多少?

    1.近实时摄取 将数据从外部源如事件日志.数据库提取到Hadoop数据湖 中是一个很常见的问题.在大多数Hadoop部署中,一般使用混合提取工具并以零散的方式解决该问题,尽管这些数据对组织是非常有价值 ...

  10. elasticsearch 小总结

    elasticsearch 小总结 0. 起因 距离初次写关于es的文章 https://blog.csdn.net/aca_jingru/article/details/44488703 已经过去4 ...