CryptoCTF easy

news/2024/5/20 0:14:48 标签: 密码学, 安全, ctf

文章目录

  • 2023
    • suction
    • Blue Office
  • 2022
    • Baphomet

2023

suction

题目描述:

from Crypto.Util.number import *
from flag import flag

def keygen(nbit, r):
	while True:
		p, q = [getPrime(nbit) for _ in '__']
		e, n = getPrime(16), p * q
		phi = (p - 1) * (q - 1)
		if GCD(e, phi) == 1:
			N = bin(n)[2:-r]
			E = bin(e)[2:-r]
			PKEY = N + E
			pkey = (n, e)
			return PKEY, pkey

def encrypt(msg, pkey, r):
	m = bytes_to_long(msg)
	n, e = pkey
	c = pow(m, e, n)
	C = bin(c)[2:-r]
	return C

r, nbit = 8, 128
PKEY, pkey = keygen(nbit, r)
print(f'PKEY = {int(PKEY, 2)}')
FLAG = flag.lstrip(b'CCTF{').rstrip(b'}')
enc = encrypt(FLAG, pkey, r)
print(f'enc = {int(enc, 2)}')

题目分析:
给出了n,e,c且每个都是少最后8bit
n - 256bit,e - 16bit,由于都比较小,可直接爆破出来
n这里用factor()分解,若最后分解得到的是两个数,并且都是128bit,那么p,q,n都可以确定了
n出来了那之后再爆e和c,256 * 256,也不大,最后通过得到的flag是否都为可打印字符来判断flag是否正确

from Crypto.Util.number import *
from gmpy2 import *
PKEY = 55208723145458976481271800608918815438075571763947979755496510859604544396672
ENC = 127194641882350916936065994389482700479720132804140137082316257506737630761 << 8
n_ = int(bin(PKEY)[2:-8],2) << 8
e_ = int(bin(PKEY)[-8:],2) << 8

# for i in range(45,256):
#     print(i)
#     n = n_ + i
#     if n % 2 == 0:
#         continue
#     a = factor(n)
#     if len(a) == 2:
#         print(n,a,i) # 69

n = 55208723145458976481271800608918815438075571763947979755496510859604544396613 
p = 188473222069998143349386719941755726311
q = 292926085409388790329114797826820624883
phi = (p - 1) * (q - 1)
for i in range(256):
    e = e_ + i
    if not isPrime(e):
        continue
    for j in range(256):
        c = ENC + j
        d = inverse(e,phi)
        m = pow(c,d,n)
        flag = long_to_bytes(int(m))
        if flag.isascii():
            print(flag)
# CCTF{6oRYGy&Dc$G2ZS}  

Blue Office

题目描述:

import binascii
from secret import seed, flag

def gen_seed(s):
    i, j, k = 0, len(s), 0
    while i < j:
        k = k + ord(s[i])
        i += 1
    i = 0
    while i < j:
        if (i % 2) != 0:
            k = k - (ord(s[i]) * (j - i + 1))
        else:
            k = k + (ord(s[i]) * (j - i + 1))

        k = k % 2147483647
        i += 1

    k = (k * j) % 2147483647
    return k

def reseed(s):
    return s * 214013 + 2531011

def encrypt(s, msg):
    assert s <= 2 ** 32
    c, d = 0, s
    enc, l = b'', len(msg)
    while c < l:
        d = reseed(d)
        enc += (msg[c] ^ ((d >> 16) & 0xff)).to_bytes(1, 'big')
        c += 1
    return enc

enc = encrypt(seed, flag)
print(f'enc = {binascii.hexlify(enc)}')

题目分析:
gen_seed()压根没用到呀,感觉是用来耗时间的,有些人喜欢顺着看下来,看完之后才发现这串没用,但时间也过去了。所以还是从加密那里看起吧。
步入正题
主要在下面两串
d = reseed(d)
enc += (msg[c] ^ ((d >> 16) & 0xff)).to_bytes(1, 'big')
第一串LCG,第二串flag的其中一个字节和d的第16-24位(1个字节)异或。assert s <= 2 ** 32表明s应该在32位左右,但我们只需用到24位,所以可以把这个运算看成GF(2 ** 24)下的运算,flag的格式固定CCTF{},故通过异或运算可以得到seed的第16-24位,还16位未知,不大直接爆破,之后flag也就出来了

import binascii
enc = 'b0cb631639f8a5ab20ff7385926383f89a71bbc4ed2d57142e05f39d434fce'
enc = binascii.unhexlify(enc)
flag = b'CCTF{'

def reseed(s):
    return s * 214013 + 2531011

def encrypt(s, msg):
    assert s <= 2 ** 32
    c, d = 0, s
    enc, l = b'', len(msg)
    while c < l:
        d = reseed(d)
        enc += (msg[c] ^ ((d >> 16) & 0xff)).to_bytes(1, 'big')
        c += 1
    return enc

s1 = (enc[0] ^ flag[0]) << 16

for i in range(2 ** 16):
    seed = s1 + i
    flag = encrypt(seed,enc[1:])
    if b'CTF' in flag:
        print(flag)
# CCTF{__B4ck_0r!F1c3__C1pHeR_!!}

2022

Baphomet

题目描述:

from base64 import b64encode
from flag import flag

def encrypt(msg):
	ba = b64encode(msg.encode('utf-8'))
	baph, key = '', ''

	for b in ba.decode('utf-8'):
		if b.islower():
			baph += b.upper()
			key += '0'
		else:
			baph += b.lower()
			key += '1'

	baph = baph.encode('utf-8')
	key = int(key, 2).to_bytes(len(key) // 8, 'big')

	enc = b''
	for i in range(len(baph)):
		enc += (baph[i] ^ key[i % len(key)]).to_bytes(1, 'big')

	return enc

enc = encrypt(flag)
f = open('flag.enc', 'wb')
f.write(enc)
f.close()

题目分析:
密文长度为48,说明key长度为6(字节)
CCTF{40bit,大于6 * 6base64以6字节分组加密)
故可知baph前6位q0nurN,与密文前6位异或得到key
key和密文都知道,异或便可得到完整flag

未完待续…


http://www.niftyadmin.cn/n/5052874.html

相关文章

Unity实现设计模式——命令模式

Unity实现设计模式——命令模式 推荐一个Unity学习设计模式很好的GitHub地址&#xff1a;https://github.com/QianMo/Unity-Design-Pattern 有非常多的Star 一、介绍 命令模式使得请求的发送者与请求的执行者之间消除耦合&#xff0c;让对象之间的调用关系更加灵活。在命令模…

2023-09-26 mysql-代号m-mdb和mysql对于db,schema,table,user,role之间的关系-分析要点

摘要: mdb只支持单个数据库句柄, 无法同时打开两个数据库. 要对其做修改. 但是在修改mdb这块逻辑前, 必须对mdb数据库和mysql数据库的相关的基础概念了解的足够清晰. mdb要分析的点: user,role,schema,db之间的关系database在mdb中承担的作用, db与其他模块间的关系database与…

用于自然语言处理的 Python:理解文本数据

一、说明 Python是一种功能强大的编程语言&#xff0c;在自然语言处理&#xff08;NLP&#xff09;领域获得了极大的普及。凭借其丰富的库集&#xff0c;Python 为处理和分析文本数据提供了一个全面的生态系统。在本文中&#xff0c;我们将介绍 Python for NLP 的一些基础知识&…

数据结构 - 线段树的运用

数据结构 - 线段树的运用 前言一. 线段树的运用1.1 区间和 - 线段树节点的成员变量1.2 线段树的构建1.3 线段树的区间和查询1.4 线段树的区间和更新1.5 完整代码 二. 线段树的动态扩建2.1 向下递推2.2 向上递推2.3 更新操作2.4 查询操作2.5 完整代码 三. 线段树的使用案例3.1 定…

VEX —— Functions|Math

目录 sign —— 返回给定数的符号标签 abs —— 返回绝对值 avg —— 返回平均值 sum —— 求和 max —— 返回最大值 min —— 返回最小值 rint —— 返回四舍五入后的整数 ceil —— 返回最近的最大整数 floor —— 返回最近的最小整数 frac —— 返回浮点值的小数…

mysql中sql语法使用

sql 语句主要分为下面三种 DDL 数据定义语言包含数据库及其对象的语句。 DML 数据操作语言&#xff0c;包含允许更新和查询数据的语句&#xff08;查询语句还可分为DQL&#xff09; DCL 数据控制语言允许授予用户访问数据库中特定数据的权限 DDL 数据库操作 创建数据库 DDL …

OpenCV实现FAST算法角点检测 、ORB算法特征点检测

目录 1 Fast算法 1.1 Fast算法原理 1.2 实现办法 1.2.1 机器学习的角点检测器 1.2.2 非极大值抑制 1.3 代码实现 1.4 结果展示 2 &#xff0c;ORB算法 2.1代码实现 2.2 结果展示 1 Fast算法 1.1 Fast算法原理 1.2 实现办法 1.2.1 机器学习的角点检测器 1.2.2 …

自动驾驶领域中的CMS系统应用探讨

由佐思汽研主办的“ ICVS汽车智能网联大会”正式启幕&#xff0c;邀请Tier1、软件供应商、操作系统商、智能驾驶及智能驾舱相关企业&#xff0c;共同探讨行业现状、创新技术应用交流、以及未来行业发展趋势等。 赛格导航视频产品线总监刘玉龙应邀参加本次大会&#xff0c;并发…