使用一次性密碼器進行身份驗證
我正在建構一個包含兩個無線通信節點的小型嵌入式系統。我使用的微控制器非常有限:它們只有 256 字節的 RAM。我希望能夠對節點之間發送和接收的消息進行身份驗證,但是由於系統的限制(缺少 RAM),HMAC 等傳統方法是不可能的。
我確實有一個大的(2 兆位)EEPROM,它基本上沒有使用。我想使用這個空間來儲存一個(相對)大的一次性便箋簿,可用於驗證消息,這些消息只有幾個字節長。我不關心消息的保密性,只關心它們的不可偽造性和完整性。例如,如果每條消息只使用 4 個字節的填充,那麼填充應該遠遠超過系統預期的有用性。最後,不能保證消息被其他節點接收(例如,由於乾擾,惡意與否)。
是否有任何使用一次性密碼本進行消息身份驗證的方案?假設一次性墊是真正隨機的。或者這是一個完全不安全的想法?
實際上,這根本不是一個愚蠢的想法。您當然可以使用一次性墊進行完整性檢查。但是,我相信您需要比您預期的更快地使用一次性填充位,以達到最多的偽造機率 $ 2^{-32} $ ,我相信每個數據包至少需要 64 個填充位(假設資訊理論安全——也就是說,我們不包括任何攻擊者難以解決的計算問題)。
一種方法是做一個多項式散列 $ GF(2^{32}) $ ; 也就是說,您使用填充的 32 位作為值 $ H $ ,併計算值 $ V = X_i H^i + X_{i-1} H^{i-1} + … + X_1 H^1 + R $ (消息在哪裡 $ (X_i, X_{i-1}, …, X_1 $ , 和 $ R $ 距離您的墊子還有 32 個其他位,並且計算在其中完成 $ GF(2^{32}) $ ; 價值 $ V $ 是您與數據包一起發送的標籤。這可證明修改後的數據包的偽造機率最多為 $ i 2^{-32} $ 和一個盲目的偽造機率 $ 2^{-32} $ . 你需要實現一個 $ GF(2^{32}) $ 乘法常式;假設您不需要極高的速度,那並不難。
話雖如此,我是否可以提出一種完全不同的方法:如何在Davies-Meyer結構中使用Speck和鑰匙?Speck 是一種分組密碼,可以用最少的記憶體進行評估,而 Davies-Meyer 結構不需要太多記憶體。你會從一個秘密狀態開始建構;假設您不使用 128 的塊大小,您還希望通過散列一些其他秘密數據來結束散列)。這種方法的優點:您可以為每個數據包重複使用相同的秘密數據(密鑰材料)(因此沒有用完的可能性);您無需擔心封包遺失(因為這種結構是無狀態的),它應該符合您的限制。