程序员对私密聊天的乱想

2019-09-28 10:52:41 +08:00
 anhkgg

唠叨

群里有人推了个项目TgWechat,微信端对端加密插件,还特意 @了我表示感谢,受宠若惊。

隐私问题其实说了很久,有人说微信其实一直看着我们聊天,具体是怎么样的,咱也不知道,咱也不敢问吖...

谁没个秘密呢,或者和朋友开个玩笑,或者和伴侣聊点"家常",如果这些内容暴露在别人眼中,确实有点尴尬,但毕竟咱也没乱说啥吖...

不过加密聊天也可有能会给某些人提供某些庇护,导致出现一些安全问题,这也是一个大问题...

所以你让我说微信到底要不要、能不能看我们聊天内容,我确实也说不好...

所以这里不讨论这种问题,我只聊技术。

不是广告~~

端对端加密( end-to-end encryption ),按我的简单理解就是 A 和 B 聊天,A 说出去的话加密后,只有 B 能够解开密文,拿到明文,这个过程中网络传输过程全是加密的。

2017 年 8 月,WhatsApp 宣布对所有通讯信息进行端到端加密,WhatsApp 超过 10 亿用户的所有信息(包括文字、照片、视频、文件和语音信息)在默认下都会进行端到端加密,包括群聊。

“我们的想法很简单:当你发送一条消息,只有接收你消息的人或群组可以读取,”WhatsApp 创始人 Jan Koum 和 Brian Acton 表示,“没有人可以看到这些消息,网络罪犯、黑客、政府人员甚至我们都不能看到这些消息。端到端加密可确保 WhatsApp 通讯的隐私性,这有点像面对面的谈话。”

看了这个新闻,知道我没理解错。

其实我很早就写了个小工具,就实现了端对端加密,而且还是对聊天工具透明的,也就是说任何工具都能用。

哈哈,有点吹了...

小工具叫做Chisechat,slogn 是“独属于你和我的心灵密令”,本来是我自用的小玩意,后来改了几版之后才分享出来的。

功能很简单,A 和 B 都用 Chisechat 设置一个一样的密码(私下协商,打电话或者当面定好),A 把要发的内容放到 Chisechat 加密,再用聊天工具把加密内容发给 B,B 拿到密文在 Chisechat 中解密查看。

看起来操作是不是挺麻烦,其实还好,因为我针对操作做了优化,基本不影响聊天体验,具体不说了,感兴趣的自行下载试用,地址:https://anhkgg.com/Chisechat/

唯一让我拿出来分享的原因是,我觉得自己做的挺好玩,让我啰嗦说道一下。

Chisechat 刚开始加密就是简单的 xx 算法+base64,然后 base64 的内容特征太明显,也不好看,我就开始想怎么弄得更自然一点,后来增加了两种模式。

  1. 增加 base64 中文版算法,也就是那些 xx 字符全换成我选的一些中文,这样编码结果看起来自然多了
  2. 后来觉得选的字太简单也不好看,就灵光一闪想到粤语。是的,粤语词看起来非常炫酷,非常好玩。

具体如何你们自行鉴赏一下:

OK,扯得有点多了,我的 Chisechat 其实一种粗糙且粗暴的一种解决方案,但够用了。

研究

那 WhatsApp 是如何做的呢?不知道。

但是搜索的时候,看到了这个必须拥有姓名的软件 Telegram,也就是 TgWechat 参考的。

Telegram 中文名好像叫做“电报”,很安全的感觉。Telegram 号称"这个世界上没人能监控我"。

Telegram 为一对一的聊天提供端对端加密,加密模式是基于 256 位对称 AES 加密,RSA 2048 的加密和 Diffie-Hellman 的安全密钥交换协议。协议极其优秀,兼具数学和工程之美,不仅加密基础非常完善,在工程上也很出色,Telegram 传递的消息为函数,可扩展性相当强。

Telegram 用的是 RSA-dh+AES 来完成的端对端加密。

按我一个密码学渣的粗浅理解就是:

  1. A 和 B 拥有相同的 p、q,通过 RSA 生成各自公钥和私钥。
  2. 私钥自行保存,公钥通过网络发送给对方。
  3. 互相拿到公钥后,和自己的私钥一起算出一个共享密钥
  4. A 和 B 算出密钥是一样的,这样就是可以互相 AES 加密解密了。

具体算法大家自行查看其他更详细的分享,比如对抗中间人攻击( RSA 签名),爆破( p、q 很大)。

看一下这个实例更好理解:

//https://blog.csdn.net/andylau00j/article/details/82178351

1.爱丽丝与鲍伯协定使用 p=23 以及 g=5.
 
2.爱丽丝选择一个秘密整数 a=6, 计算 A = g^a mod p 并发送给鲍伯。
   A = 5^6 mod 23 = 8.
 
3.鲍伯选择一个秘密整数 b=15, 计算 B = g^b mod p 并发送给爱丽丝。
   B = 5^15 mod 23 = 19.
 
4.爱丽丝计算 s = B a mod p
  19^6 mod 23 = 2.
 
5.鲍伯计算 s = A b mod p
   8^15 mod 23 = 2.

总的来说,Telegram 通过很牛逼的密钥交换算法让两方拥有了一样的密码,然后别人不知道,也找不到,这样子聊天内容一加密,就只有对方能够看到,如此完成了一个端对端加密的安全聊天通道。

再扯一句,Telegram 是通过协议和算法来完成协商密钥,而我的 Chisechat 是人工通过其他通道协商的密钥,殊途同归,嘎嘎。

猜测

理论搞明白了,现在想想 TgWechat 是怎么做的呢(这玩意加的 vm 太多了...别想逆了)?

其实也有两种方式,一种类似于 Chisechat 的思路,自行设置密码,然后加密聊天,一种就是像 Telegram 一样通过协议和算法完成。

这前面密码的事都没啥好说的,关键在 Wechat 不是你自己的软件,要怎么插入一些自己的东西进去。

这里我也只是给出思路,猜测 TgWechat 是这么做的。

  1. hook sendmsg、recvmsg。
  2. 密钥协商阶段,检查发送内容和接收内容是不是特定内容,是则通过算法生成公私钥,公钥 sendmsg 发送出去。
  3. recvmsg 收到公钥,算出共享密钥。
  4. 后续发送和接收到内容时,通过加密算法先加解密,再发送出去或者显示。

OK,基本就是这样了。

点击原文体验 Chisechat: https://anhkgg.com/Chisechat/

参考:

  1. WhatsApp 宣布对所有通讯信息进行端到端加密
  2. 全球没人能监控的聊天软件也要死了 — Telegram
  3. DH 秘钥交换算法
  4. TgWechataa
10543 次点击
所在节点    程序员
59 条回复
signalas1
2019-09-28 17:51:31 +08:00
哈哈哈,我也准备要做一个,准备半个月了。
端对端加密,思路差不多,不过只放出源码,部署肯定是不会部署的,小心违法。
signalas1
2019-09-28 17:52:50 +08:00
一定要放出实现,安全不是靠隐藏实现来实现的,而是靠经过验证的密码学
Cbdy
2019-09-28 18:17:18 +08:00
@alphatoad 我想了一下,就类似微信的这种情况,可以用“文件传输助手”实现多端的加密信息同步
Cbdy
2019-09-28 18:22:19 +08:00
@Cbdy 另外,既然客户端都自己魔改了,就不用手动开启关闭加密模式了,把消息封好前面加个魔数全部自动,美滋滋
Milesy
2019-09-28 20:57:13 +08:00
尽管目前境内的政策不允许这种软件合法使用,但这确实是一个技术上的好想法。
lydasia
2019-09-28 21:09:36 +08:00
@littlespider89 线下先交换好密钥。。
laike9m
2019-09-28 21:15:28 +08:00
电报默认是不开端到端加密的,这个比较烦
Owenjia
2019-09-28 22:15:32 +08:00
拿什么举例不好,拿 whatsapp 和 telegram ...
catror
2019-09-29 00:50:25 +08:00
想做端到端加密通信可以参考 signal 的文档 https://signal.org/docs/ 。X3DH 算法用于离线的密钥交换;然后 Double Ratchet 用于消息通信,同时支持前向安全和后向安全。
alphatoad
2019-09-29 02:44:04 +08:00
@Cbdy 不可以,私钥不能离开设备。
xiaotuzi
2019-09-29 07:14:38 +08:00
我自己想到的端端加密比较简单。
1 每个人创建账号后,按照一定规则生成 32 位密钥,密钥存储在本地和服务器。
2 聊天的时候根据两人的密钥生成 N 种加密密钥(其实就使用了其中一种,但是生成密钥的结果有 N 种可能),密钥存储在本地和服务器
3 聊天时对聊天内容进行密钥加密解密

就这样吧,这已经很难破解了。不懂密码学,但我觉得这么做已经够安全了。
choury
2019-09-29 08:32:15 +08:00
@xiaotuzi 密钥存在服务器就和端到端没关系了,就是微信的这种实现了
sutra
2019-09-29 09:11:55 +08:00
TgWechat 通过微信服务器交换公钥,如何避免交换公钥时的中间人攻击?
free9fw
2019-09-29 09:13:20 +08:00
没有开源吗,对 LZ 的加密算法感兴趣
shakoon
2019-09-29 09:41:02 +08:00
下载前看了一下帮助,才发现是 windows 程序啊。我看了半天帖子一直以为是手机 app,还在想切换窗口粘贴来粘贴去和麻烦呢,原来是我想多了
shepherdlazy
2019-09-29 10:07:09 +08:00
每个人都有一对 [公钥,私钥]
要给对方发消息用对方的公钥加密,对方收到消息后用自己的私钥解密;
=========================
简单概括:
公钥加密
私钥解密
========================
但是这东西产品话之后违法。。。 。。。
zhao305149619
2019-09-29 10:12:37 +08:00
“功能很简单,A 和 B 都用 Chisechat 设置一个一样的密码(私下协商,打电话或者当面定好),A 把要发的内容放到 Chisechat 加密,再用聊天工具把加密内容发给 B,B 拿到密文在 Chisechat 中解密查看。“这样你是不是有机会看到或者解密聊天内容?
shepherdlazy
2019-09-29 10:14:46 +08:00
@zhao305149619 我觉得应该砍掉协商一个同样密码的步骤,就直接用对方公开的密钥加密
S9Yh4wIFsBG7jnE4
2019-09-29 10:20:47 +08:00
@laike9m 那群聊天也不是?
S9Yh4wIFsBG7jnE4
2019-09-29 10:27:50 +08:00
@neteroster 那群聊天也不是?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/605042

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX