BUUCTF-密码学2

1.Quoted-printable

由题目我们可以知道是Quoted-printtable的解码方式

由此可以得到flag:flag{那你也很棒哦}

2.Rabbit

由题目可以知道这是rabbit解码http://www.jsons.cn/rabbitencrypt/

我们可以得到flag:flag{Cute_Rabbit}

3.篱笆墙的影子

由题意我们可以猜测这是一个栅栏加密因此我们尝试使用栅栏密码进行解密

栅栏数需要们我自己尝试

因此flag为flag{wethinkwehavetheflag}

4.RSA

由题意可知是一个简单的RSA

因为是要求d那么我们需要先求出n值再根据n值和phi值最后去求出d值

import math

def egcd(a, b):
    if a == 0:
        return (b, 0, 1)
    else:
        g, y, x = egcd(b % a, a)
        return (g, x - (b // a) * y, y)

def modinv(a, m):
    g, x, y = egcd(a, m)
    if g != 1:
        raise Exception('Modular inverse does not exist')
    else:
        return x % m

# 已知的参数
p = 473398607161
q = 4511491
e = 17

# 计算模数 n
n = p * q

# 计算欧拉函数 φ(n)
phi = (p - 1) * (q - 1)

# 计算私钥 d
d = modinv(e, phi)

print("Private key d is:", d)

我们通过上面的代码可以得到d值而题目中告诉我们只需要求d那么flag就是求出来的d

flag{125631357777427553}

5.丢失的MD5

打开下载文件发现是一个python脚本我们先运行一下

它提示我们最后一行代码print有问题我们将其修改过来之后在进行运算看看是否还有错误

证明还是有问题通过报错我们可知update() 函数需要传入一个字节串(byte-string),而不是普通的字符串。为了解决这个问题,我们需要将字符串编码为字节串而我们的Unicode为utf-8的展示形式所以我们给报错的位置加上这个

我们可以得到成功运行的代码修改的脚本如下

import hashlib   
for i in range(32,127):
    for j in range(32,127):
        for k in range(32,127):
            m=hashlib.md5()
            m.update('TASC'.encode('utf-8')+chr(i).encode('utf-8')+'O3RJMV'.encode('utf-8')+chr(j).encode('utf-8')+'WDJKX'.encode('utf-8')+chr(k).encode('utf-8')+'ZM'.encode('utf-8'))
            des=m.hexdigest()
            if 'e9032' in des and 'da' in des and '911513' in des:
                print(des)

因此flag为:flag{e9032994dabac08080091151380478a2}

6.Alice与Bob

由题目可以知道我们需要先将98554799767分解为两个素数我们通过代码可以得到这两个素数

def is_prime(n):
    if n <= 1:
        return False
    if n <= 3:
        return True
    if n % 2 == 0 or n % 3 == 0:
        return False
    i = 5
    while i * i <= n:
        if n % i == 0 or n % (i + 2) == 0:
            return False
        i += 6
    return True

def find_prime_factors(n):
    for i in range(2, n):
        if is_prime(i) and n % i == 0:
            return i, n // i

num = 98554799767
prime1, prime2 = find_prime_factors(num)
print("The two prime factors of", num, "are:", prime1, "and", prime2)

 得到的素数如下

再根据题意我们可以知道需要哈希32小因此我们可以得到答案

7.大帝的密码武器

我们通过题目可以猜测这是一到凯撒类型的题目

我们将题目中的拿出来进行凯撒在移动量来到13时就是一个有意义的单词那么我们可以确定这个加密的移动量为13

因此我们找到密文移动13的值即为答案

flag为:flag{PbzrPuvan}

8.rsarsa

有题目我们可以知道这道题目我们是要求m

我用ai写了一个求m的代码如下

import gmpy2

# 已知参数
p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
e = 65537
c = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034

# 计算模数 n
n = p * q

# 计算欧拉函数 φ(n)
phi_n = (p - 1) * (q - 1)

# 计算私钥 d
d = gmpy2.powmod(e, -1, phi_n)

# 解密密文得到明文
m = gmpy2.powmod(c, d, n)

print("The decrypted message m is:", m)

 由此我们可以知道flag:flag{5577446633554466577768879988}

9.Windows系统密码

我们可以看到他有一行时ctf我们继续观察这一行他每一段都是32位我们猜测这是一个md5加密所以我们放到md5解密的地方发现后一个刚好可以解出来答案

所以flag为:flag{good-luck}

10.信息化时代的步伐

我们代开题目发现是一串数字

606046152623600817831216121621196386

题目告诉我们是一串中文依然没太多思路看到一篇wp才知道是中文电码https://blog.csdn.net/LingDIHong/article/details/112684799?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170960355016800192299235%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=170960355016800192299235&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-112684799-null-null.142^v99^pc_search_result_base8&utm_term=buuctf-%E4%BF%A1%E6%81%AF%E5%8C%96%E6%97%B6%E4%BB%A3%E7%9A%84%E6%AD%A5%E4%BC%90&spm=1018.2226.3001.4187h

这是我看的wp的大佬大家可以去看看

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值