【题目】
某系统自称使用了一种防窃听的方式验证用户密码。密码是 \(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