今天做了一个思考题,加深了对数字签名的理解,问题如下:
电子投票的应用十分广泛,假设投票者以电子文档形式把选票发给选举机构(Election Authority, EA)
(1)每位投票者填写选票,并用 EA 的公钥加密选票;
(2)EA 把所有选票解密并统计,然后宣布选举结果。
试分析上述协议的问题?并设计出安全的投票协议。
解答:
存在的问题:
由于 EA 的公钥是公开的,也就是说不能确定投票者的身份,所以可能存在有人恶意刷票的风险,EA 也检测不出来。
解决方案:
① 投票者先对电子文档消息 m 做 Hash 得到消息摘要 s,然后用自己的私钥 a 加密 s;
② 投票者采用对称密码算法加密电子文档的消息得到,并用 EA 的公钥 b 加密该对称密钥 key;
③ 投票者将加密后的消息、加密后的消息摘要以及加密后的对称密码发给 EA;
④ EA 收到投票者发来的信息后,先使用自己的私钥解密出对称密钥 key,
⑤ 然后用 key 解密出消息 m\' ,然后对 m\' 做 Hash 得到 s\' ,
⑥ 接着用该投票者的公钥解密收到的被加密的消息摘要,得到 s;
⑦ 比较 s\' 和 s 是否相等,若相等,则证明消息未被篡改,否则被篡改了。
原理图:
总结:
以上的方案不仅能够确认投票者的真实身份(因为只有自己才有自己的私钥),还实现了消息的加密。