V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
anhkgg
V2EX  ›  程序员

程序员对私密聊天的乱想

  •  
  •   anhkgg ·
    anhkgg · 2019-09-28 10:52:41 +08:00 · 10173 次点击
    这是一个创建于 1669 天前的主题,其中的信息可能已经有所发展或是发生改变。

    唠叨

    群里有人推了个项目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. 后来觉得选的字太简单也不好看,就灵光一闪想到粤语。是的,粤语词看起来非常炫酷,非常好玩。

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

    1.png

    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
    59 条回复    2020-01-16 15:38:01 +08:00
    littlespider89
        1
    littlespider89  
       2019-09-28 11:26:30 +08:00   ❤️ 1
    感觉非对称加密好一些,万一你们在语音约定暗号的时候被偷听了呢😂
    xixibb
        2
    xixibb  
       2019-09-28 11:35:48 +08:00
    写了这么多,其实发现没卵用 。。。赶紧搬砖才是硬道理。。。
    x86
        3
    x86  
       2019-09-28 11:49:39 +08:00
    顶多敏感词检测,人家吃饱了天天看你个搬砖仔,看也是看有背景的,而一般人只有背影...
    我要是老大哥,检测到异常(加密这种)直接拘了你不跟你废话
    neroxps
        4
    neroxps  
       2019-09-28 11:58:56 +08:00   ❤️ 48
    人分享个技术文章,为啥要说各种晦气话???

    程序员为何要打击程序员的技术激情???
    Raymon111111
        5
    Raymon111111  
       2019-09-28 12:09:51 +08:00
    端到端加密不合法唉
    ech0x
        6
    ech0x  
       2019-09-28 12:17:59 +08:00 via iPhone
    @Raymon111111 哪里不合法了?
    geelaw
        7
    geelaw  
       2019-09-28 12:18:59 +08:00   ❤️ 6
    您似乎没有弄明白 RSA 和 DH 的关系。

    您链接文章里似乎暗示 Z_p^* 里 decisional Diffie-Hellman 成立——这是不对的,在 Z_p^* 里 DDH 不成立,用整数取模计算的时候应该选择安全质数 p=2q+1,并使用 Z_p^* 的 q 阶子群(因此使用 23、5 作为例子也是误导性的)。以及对困难性的理解也不太对,因为计算 a、b 没有什么用,攻击者需要考虑的是如何计算 g^(ab)——这并不非要计算 a、b。

    另外您也没有公布您使用的是什么(对称)加密算法,通常来说这样默认安全性是 0。
    Raymon111111
        8
    Raymon111111  
       2019-09-28 12:24:31 +08:00
    @ech0x 电报是怎么被封的?
    agagega
        9
    agagega  
       2019-09-28 12:33:15 +08:00 via iPhone   ❤️ 3
    @neroxps
    还有,有人贡献时间给什么文档做中文翻译,就会有人出来说不会英语当什么程序员。呵呵呵,这种人真的烦。
    dimlau
        10
    dimlau  
       2019-09-28 12:38:36 +08:00
    密迹搜索好像出过一个输入法,来实现任何地方聊天加密……
    neteroster
        11
    neteroster  
       2019-09-28 13:03:12 +08:00 via Android
    @Raymon111111 Telegram 普通聊天模式可不是端到端加密。
    lidfather
        12
    lidfather  
       2019-09-28 13:06:31 +08:00 via Android
    tls 就行了,搞那么多花里胡哨的
    RiRI
        13
    RiRI  
       2019-09-28 13:12:13 +08:00
    搞着自己玩玩就行了,被别有用心的人利用了到时候技术可不是无罪的。
    JingNi
        14
    JingNi  
       2019-09-28 13:13:40 +08:00 via iPhone
    感觉以后用得上,先收藏了🐷
    ech0x
        15
    ech0x  
       2019-09-28 13:35:28 +08:00 via iPhone   ❤️ 1
    @Raymon111111 电报违法了?封了是贵国的审查。
    qq292382270
        16
    qq292382270  
       2019-09-28 13:37:44 +08:00
    ... 被别人直接从手机货电脑屏幕上看到聊天内容才尴尬..
    至于聊天记录就算在微信或者某些人那里天天被围观,不知道就当没发生....
    cat9life
        17
    cat9life  
       2019-09-28 14:04:32 +08:00
    这个很好啊 以前用过加密键盘 感觉也是个很好的思路
    alphatoad
        18
    alphatoad  
       2019-09-28 14:22:33 +08:00 via iPhone
    如果不是科班出身的话,能想出这么多不容易了
    思考题:如何在点对点加密的同时保证多设备记录同步呢?
    salamanderMH
        19
    salamanderMH  
       2019-09-28 14:42:45 +08:00
    政策不允许
    WhoCanBeRich
        20
    WhoCanBeRich  
       2019-09-28 17:34:41 +08:00
    可以 学习了
    signalas1
        21
    signalas1  
       2019-09-28 17:51:31 +08:00
    哈哈哈,我也准备要做一个,准备半个月了。
    端对端加密,思路差不多,不过只放出源码,部署肯定是不会部署的,小心违法。
    signalas1
        22
    signalas1  
       2019-09-28 17:52:50 +08:00   ❤️ 1
    一定要放出实现,安全不是靠隐藏实现来实现的,而是靠经过验证的密码学
    Cbdy
        23
    Cbdy  
       2019-09-28 18:17:18 +08:00
    @alphatoad 我想了一下,就类似微信的这种情况,可以用“文件传输助手”实现多端的加密信息同步
    Cbdy
        24
    Cbdy  
       2019-09-28 18:22:19 +08:00
    @Cbdy 另外,既然客户端都自己魔改了,就不用手动开启关闭加密模式了,把消息封好前面加个魔数全部自动,美滋滋
    Milesy
        25
    Milesy  
       2019-09-28 20:57:13 +08:00
    尽管目前境内的政策不允许这种软件合法使用,但这确实是一个技术上的好想法。
    lydasia
        26
    lydasia  
       2019-09-28 21:09:36 +08:00 via Android
    @littlespider89 线下先交换好密钥。。
    laike9m
        27
    laike9m  
       2019-09-28 21:15:28 +08:00 via Android
    电报默认是不开端到端加密的,这个比较烦
    Owenjia
        28
    Owenjia  
       2019-09-28 22:15:32 +08:00
    拿什么举例不好,拿 whatsapp 和 telegram ...
    catror
        29
    catror  
       2019-09-29 00:50:25 +08:00 via Android
    想做端到端加密通信可以参考 signal 的文档 https://signal.org/docs/ 。X3DH 算法用于离线的密钥交换;然后 Double Ratchet 用于消息通信,同时支持前向安全和后向安全。
    alphatoad
        30
    alphatoad  
       2019-09-29 02:44:04 +08:00 via iPhone
    @Cbdy 不可以,私钥不能离开设备。
    xiaotuzi
        31
    xiaotuzi  
       2019-09-29 07:14:38 +08:00 via iPhone
    我自己想到的端端加密比较简单。
    1 每个人创建账号后,按照一定规则生成 32 位密钥,密钥存储在本地和服务器。
    2 聊天的时候根据两人的密钥生成 N 种加密密钥(其实就使用了其中一种,但是生成密钥的结果有 N 种可能),密钥存储在本地和服务器
    3 聊天时对聊天内容进行密钥加密解密

    就这样吧,这已经很难破解了。不懂密码学,但我觉得这么做已经够安全了。
    choury
        32
    choury  
       2019-09-29 08:32:15 +08:00 via Android
    @xiaotuzi 密钥存在服务器就和端到端没关系了,就是微信的这种实现了
    sutra
        33
    sutra  
       2019-09-29 09:11:55 +08:00
    TgWechat 通过微信服务器交换公钥,如何避免交换公钥时的中间人攻击?
    free9fw
        34
    free9fw  
       2019-09-29 09:13:20 +08:00
    没有开源吗,对 LZ 的加密算法感兴趣
    shakoon
        35
    shakoon  
       2019-09-29 09:41:02 +08:00
    下载前看了一下帮助,才发现是 windows 程序啊。我看了半天帖子一直以为是手机 app,还在想切换窗口粘贴来粘贴去和麻烦呢,原来是我想多了
    shepherdlazy
        36
    shepherdlazy  
       2019-09-29 10:07:09 +08:00
    每个人都有一对 [公钥,私钥]
    要给对方发消息用对方的公钥加密,对方收到消息后用自己的私钥解密;
    =========================
    简单概括:
    公钥加密
    私钥解密
    ========================
    但是这东西产品话之后违法。。。 。。。
    zhao305149619
        37
    zhao305149619  
       2019-09-29 10:12:37 +08:00
    “功能很简单,A 和 B 都用 Chisechat 设置一个一样的密码(私下协商,打电话或者当面定好),A 把要发的内容放到 Chisechat 加密,再用聊天工具把加密内容发给 B,B 拿到密文在 Chisechat 中解密查看。“这样你是不是有机会看到或者解密聊天内容?
    shepherdlazy
        38
    shepherdlazy  
       2019-09-29 10:14:46 +08:00
    @zhao305149619 我觉得应该砍掉协商一个同样密码的步骤,就直接用对方公开的密钥加密
    shayang888
        39
    shayang888  
       2019-09-29 10:20:47 +08:00
    @laike9m 那群聊天也不是?
    shayang888
        40
    shayang888  
       2019-09-29 10:27:50 +08:00
    @neteroster 那群聊天也不是?
    wingpui
        41
    wingpui  
       2019-09-29 10:34:00 +08:00
    有人知道 TokQ 的开源地址吗
    vbvcvd
        42
    vbvcvd  
       2019-09-29 10:36:21 +08:00
    oversec 难道没人用吗?
    airfling
        43
    airfling  
       2019-09-29 10:38:49 +08:00
    其实本来没事的,你非要自己加密搞出事,如果电信公司分辨不出你这个流量,八成就会让你去喝茶了
    userdhf
        44
    userdhf  
       2019-09-29 10:42:21 +08:00
    给你个眼神,你自己体会
    david2011012
        45
    david2011012  
       2019-09-29 10:44:31 +08:00
    你最多就是实现了 ssh 加密吧?说那么多干嘛?你要是想做好,直接做到微信上,在微信上推广不是更好,直接在微信上发加密内容
    hinot
        46
    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
        47
    laike9m  
       2019-09-29 10:54:00 +08:00 via Android
    @shayang888 不是
    wang4012055
        48
    wang4012055  
       2019-09-29 11:07:53 +08:00   ❤️ 1
    然后发现输入法在监听你
    blankfire
        49
    blankfire  
       2019-09-29 11:26:52 +08:00
    辛亏一些人不是老大哥,真可怕,可以说是本格精神老大哥了
    youngliu
        50
    youngliu  
       2019-09-29 11:58:07 +08:00
    什么时候能 mac、手机、win 同步就 6 了
    shihira
        51
    shihira  
       2019-09-29 12:06:31 +08:00 via Android   ❤️ 3
    @salamanderMH 这我很想知道是哪条神仙政策不允许了,如果不准加密现在 HTTPS 是不是全都可以禁掉。这是我们公民应得的隐私权,碰壁就碰壁了再说,自我审查自我规限最为致命
    golden0125
        52
    golden0125  
       2019-09-29 13:36:52 +08:00
    挺好一软件,但杀毒报有高危行为,就删了,抱歉我对这方面比较在意
    dangyuluo
        53
    dangyuluo  
       2019-09-29 13:41:55 +08:00
    其实 我一直无法理解宣称的这种端到端加密安全性。又有谁能够保证第一次密钥交换的过程中不被服务器记录呢?
    niubee1
        54
    niubee1  
       2019-09-29 13:47:52 +08:00
    @dangyuluo 基于椭圆曲线的 ECDH 技术是通过零知识共享的方式分发的密钥, 所以不会被服务器记录
    delpo
        55
    delpo  
       2019-09-29 13:49:26 +08:00
    @dangyuluo 公钥被服务器记录没有问题,只要不被篡改就不会被中间人
    所以大多数端到端加密软件都提供公钥指纹验证功能,不过用户会不会用这个功能是另一回事
    Puterbuter
        56
    Puterbuter  
       2019-09-29 19:24:33 +08:00 via Android
    汉克儿,你来了
    geelaw
        57
    geelaw  
       2019-10-01 02:55:55 +08:00
    @dangyuluo #53 安全的密钥交换算法在所有通讯都被记录的情况下仍然保持安全。

    @niubee1 #54 零知识共享是什么?
    fantasynoff
        58
    fantasynoff  
       2019-10-01 07:44:41 +08:00
    手机上直接做加密输入法就好了,但是目前还没有人做
    bluefountain
        59
    bluefountain  
       2020-01-16 15:38:01 +08:00
    @dangyuluo 两个人洗桑拿的时候口头交换的密钥
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   980 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 21:38 · PVG 05:38 · LAX 14:38 · JFK 17:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.