密码学 – 数字签名的用处

今天做了一个思考题,加深了对数字签名的理解,问题如下:

电子投票的应用十分广泛,假设投票者以电子文档形式把选票发给选举机构(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 是否相等,若相等,则证明消息未被篡改,否则被篡改了。

原理图:

总结:

以上的方案不仅能够确认投票者的真实身份(因为只有自己才有自己的私钥),还实现了消息的加密。