Hash

使用共享密鑰建立加密密鑰

  • June 27, 2015

我需要在 8 位微控制器網路上建立一些安全性。非常有限的 RAM、CPU 和數據包大小。

我已經將注意力集中在一個基於共享秘密的方案上。設置共享密鑰超出範圍。加密是 AES128。

為了在兩個節點 A 和 B 之間安全地創建和共享加密密鑰,我做了這個:

A creates an encryption key Ks = H(Ns, R0)    
A sends R0 to  B    
B calculates key K's = H(Ns, R0)

當且僅當 B 有 Ns 時,K’s 和 Ks 將相同

Where H = Hash(R0|Ns|R0), or Hash(R0|Ns|H(Ns)) or maybe HMAC (still undecided)
R0 = random number
Ns = Shared network secret.

Ns is 16 byte. R0 is 4 byte. Both come directly from a RNG.

主要目標是:防篡改、前向保密。

暫時不關心對側通道或重放攻擊的抵抗。

R0(因此 Ks)將定期更新,可能每 100-10K 獨立數據包傳輸。

方案好嗎?是否需要增加 Ns 或 R0 的大小?最重要的是,這個方案能保證 N 的安全嗎?能保證多久?

=============== 編輯:

註冊前向保密:

我想確保只要網路機密是安全的,如果未來的會話密鑰 (Ks) 被洩露,過去的會話密鑰和數據也不應該被洩露。此外,會話密鑰的重新協商應該重新建立安全性。

這可能不是前向保密的確切定義,但這就是我的意思。我沒有會話,但我會定期過期密鑰,並在經過一段時間或一些數據包計數等之後,將其稱為會話。

===============

註冊 H()

根據答案,我已將 AES(k=Ns, d=R0) 添加到 H() 的函式列表中。將根據時間/時鐘要求決定。

===============

目前,根據答案,我推斷 H() 的所有目前選項都將創建足夠好的密鑰來保護加密數據和網路機密 N。

如果您正在閱讀本文並認為其中任何一個可能不安全,請發表評論或回答。謝謝。

您不需要雜湊函式。鑑於您已經在使用 AES-128,並且您的主密鑰 $ N_s $ 長度為 128 位,是派生會話密鑰的絕佳方法 $ K_s $ 將加密隨機數 $ R_0 $ (填充到完整的 AES 塊)使用 AES-128(在 ECB 模式下,即使用原始塊密碼) $ N_s $ 作為關鍵。

即使攻擊者可以選擇隨機數 $ R_0 $ ,並且可以獲得所有對應的會話密鑰,恢復 $ N_s $ 仍然需要對 AES 進行實際的選擇明文密鑰恢復攻擊。目前還沒有這樣的攻擊,如果被發現,AES 將被視為完全破壞。


但是,還值得注意的是,此密鑰派生方案(如上所述,或您的問題中提出的)不提供前向保密;擷取過去會話的攻擊者,包括 $ R_0 $ ,如果他們以後以某種方式學習,可以輕鬆解密 $ N_s $ .

但是,可以使用密鑰更新實現類似於前向保密的功能。也就是說,不是從固定的主密鑰派生臨時會話密鑰,而是定期從舊的主密鑰派生的主密鑰,然後刪除舊密鑰。即使新密鑰被洩露,這種擦除也會保護舊消息不被解密;但是,它不會以任何方式保護未來的消息免受舊密鑰的損害。

一種方法是計算新的主密鑰 $ K_n $ 從舊鑰匙 $ K_{n-1} $ 作為

$$ K_n = \text{AES}{K{n-1}}(A), $$和相應的會話密鑰為$$ S_n = \text{AES}{K_n}(B), $$在哪裡 $ A $ 和 $ B $ 是任意兩個不同的常數密碼塊(例如全零和全一)。然後你會使用 $ S_n $ 使用經過身份驗證的加密模式加密您的消息。 保持兩個通信方之間的密鑰同步可能有點棘手。一種方法是儲存密鑰更新計數器 $ n $ 明確地,並與每條消息一起明文傳輸。收到帶有新計數器值標記的消息後 $ n’ > n $ (和 $ n’ < n+2^b $ 對於一些合理的常數 $ b $ ,以防止拒絕服務攻擊),您將計算 $ K{n’} $ 和 $ S_{n’} $ 並嘗試使用它們來解密和驗證消息;如果身份驗證成功,您將自己的計數器增加到 $ n’ $ 並開始使用 $ K_{n’} $ 和 $ S_{n’} $ 作為新密鑰;否則,您會認為該消息是虛假的並忽略它。

請注意,使用 a 就足夠了 $ b $ -位計數器,讓它環繞。對於大多數應用程序, $ b $ 可以相當小;說, $ b = 8 $ , 甚至 $ b = 1 $ . 也可以在根本不發送計數器的情況下實現密鑰同步,但這會稍微複雜一些。(基本上,每當您收到無法進行身份驗證的消息時 $ S_n $ ,您需要重試身份驗證 $ S_{n+1} $ .)

引用自:https://crypto.stackexchange.com/questions/26534