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

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

【题目】

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

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

问答编号 系统生成的 n 个数 掌握密码的用户的回答
a1 a2 a3 a4
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

就破解出了密码 s1 = ( ),s2 = ( ),s3 = ( ),s4 = ( )。

【解析】

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

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

(s1a1+s2a2++snan)%2
(s11+0+0+0)%2==0
s11==0
s1==0

分析发现:第 1 次问答的数据中仅 a1 a2 为 1,其他 2 个均为 0 ;上一步得到 s1 为 0 ,可以进一步得到 s2

s1==0 代入第 1 次问答的数据可得:

(s1a1+s2a2++snan)%2
(01+s21+0+0)%2==1
s21==1
s2==1

分析发现:第 3 次问答的数据中仅 a2 a3 为 1,其他 2 个均为 0 ;上一步得到 s2 为 1 ,可以进一步得到 s3

s2==1 代入第 3 次问答的数据可得:

(s1a1+s2a2++snan)%2
(0+11+s31+0)%2==0
s31==1
s3==1

分析发现:第 2 次问答的数据中仅 a3 a4 为 1,其他 2 个均为 0 ;上一步得到 s3 为 1 ,可以进一步得到 s4

s3==1 代入第 2 次问答的数据可得:

(s1a1+s2a2++snan)%2
(0+0+11+s41)%2==0
1+s41==0
s41==1
s4==1

得到 s4 为 1 。

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