通往哈希的旅程——crypto中的hash问题

先来看题目吧

在数字城,大家都是通过是通过数字电话进行的通信,常见是以188开头的11位纯血号码组成,亚历山大抵在一个特殊的地方截获一串特殊的字符串"ca12fd8250972ec363a16593356abb1f3cf3a16d",通过查阅发现这个跟以前散落的国度有点相似,可能是去往哈希国度的。年轻程序员亚力山大抵对这个国度充满好奇,决定破译这个哈希值。在经过一段时间的摸索后,亚力山大抵凭借强大的编程实力成功破解,在输入对应字符串后瞬间被传送到一个奇幻的数据世界,同时亚力山大抵也开始了他的进修之路。(提交格式:flag{11位号码})

显然结合题目名称,这是一道与hash函数加密有关的题目。

通过题目,我们可以提取以下信息:

1.明文是以188开头的11位正整数,即18800000000~18899999999.

2.密文是ca12fd8250972ec363a16593356abb1f3cf3a16d,由hash散列函数产生的字符串。

所以,我们很自然便会利用python构建脚本。

遍历符合条件的所有11位正整数,并依次计算对应的hash值,最终找到与密文ca12fd8250972ec363a16593356abb1f3cf3a16d一致的11位整数。

所以,构建脚本如下:

import hashlib
for i in range(18800000000,18900000000):
    number=i
    number_str=str(number).encode('utf-8')
    hash=hashlib.sha1()
    hash.update(number_str)
    hash_val=hash.hexdigest()
    if hash_val=='ca12fd8250972ec363a16593356abb1f3cf3a16d':
        print(f"find the answer:",{number})
        break

(PS:本人python脚本写的确实不咋地)

所以,find the answer: {18876011645}

### Linux 等待队列机制实现 #### 什么是等待队列? 在 Linux 内核中,等待队列是一种用于管理进程状态转换的机制。当某个进程需要等待特定事件发生时,它会被放入一个等待队列中,并进入睡眠状态[^1]。一旦所等待的事件发生,该进程将被从等待队列移回运行队列,从而重新获得 CPU 资源。 #### 等待队列数据结构 等待队列的核心数据结构由两个部分组成:`wait_queue_head_t` `wait_queue_entry_t`。其中: - **`wait_queue_head_t`** 是等待队列头,表示整个等待队列的起点。其定义如下: ```c struct wait_queue_head { spinlock_t lock; // 自旋锁,保护对链表的操作 struct list_head head; // 双向链表头部 }; typedef struct wait_queue_head wait_queue_head_t; ``` 这里的 `spinlock_t` 提供了线程安全的保障,而 `struct list_head` 则是一个双向链表节点,用来连接所有的等待队列条目[^2]。 - **`wait_queue_entry_t`** 表示单个等待队列条目,通常与具体的进程关联。它的具体形式可能因场景不同有所变化,但一般会包含指向对应进程的任务控制块 (`task_struct`) 的指针以及回调函数等信息。 #### 如何初始化等待队列? 为了使用等待队列,在实际编程过程中首先需要对其进行初始化。可以通过调用标准库函数来完成这一工作: ```c #include <linux/wait.h> // 定义并初始化一个等待队列头 wait_queue_head_t my_wq; init_waitqueue_head(&my_wq); ``` 这里使用的 `init_waitqueue_head()` 函数会对传入的等待队列头执行必要的设置操作,比如清零内部字段或将初始值赋给成员变量[^3]。 #### 基本流程分析 以下是基于等待队列的一般处理逻辑概述: 1. **创建注册入口** 当前正在运行的进程如果预计未来某段时间内无法继续推进,则可以主动把自己加入到指定的等待队列里去。这一步骤涉及分配一个新的 `wait_queue_entry_t` 对象并将之链接至目标列表末端。 2. **释放处理器时间片** 加入完成后立即放弃当前占用的 CPU 时间片 (通过调用 schedule() 实现),使得其他可执行单元有机会得到调度机会[^1]。 3. **触发条件检测** 那些负责维护共享资源或者监控外部输入输出活动的部分程序会在适当时候遍历各个已知的等待队列查找符合条件者予以激活通知。 4. **恢复原状** 接收到信号后的休眠态进程再次变为就绪态准备接受新一轮轮询测试直至最终退出系统调用返回用户空间[^1]。 #### 示例代码展示 下面给出一段简单的例子演示如何利用这些概念构建基本功能模块: ```c #include <linux/kernel.h> #include <linux/module.h> #include <linux/sched.h> /* For task management */ #include <linux/delay.h> /* msleep_interruptible */ static DECLARE_WAIT_QUEUE_HEAD(my_custom_wq); void example_function(void){ int ret; printk(KERN_INFO "Going to sleep...\n"); // 尝试进入等待状态直到被打断或超时结束 ret = wait_event_interruptible_timeout( my_custom_wq, condition_to_check(), msecs_to_jiffies(5000)); if(ret == 0) printk(KERN_WARNING "Timed out waiting!\n"); else if(ret == -ERESTARTSYS) printk(KERN_NOTICE "Interrupted by signal\n"); } bool wake_up_example(void){ bool success_flag=false; // 模拟某些异步事件的发生... if(event_occurred()){ wake_up_all(&my_custom_wq); success_flag=true; } return success_flag; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值