密碼學 - RC4

RC4 是 Ron Rivest 於 1987 年設計的串流加密演算法,在早期因其計算效率和簡單實作而成為資料加密的熱門選擇。然而,由於其安全弱點,RC4 已經逐漸淡出大眾的視野。

本文將介紹 RC4 的基本概念和原理,幫助各位更好地理解這個重要的密碼學里程碑。

RC4 最初是 RSA 公司的一個專有技術,然而在 1994 年時意外外洩,被社群稱之為 ARC4(Alleged RC4),並開發了許多社群版本。

最初因為簡單實作與效率的關係,在許多協定中被採用,包括 WEP 無線網路協定及早期的 TLS 加密標準。但由於安全性缺陷,這些協定最終都遭到淘汰。WEP 因使用 RC4 而導致的安全漏洞,成為攻擊者的主要突破口,並最終導致該協定被棄用。同樣地,RC4 於 TLS 中的使用也受到極大批評,最終由 RFC 7465 正式禁止使用。RC4

RC4 的運作方式

RC4 是一種典型的串流加密演算法,其透過生成一系列偽隨機位元組來與明文進行 XOR 運算以達到加密效果。RC4 的兩個核心組件為:

  • 金鑰設定演算法 (Key Scheduling Algorithm, KSA)
  • 偽隨機生成演算法 (Pseudo-Random Generation Algorithm, PRGA)

KSA 負責根據給定的金鑰初始化所有可能位元組值的排列,隨後 PRGA 基於該排列生成加密或解密所需的金鑰流。

以下為展示 RC4 基本操作的 C 語言實作範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#define SWAP(a, b, t)    t=b; b=a; a=t

static void RC4Key(unsigned char *K, unsigned char *pKey, unsigned long ulLen){
unsigned char s = 0, t;
int i;
for (i = 0; i < 256; i++) K[i] = i;
for (i = 0; i < 256; i++) {
s += pKey[i % ulLen] + K[i];
SWAP(K[i], K[s], t);
}
}

static void RC4Stream(unsigned char *K, unsigned char *p, unsigned long l){
unsigned char i = 0, s = 0, t;
while (l--) {
i++;
s += K[i];
SWAP(K[i], K[s], t);
*p++ ^= K[(K[i] + K[s]) & 0xFF];
}
}

RC4 的安全性問題

雖然 RC4 一度被廣泛使用,但其本質上的安全性缺陷使其成為攻擊者的目標。RC4 缺乏初始化向量(IV)或隨機數(nonce)的設計,這導致在重複使用相同金鑰時容易受到攻擊。這個缺陷在 WEP 中尤其顯著。雖然 WEP 使用了 IV,但由於 IV 長度過短(24 位)且生成方式不安全,導致金鑰重複使用和被攻擊的風險。這些弱點使得 Fluhrer、Mantin 和 Shamir 等人的攻擊成功暴露 RC4 的弱點,並最終使 WEP 成為不安全的協定。

此外,RC4 生成的金鑰流中還存在統計偏差,使得加密結果具有可預測性,進而使攻擊者能夠通過分析密文來得知部分明文內容。

例如,吳宏俊(HongJun Wu)發現 RC4 在 Microsoft Word 和 Excel 中的使用存在設計缺陷,這些缺陷增加了該演算法被攻擊的可能性。
他的發現發表在此 The Misuse of RC4 in Microsoft Word and Excel

RC4 的替代方案

由於 RC4 存在諸多安全性弱點,現代的加密標準已經逐漸轉向更安全的替代方案。例如,ChaCha20 作為 RC4 的替代,憑藉其改進的安全性設計成為現代串流加密演算法的首選之一。ChaCha20 由 Daniel Bernstein 開發,具有對抗 RC4 類型攻擊的強韌性,因此被納入最新版本的 TLS 標準中。

其他值得關注的串流加密演算法包括 HC-128、Rabbit、Salsa20 和 Snow,它們均在設計上較 RC4 更加安全,並提供了不同的功能特性來應對各類應用需求。

結論

RC4 作為早期數位加密的重要演算法,在其歷史中發揮了至關重要的作用。然而,由於其固有的安全性缺陷,RC4 現已不再適用於現代的安全需求。如今,ChaCha20 等更強大的串流加密演算法已取代了 RC4,並為數位通訊提供了更為穩固的保護。

RC4 的逐步淘汰提醒我們,隨著網路環境和威脅的演進,持續評估和改進加密標準至關重要,以保障通訊和資料的安全性。同時,在任何加密實作中,正確使用隨機數、避免金鑰重複,以及遵循最佳安全實踐,都是保障系統安全的基礎。

參考資料

也許你也會想看看