程序员对私密聊天的乱想

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 条回复
wingpui
2019-09-29 10:34:00 +08:00
有人知道 TokQ 的开源地址吗
vbvcvd
2019-09-29 10:36:21 +08:00
oversec 难道没人用吗?
airfling
2019-09-29 10:38:49 +08:00
其实本来没事的,你非要自己加密搞出事,如果电信公司分辨不出你这个流量,八成就会让你去喝茶了
userdhf
2019-09-29 10:42:21 +08:00
给你个眼神,你自己体会
david2011012
2019-09-29 10:44:31 +08:00
你最多就是实现了 ssh 加密吧?说那么多干嘛?你要是想做好,直接做到微信上,在微信上推广不是更好,直接在微信上发加密内容
hinot
2019-09-29 10:49:44 +08:00
Facebook 和 WhatsApp 将向英国警方分享加密信息 据彭博社报道,知情人士透露,根据美英两国之间的一项新条约,包括 Facebook 和 WhatsApp 在内的美国社交媒体平台将被迫与英国警察分享用户的加密信息。https://tech.sina.com.cn/i/2019-09-29/doc-iicezueu9040531.shtml?qq-pf-to=pcqq.c2c
laike9m
2019-09-29 10:54:00 +08:00
@shayang888 不是
wang4012055
2019-09-29 11:07:53 +08:00
然后发现输入法在监听你
blankfire
2019-09-29 11:26:52 +08:00
辛亏一些人不是老大哥,真可怕,可以说是本格精神老大哥了
youngliu
2019-09-29 11:58:07 +08:00
什么时候能 mac、手机、win 同步就 6 了
shihira
2019-09-29 12:06:31 +08:00
@salamanderMH 这我很想知道是哪条神仙政策不允许了,如果不准加密现在 HTTPS 是不是全都可以禁掉。这是我们公民应得的隐私权,碰壁就碰壁了再说,自我审查自我规限最为致命
golden0125
2019-09-29 13:36:52 +08:00
挺好一软件,但杀毒报有高危行为,就删了,抱歉我对这方面比较在意
dangyuluo
2019-09-29 13:41:55 +08:00
其实 我一直无法理解宣称的这种端到端加密安全性。又有谁能够保证第一次密钥交换的过程中不被服务器记录呢?
niubee1
2019-09-29 13:47:52 +08:00
@dangyuluo 基于椭圆曲线的 ECDH 技术是通过零知识共享的方式分发的密钥, 所以不会被服务器记录
delpo
2019-09-29 13:49:26 +08:00
@dangyuluo 公钥被服务器记录没有问题,只要不被篡改就不会被中间人
所以大多数端到端加密软件都提供公钥指纹验证功能,不过用户会不会用这个功能是另一回事
Puterbuter
2019-09-29 19:24:33 +08:00
汉克儿,你来了
geelaw
2019-10-01 02:55:55 +08:00
@dangyuluo #53 安全的密钥交换算法在所有通讯都被记录的情况下仍然保持安全。

@niubee1 #54 零知识共享是什么?
fantasynoff
2019-10-01 07:44:41 +08:00
手机上直接做加密输入法就好了,但是目前还没有人做
bluefountain
2020-01-16 15:38:01 +08:00
@dangyuluo 两个人洗桑拿的时候口头交换的密钥

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

https://tanronggui.xyz/t/605042

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

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

© 2021 V2EX