[原創]程式設計師對私密聊天的亂想

anhkgg發表於2020-09-03

嘮叨

群裡有人推了個專案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. TgWechat

歡迎關注:漢客兒



2020安全開發者峰會(2020 SDC)議題徵集 中國.北京 7月!

相關文章