Rc4
如何從 RC4 中的 IV+Key 生成 Keystream
因此,我知道密鑰流是從密鑰生成的,並且是您要發送的消息的長度,因此您可以正確地對每一位進行異或。但是我很難找到和理解從 IV 和密鑰創建密鑰流的算法。
我的一個想法是,如果您有一條長度為 100 的消息和長度為 10 的密鑰,那麼您的 IV 是 90 位來覆蓋消息的其餘部分,然後密鑰字元串就是 IV + 密鑰的串聯。
Key的長度和IV的長度與消息的長度無關。
RC4已棄用。它應該使用的方式是:
- 生成一個足夠寬的隨機 IV,使其保持唯一(例如 32 個字節),並將其作為密文的標頭髮出,因為接收者將需要它。
- 連接鍵(限制為 256 減去 IV 字節大小)和 IV
- 用它初始化密碼(在連接的密鑰和 IV 上循環有 256 個步驟)。
- 生成與明文一樣多的輸出,並將其用作與明文異或的密鑰流,從而產生密文。
但是存在各種攻擊。如果由於某種原因,一個人被過去的密碼鎖定(而不是更安全、更快和更少 RAM 密集型的 ChaCha),並且仍然想要安全,建議至少丟棄一些初始密鑰流(例如前 1024 個字節)在 4 之前的中間步驟中。
當然,如果一個人被特定協議鎖定,則必須按照該協議進行。
注意:如果密鑰來自使用者記憶的密碼,那麼強烈建議使用某種形式的拉伸來進行密碼到密鑰的轉換:
- 最好的是現代且參數化的密碼散列函式,例如Argon2或Scrypt。
- 如果沒有,我們可以使用 RC4 本身,通過使用跳過的密鑰流數量作為工作因子參數(例如 2 22字節)。此外,我們需要限制密碼長度以確保 IV 仍有空間。
獨立地,密碼的字元集必須明確定義(例如 UTF-8)。