#P17037. [NWERC 2021] Access Denied
[NWERC 2021] Access Denied
背景
译自 Northwestern Europe Regional Contest (NWERC) 2021 Problem A。
原题许可协议为 CC BY-SA。
题目描述
计算机密码已经存在很久了。事实上, 年前,CTSS 是最早使用密码的计算机系统之一。它的实现非常简单:在 CTSS 中,密码以明文形式存储在磁盘上的一个文件里。登录时,用户输入一个密码,计算机会将它与磁盘上的密码进行比较。如果比较失败,就拒绝访问;如果比较成功,就允许访问。MIT 的研究人员很快发现了这个密码系统中的若干安全漏洞。我们将研究其中一种:计时攻击。
在计时攻击中,我们利用“完成一次计算所花的时间”来推断计算过程经过了哪些路径。在 CTSS 中,密码检查使用一个简单的字符串匹配算法,类似于下面这样:
bool CheckPassword(string pwd1, string pwd2) {
if (pwd1.Length != pwd2.Length) {
return false;
}
for (int i = 0; i < pwd1.Length; i++) {
if (pwd1[i] != pwd2[i]) {
return false;
}
}
return true;
}
在本题中,我们将使用上述算法以及一个(非常)简化的计时模型。计时模型如下:
- 一个分支语句(
if或for)耗时 ms。 - 一次赋值,或一次内存地址的更新,耗时 ms。
- 两个内存地址之间的一次比较耗时 ms。
- 一个
return语句耗时 ms。
密码由 到 个英文字母(大写或小写)和数字组成。
交互格式
这是一道交互题。你的程序会与一个 交互器 一起运行;交互器读取你程序的标准输出,并向你程序的标准输入写入内容。交互过程必须遵循以下协议:
- 你的程序首先输出一个密码字符串,该字符串由 到 个英文字母(大写或小写)和数字组成。
- 根据密码是否正确,交互器随后会返回以下两种内容之一:
- 如果密码正确,返回
ACCESS GRANTED。此时你的程序应当正常退出。 - 如果密码错误,返回
ACCESS DENIED ($t$ ms),其中 是验证该密码所花费的时间,单位为 ms。之后你的程序可以继续进行下一次猜测。
- 如果密码正确,返回
每次写入后请确保刷新输出缓冲区。你最多可以猜测 次。题包中提供了一个测试工具,帮助你调试程序。
ACCESS DENIED (5 ms)
ACCESS DENIED (41 ms)
ACCESS DENIED (68 ms)
ACCESS GRANTED
A
HunFhun
Hunter1
Hunter2
提示
【数据规模与约定】
对于所有数据,密码长度满足 ,字符只包含英文字母(大小写)和数字。最多允许 次猜测。