攻防世界题目练习——Crypto密码新手+引导模式(一),2024年最新一线互联网架构师设计思想解读开源框架

本文作者为资深架构师,分享了一套2024年的网络安全学习资料,包括基础到进阶的Crypto题目解析,如base64、Caesar、RSA等,并推荐了学习路线和资源,适合不同阶段的程序员提升技能。文章还提供了获取完整资料的方式。
摘要由CSDN通过智能技术生成

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注网络安全)
img

正文

密码学第2篇:
攻防世界题目练习——Crypto密码新手+引导模式(二)(持续更新)

1. base64

下载文件,打开是一个txt文件,解密工具base64解码,如图:
在这里插入图片描述

2. Caesar

打开文件看到字符如下:

oknqdbqmoq{kag_tmhq_xqmdzqp_omqemd_qzodkbfuaz}

联想到上一题拿到的flag的格式,可以看出是比较规律的一串字符。
上一题flag的格式为cyberpeace{xx_xx_xx_xx},因此猜测本题{}前面的内容为cyberpeace。
题目名字Caesar就是恺撒密码,也就是把每个字母移动相同的位数变成另一个字母,观察比较cyberpeace和oknqdbqmoq也看得出,字母相同的位置变化后的字母也相同,于是数一下移动的位数。

oknqdbqmoq
↓
cyberpeace
c->o后移12位
y->k后移12位
因此要解密就将密文每个字母向前移12位,可以参照前面cyberpeace对应的字母:
{kag_tmhq_xqmdzqp_omqemd_qzodkbfuaz}
kag->you
tmhq->have
xqmdzqp->learned
omqemd->caesar
qzodkbfuaz->encryption

得到flag:
cyberpeace{you_have_learned_caesar_encryption}

3. Morse

看到标题名字,大概是摩斯密码,打开文件内容如下:

11 111 010 000 0 1010 111 100 0 00 000 000 111 00 10 1 0 010 0 000 1 00 10 110

摩斯密码在线解密在线摩斯密码翻译器

解密结果:
MORSECODEISSOINTERESTING
转换为小写flag:
cyberpeace{morsecodeissointeresting}

4. Broadcast

题目提示说留下了明文。
解压下载的文件,打开task.py,直接看到flag:
在这里插入图片描述
不懂,这和密码有啥关系

5. hidden key

打开文件,代码如下:

from Crypto.Util.number import \*
from secret import flag
import  random
import hashlib
import os

key=os.urandom(8)
#os.urandom(n)函数用来获取一个指定长度的bytes对象
#返回一个长为n个bytes的string
#本代码中返回一个8个字节的字符串

def rand(rng):
    return rng - random.randrange(rng)
#random.randrange([start,] stop [,step]),
#start -- 指定范围内的开始值,包含在范围内。如果 start 参数未传入参数,则采用默认值 0(零)。
#stop -- 指定范围内的结束值,不包含在范围内。
#step -- 指定递增基数。该参数是可选的,如果参数中没有传入宽度参数,则取默认值1
#也就是说,只有一个参数的话,就是stop值,本代码中就是在[0,rng)之间产生随机的整数值

m=[]
random.seed(int(hashlib.md5(key).hexdigest(), 16))
#设置随机种子后,是每次运行test.py文件的输出结果都一样,而不是每次调用随机函数生成的结果一样
#想要每次运行随机函数生成的结果都一样,可以在每个随机函数前都设置一模一样的随机种子

for i in range(len(flag)):
    rand(256)
    xor=flag[i]^rand(256)
    # 把flag的每一个字符和rand出来的值做异或
    m.append(xor)
print(m)
print(bytes_to_long(key)>>12)

# [140, 96, 112, 178, 38, 180, 158, 240, 179, 202, 251, 138, 188, 185, 23, 67, 163, 22, 150, 18, 143, 212, 93, 87, 209, 139, 92, 252, 55, 137, 6, 231, 105, 12, 65, 59, 223, 25, 179, 101, 19, 215]
# 2669175714787937

参考博客:
Python——os.urandom生成随机加密字符
Python random randrange()用法及代码示例
【python】random.seed()用法详解
Crypto中常用的数据类型互转方式

知道了输出结果,反过来尝试写解码的脚本:

# coding=gbk
# vscode里把编码改成了gbk,但是因为默认编码环境是utf-8,所以要在第一行加上coding=
from Crypto.Util.number import \*
# from secret import flag
import random
import hashlib

key1 = 2669175714787937 << 12
# 由于低12位未知,所以需要低12位遍历每一个值循环爆破

m = [
    140, 96, 112, 178, 38, 180, 158, 240, 179, 202, 251, 138, 188, 185, 23, 67,
    163, 22, 150, 18, 143, 212, 93, 87, 209, 139, 92, 252, 55, 137, 6, 231,
    105, 12, 65, 59, 223, 25, 179, 101, 19, 215
]


def rand(rng):
    return rng - random.randrange(rng)


for k in range(1 << 12):
    key = long_to_bytes(key1 + k)
    random.seed(int(hashlib.md5(key).hexdigest(), 16))
    flag = []
    for i in range(len(m)):
        rand(256)
        xor = m[i] ^ rand(256)
        flag.append(xor)
    if all(ch < 256 for ch in flag):
        flag = bytes(flag)
        if (flag.startswith(b'flag')):
            print("key=", bytes_to_long(key))
            print(flag)

运行结果:
key= 10932943727771392887
b'flag{e319a58c-4dd6-4e6a-a3fb-f4b0d339faba}'


Non-UTF-8报错解决方法、append函数、bytes函数、bytes串参考博客如下:
Python出现报错:SyntaxError: Non-UTF-8 code starting with ‘\xa1‘ in file…
Python 列表 append()函数使用详解
python内置函数bytes()用法详解

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值