比特幣加密常式的合理實現 wrt 側通道攻擊
比特幣使用SHA-256、Base58Check、ECDSA ( Sep256k1 ) 和RIPEMD-160作為其加密的基礎(有關如何創建地址的簡短指南,請參閱本文)。
我想創建一個基於 iOS 的錢包應用程序,提供合理的安全性。
OpenSSL 在 iOS 上不可用,並且是一個很大的依賴項。我正在尋找的是主要關注比特幣算法的專業庫。OpenSSL 程式碼也很難理解,讓我懷疑是否真的沒有更好的方法。
- libbitcoin和官方的Bitcoin-Qt客戶端都使用 OpenSSL。
- OpenSSL 通常有一個混合的接收。
- OpenSSL 還增加了最近在新聞中出現的交易延展性問題,因為 OpenSSL 接受簽名的標準比嚴格必要的標準更寬鬆。
算法集合的另一個選項是Crypto++,到目前為止我在現有的比特幣客戶端中還沒有看到它。
Chromium 包括ECDSA的 Go-sources。
Sep256k1的sipa實現以非常高效而著稱。它也列在 gh/bitcoin 下。
出版物中最近的許多攻擊都使用了側通道攻擊,因此有必要使用具有恆定時間執行的算法(以避免與時間相關的攻擊)以及針對基於記憶體的攻擊以及最近甚至與音頻相關的攻擊的額外保護,其中硬體雜訊本身產生的可用於獲取私鑰的知識。
儘管許多攻擊需要收集多個簽名,但人們無法知道最終使用者將如何使用該應用程序。我不想依賴這樣的假設,即使用者每天只在不同的商店進行幾次交易並經常交換他們的比特幣地址。
我的問題是:
比特幣使用的算法是否有“理智”的實現?例如,是否存在包含針對側通道攻擊的防禦的高質量實現?
OpenSSL 是否已經防止側通道攻擊?
- 移動應用程序比站在家裡的台式電腦更容易受到側通道攻擊,因此台式機上相當安全的東西對於移動應用程序可能不夠安全。
- 由於 OpenSSL 可能是最常用的加密庫,它也可能是最受攻擊的庫,因此在查看一般安全性時處於領先地位。但是,專用庫可能對它們實現的少數算法具有更高的質量,因為程式碼庫要小得多且更容易理解。
我如何訓練自己評估現有實現是否容易受到某些類型的攻擊?
- 密碼算法的實現通常只有很差的文件記錄和優化,以至於程式碼由與任意看起來的運算符連結在一起的幻數組成。
- 我已經提到的一個方面是恆定執行時間的概念,它可以對抗與時間相關的攻擊。
是否有很好的資源可以解釋如何自己實現這些算法?我不打算為應用程序使用我自己的實現,但我有興趣了解我正在使用的東西是如何工作的。入門門檻似乎很高。《橢圓曲線密碼學指南》這本書可以推薦嗎?
PS:我知道 Apple 不會在他們的商店中優待比特幣相關的應用程序。但是,這個討論超出了這個問題的範圍。
PS2:Base58Check 僅用作一種特殊編碼,使比特幣地址和密鑰對最終使用者更具可讀性。那裡不涉及密碼學,而且很容易實現——我只是為了完整起見把它包括在這裡。
比特幣使用的算法是否有“理智”的實現?例如,是否存在包含針對側通道攻擊的防禦的高質量實現?
libsecp256k1
OpenSSL 是否已經防止側通道攻擊?
哈哈*
我如何訓練自己評估現有實現是否容易受到某些類型的攻擊?
審查索賠。如果它甚至沒有聲稱側通道阻力,請擔心。
查看跟踪記錄。如果它反复遭受側通道攻擊,並且沒有聲稱已採取認真的綜合方法來修復它們,請擔心。
辨識感興趣的物理可觀察物。如果您在網際網路上交談,您可能不需要擔心功率分析。但是,如果您正在製作一張倒霉的 luser 會將其放入惡意 ATM 的智能卡,您可能需要擔心它。
對於定時側通道:
- 確定一組您將其視為常數時間的原始計算。典型集合:複製數據, $ w $ -位加法和減法,按位運算,常量移位和循環。乘法可能是有問題的。
- 遵循秘密的數據流。如果你能找到任何依賴於秘密值的原始計算,比如分支的條件或記憶體引用的地址,bzzzzzrt。如果你能證明它們隻流入安全操作,你可能會沒事。
盡量不要一次處理單個位,並跟上最先進的技術,因為技術發展很快。
注意像gfverif這樣的工具。
是否有很好的資源可以解釋如何自己實現這些算法?我不打算為應用程序使用我自己的實現,但我有興趣了解我正在使用的東西是如何工作的。入門門檻似乎很高。可以推荐一下《橢圓曲線密碼學指南》這本書嗎?
我們友好的鄰居熊有一些很好的參考。閱讀現有的實現是必不可少的,許多其他優秀的密碼學家糟糕的程式碼質量可以提供很好的動力去自己實現。對於橢圓曲線密碼學的參考資料,我們在這個網站上有很多!
*公平地說,現代 OpenSSL 團隊繼承了一個巨大的遺留程式碼庫,並且他們正在盡最大努力清理它並在不嚴重損害性能的情況下插入側通道。不幸的是,這些目標——維護遺留程式碼庫,保持不良密碼系統的性能——經常與邊通道安全發生衝突。