Signal是在IT界與安全界都非常有名的一個(gè)端對(duì)端加密產(chǎn)品,它既符合FS(Forward secrecy,前向安全),也同時(shí)符合PCS(Post-Compromise security,后向安全)。
Signal的核心技術(shù)是X3DH(3倍增加版的Diffie Hellman),以及Double Ratchet(雙棘輪)
我打算分開(kāi)兩篇文章詳解相關(guān)的技術(shù)細(xì)節(jié):
第一篇:簡(jiǎn)單講解相關(guān)的技術(shù)背景,以及代碼級(jí)別詳解X3DH。
第二篇:詳解Double Ratchet雙棘輪的算法。
下面開(kāi)始第一篇,我們先講講剛剛提到的技術(shù)點(diǎn):FS前向安全,PCS后向安全,DH算法。然后再講密碼學(xué)中的HMAC, KDF, HKDF,這些跟雙棘輪有關(guān)。然后再細(xì)講X3DH。
一些技術(shù)背景
Forward secrecy,前向安全
前向安全,一般人的理解是:如果某一輪的密鑰泄漏了,不會(huì)導(dǎo)致之前的消息被破解。但我查過(guò)一些相關(guān)的文獻(xiàn),如Wiki,Handbook of applied cryptography等,定義可能比較多,綜合了一下,我更傾向于將前向安全定義為:
FS/前向安全 = 無(wú)論long-term key長(zhǎng)期密鑰,或者中期密鑰,或者某輪密鑰泄露,都不會(huì)導(dǎo)致之前的消息被破解。
Post-Compromise security / Future Secrecy / 后向安全
同樣,我更傾向于將后向安全定義為:在密鑰Compromise之后, 在一定時(shí)間內(nèi),可以恢復(fù)。(recovery from compromise)
DH (Diffie Hellman) / ECDH
這個(gè)到處都有說(shuō),不展開(kāi)了,最簡(jiǎn)單的理解是:
DH: A的私鑰 + B的公鑰 = 密鑰 = A的公鑰 + B的私鑰
ECDH就是基于橢圓曲線的Diffie Hellman。
HMAC
全稱(chēng)Hash-based Message Authentication Code,就是用于生成摘要,驗(yàn)證消息完整性以及源身份。不再展開(kāi)了。
KDF
KDF全稱(chēng)是key derivation function,我也不知道怎么翻譯好。像上面說(shuō)的DH出來(lái)的密鑰,其實(shí)不是離散均勻的,更多情況下需要KDF或HKDF
HKDF
基于HMAC的KDF,細(xì)節(jié)可以看看其它文章,簡(jiǎn)單地說(shuō),就是
HKDF(key, salt, info) => T(0), T(1), T(2), T(..)個(gè)密鑰。
X3DH
我們剛剛說(shuō)了X3DH就是三倍的DH。從signal官方文檔說(shuō),X3DH就是下圖的樣子:

圖中:
IKA:A的長(zhǎng)期Key Pair;
EKA:A的臨時(shí)Key Pair;
IKB:B的長(zhǎng)期Key Pair;
SPKB:B的中期Key Pair;
OPKB:B的臨時(shí)Key Pair;
圖中的1,2,3,4。其實(shí)就是做4次ECDH。我們從代碼看看他是如何實(shí)現(xiàn)的。
PS:我們拿Javascript的代碼,更好理解

我已經(jīng)在圖上標(biāo)注了如何做的。簡(jiǎn)單說(shuō),就是:
Final = (DH1 + DH2 + DH3 + DH4)
值得注意的是,像上圖的虛線,X3DH并不一定需要OPKB,從代碼也可以看到,ECDH4不一定會(huì)做。
Double Ratchet雙棘輪
上面說(shuō)的內(nèi)容算是比較簡(jiǎn)單的,雙棘輪才是Signal的經(jīng)典,我們將在下一篇文章詳細(xì)講解。如果你對(duì)HKDF,HMAC,X3DH還不太清楚,可以多看幾遍此文章。