如何在公开场合进行私密通信?我做了一个"手动挡"的加密通信工具
本文比较杂,内容有一些密码学的基础知识,以及我做的一个小工具网站的介绍。
你可以直接跳到后边看使用效果。
ECDH密钥交换
类似介绍太多了,这里简单说一下。
椭圆曲线里,从一个基点 G 进行一定次数 k 的“乘法”运算,会得到一个新的点 P,记作P = G * k
。
神奇的地方在于,给定一个 k,可以很轻松的算出 P,但从 P 倒推 k 却无比困难。(目前不可能)
更神奇的地方在于,这个”乘法”满足交换律,也就是说:
P1 * k2
= (G * k1) * k2
= (G * k2) * k1
= P2 * k1
于是我们可以把 P 作为公钥,k 作为私钥:
- A 把自己的 k1 作为私钥,P1 作为公钥发给B。
- B 把自己的 k2 作为私钥,P2 作为公钥发给A。
- A 计算
P2 * k1
,正好等于B算出来的P1 * k2
,密钥就协商好了。 - 而观察到P1和P2的围观群众,因为无法倒推出k1和k2,就无法知道密钥了。
问题分析
总有一些时候,我们不希望私密的对话被第三方围观;或者我们没有私密对话的条件,比如一些没有私信系统的网站(说的就是你v2ex)。
如何才能安全的私聊呢?利用ECDH密钥交换,可以两个人互相生成一对公私钥对,互相发送公钥给对方,利用同一套规则计算出一个共同的密钥,就可以进行私聊对话了。
以上也能看出来,门槛高了”亿些”,步骤比较多,网上虽然有一些在线的密码工具,但又很少把ECDH和加密等工具方便的结合的。
首先明确这只是一个练手的小工具,所以不搞服务器,也不搞身份认证等复杂的事情,只是简单的互发公钥->计算密钥->加密解密
这个流程。
因为是一个纯静态的网站,所以免不了还是要手动粘贴公钥密文啥的,那么如何简化这个“手动复制粘贴”的流程呢?
我想到的是利用带参数的链接,这样链接里既带了数据,也带了加解密的工具,别人点开链接就基本知道怎么回事了。
网站最终效果
做好的网站在这里:https://xujinkai.net/crypto/msg
使用流程是这样的:
- A打开这个网站,点击New Session,复制一个带自己公钥的链接
- B想给A发信息,就打开这个链接,输入文字并点加密。网站会把一个链接给B复制到剪贴板,B再粘贴给A就行了。
在使用上,第一步无法省略,因为一定要有一方先把公钥公布出去。而我做的就是简化后续的流程:
- 打开网站时会自动生成一个公私钥对并保存到本地
- B打开链接后,会根据链接里的公钥自动计算加密密钥
- B点击加密按钮后,不仅会用密钥加密,还会把密文和B的公钥组成一个链接复制到剪贴板
在纯静态的场景下,这应该是所能做到的极限了。
另外这其实是一个工具箱网站,支持通过URL参数的方式做base64,生成二维码等,配合鼠标手势或者我的OneQuick体验良好。
做这个小工具仅仅是因为感觉有趣,请勿用于非法用途(大概也不会有吧)