某系统自称使用了一种防窃听的方式验证用户密码

2021年8月24日 | 分类: 【编程】

【题目】

某系统自称使用了一种防窃听的方式验证用户密码。密码是 \(n\) 个数 \(s_1,s_2,\ldots,s_n\),均为 0 或 1。该系统每次随机生成 \(n\) 个数 \(a_1,a_2,\ldots,a_n\),均为 0 或 1,请用户回答 \(({s_1}{a_1}+{s_2}{a_2}+\ldots+{s_n}{a_n})\) 除以 2 的余数。如果多次的回答总是正确,即认为掌握密码。该系统认为,即使问答的过程被泄露,也无助于破解密码——因为用户并没有直接发送密码。

然而,事与愿违。例如,当 \(n=4\) 时,有人窃听了以下 5 次问答:

问答编号 系统生成的 \(n\) 个数 掌握密码的用户的回答
\(a_1\) \(a_2\) \(a_3\) \(a_4\)
1 1 1 0 0 1
2 0 0 1 1 0
3 0 1 1 0 0
4 1 1 1 0 0
5 1 0 0 0 0

就破解出了密码 \(s_1\) = ( ),\(s_2\) = ( ),\(s_3\) = ( ),\(s_4\) = ( )。

【解析】

分析发现:第 5 次问答的数据中仅 \(a_1\) 为 1,其他 3 个均为 0 ;可以据此为突破口,得到 \(s_1\) 。

用第 5 次问答的数据代入可以推出:

\(({s_1}{a_1}+{s_2}{a_2}+\ldots+{s_n}{a_n})\%{2}\)
\(({s_1}\ast{1}+0+0+0)\%{2}==0\)
\({s_1}\ast{1}==0\)
\({s_1}==0\)

分析发现:第 1 次问答的数据中仅 \(a_1\) \(a_2\) 为 1,其他 2 个均为 0 ;上一步得到 \(s_1\) 为 0 ,可以进一步得到 \(s_2\) 。

把 \({s_1}==0\) 代入第 1 次问答的数据可得:

\(({s_1}{a_1}+{s_2}{a_2}+\ldots+{s_n}{a_n})\%{2}\)
\(({0}\ast{1}+{s_2}\ast{1}+0+0)\%{2}==1\)
\({s_2}\ast{1}==1\)
\({s_2}==1\)

分析发现:第 3 次问答的数据中仅 \(a_2\) \(a_3\) 为 1,其他 2 个均为 0 ;上一步得到 \(s_2\) 为 1 ,可以进一步得到 \(s_3\) 。

把 \({s_2}==1\) 代入第 3 次问答的数据可得:

\(({s_1}{a_1}+{s_2}{a_2}+\ldots+{s_n}{a_n})\%{2}\)
\((0+{1}\ast{1}+{s_3}\ast{1}+0)\%{2}==0\)
\({s_3}\ast{1}==1\)
\({s_3}==1\)

分析发现:第 2 次问答的数据中仅 \(a_3\) \(a_4\) 为 1,其他 2 个均为 0 ;上一步得到 \(s_3\) 为 1 ,可以进一步得到 \(s_4\) 。

把 \({s_3}==1\) 代入第 2 次问答的数据可得:

\(({s_1}{a_1}+{s_2}{a_2}+\ldots+{s_n}{a_n})\%{2}\)
\((0+0+{1}\ast{1}+{s_4}\ast{1})\%{2}==0\)
\(1+{s_4}\ast{1}==0\)
\({s_4}\ast{1}==1\)
\({s_4}==1\)

得到 \(s_4\) 为 1 。

参考:https://www.nowcoder.com/questionTerminal/cd2ff46083b34d9f9cdb62cfc2cb78a3