密碼和算法的術語不一致
我對密碼算法的所有不同類型的名稱感到困惑。
有分組密碼和流密碼(AES 和 RC4)。
有對稱和非對稱加密(AES 和 RSA)。
我知道分組密碼和流密碼是對稱加密,但維基百科讓事情變得更加困難,因為它聲明它是相反的:
按使用的密鑰類型,密碼分為:
對稱密鑰算法(Private-key cryptography),其中相同的密鑰用於加密和解密,以及非對稱密鑰算法(Public-key cryptography),其中兩個不同的密鑰用於加密和解密。
然後它繼續說:
根據輸入數據的類型,密碼可以分為兩種類型:
分組密碼,對固定大小的數據塊進行加密,流密碼,對連續的數據流進行加密
但是,RSA 不是密碼,因為它既不是分組密碼也不是流密碼,不是嗎?
那麼我是否遺漏了什麼,或者這個術語確實存在差距?
聽起來您基本上是在詢問“密碼”一詞的定義。我同意它有點模糊和復雜——這主要是因為“密碼”本身並不是現代密碼學中一個精確定義的技術術語,而是一個描述性的詞,其含義與大多數其他英語單詞一樣,已經逐漸演變時間。
所以,讓我們從頭開始。
任何一本好詞典都可以告訴您, “cipher”一詞最初來自阿拉伯語單詞ṣifr (صفر),意思是“空”或“無”,也是數字零。隨著阿拉伯數字(值得注意的是,與較舊的羅馬數字相比,它們包含一個零符號)被引入歐洲,這個詞被採用為中世紀拉丁語cifra,其含義擴大到涵蓋任何阿拉伯數字元號,甚至任何其他奇怪的標誌或符號。(這些意義仍然保留在例如法語單詞chiffre中,其含義包括“數字”、“數字”和“密碼”。)
目前尚不清楚用於阿拉伯數字的這個詞是如何也適用於任何類型的秘密或晦澀的書寫系統的,但鑑於新的數字系統只是逐漸採用,並且在公眾看來長期以來一直是一種奇怪而僅由少數博學人士和秘密商人使用的難以理解的符號(他們通常也對秘密記錄和討論金融和政治事務感興趣,也是密碼學的早期採用者),這也許不足為奇。
無論如何,到 19 世紀和 20 世紀初,在“經典密碼學”時代的鼎盛時期,在電腦和現代密碼學理論引入之前,傳輸加密消息的方法通常分為兩大類:“codes”,用特定的約定符號(通常分佈在“codebook”中)替換單詞或整個片語,以及“ciphers”,基於替換和/或重新排列消息中的單個字母。雖然程式碼通常被認為更安全(因為一個好的程式碼為密碼分析者提供了更少的機會來發現消息中的模式),密碼具有能夠加密任何消息的明確優勢,
古典時代使用的密碼又分為幾種不同的類型,例如:
- 替換密碼,它通過將消息音譯成秘密字母表來工作;和
- transposition ciphers,它使用普通字母表,但根據一些預先安排的模式將消息的字母打亂成看似隨機的順序。
當然,高級密碼可能結合了這兩種類型,甚至還有一些系統,比如法國大密碼,它結合了密碼和程式碼的元素。此外,雖然最簡單的替換密碼只使用一個固定的秘密字母表,但更高級的方案——比如 Bellaso 的chiffre indéchiffrable,通常被誤認為是 Blaise de Vigenère 或 20 世紀後來的轉子機器密碼——對每個字母使用不同的字母表消息,使它們更難破解。
在 1900 年代早期和中期的大部分時間裡,在從古典密碼學到現代密碼學的過渡時期,機電轉子機器密碼,例如著名的德國二戰Enigma 機器,都是最先進的。它們(如 Bellaso、Vigenère 和其他人的較舊的多字母替換密碼)可能被視為流密碼的早期範例,儘管“流密碼”一詞在 1970 年代之前並未真正進入常用詞彙:
[
使用 Google Ngram Viewer 生成的 1900 年至 2000 年間術語“流密碼”、“分組密碼”、“替換密碼”和“轉置密碼”的相對頻率圖。](https://books.google.com/ngrams/graph?content=stream+cipher%2Cblock+cipher%2Csubstitution+cipher%2Ctransposition+cipher&year_start=1900&year_end=2000&corpus=15&smoothing=3)
1970 年代發生的是一種新型密碼工具的發明——分組密碼,由 IBM 的 Horst Feistel 以現代形式開發,他設計了最終成為DES的路西法密碼。(當然,這個想法並非完全沒有先例:從 1929 年開始,希爾密碼也對字元塊進行了操作,就像各種早期的測謊替代密碼一樣,當然,大部分一般理論都是由克勞德香農介紹的1949 年。不過,在許多方面,路西法和 DES 確實代表了與早期民用密碼學傳統的強烈而徹底的背離。)
分組密碼的問題在於,與流密碼(從廣義上講,它涵蓋了幾乎所有能夠加密任意長消息的實用加密系統)不同,分組密碼本身並不是很有用:它很棒如果您只是碰巧需要將 64 或 128 位的塊加密為相同長度的其他塊,但這種情況多久發生一次?
為了使分組密碼實際有用,您需要將它與某種更高級別的方案(通常稱為操作模式)結合起來,以將其轉變為更通用的加密方案(通常是一些一種廣義上的流密碼)。因此,分組密碼可能更好地被視為建構密碼(和其他密碼方案)的有用工具,而不是其本身的通用密碼。
那麼,為什麼要給它們加上“密碼”這個名字呢?嗯,一方面,這是 IBM 和 NBS(現為 NIST)的人們在 1970 年代選擇使用的名稱,而世界其他地區只是效仿他們的做法。從歷史的角度來看,這也是一個相當容易理解的決定:在當時的密碼學術語中,“密碼”是用來加密數據的東西,這當然是 DES 所做的,即使是以某種非正常的方式。因此,在當時將其稱為“密碼”(特別是“分組密碼”)是完全合理的,以將其與當時使用的其他類型的密碼區分開來。
然而,這一切的最終結果是,今天,我們在現代密碼學中使用了兩種不同的“密碼”:用於加密(流)數據的流密碼和(大部分)用於加密的分組密碼用於建構其他類型的加密算法(包括流密碼)。
那麼像 RSA 這樣的非對稱加密方案呢?
好吧,它們肯定是廣義上的“用於加密數據的東西”的密碼,而且確實有幾位作者確實使用了諸如“公鑰密碼”或“非對稱密碼”之類的術語。
另一方面,如果分組密碼在其直接應用中受到一定限制,那麼像 RSA 這樣的公鑰算法就更是如此。一方面,分組密碼可以加密任何 64 位或 128 位的字元串;RSA 可以加密介於 0 和接收者的 RSA 模數(減一)之間的數字。這可能看起來差別不大(因為將位串映射到數字並返回很容易),但請考慮這樣一個事實,即這意味著空間可直接加密的消息對於每個 RSA 密鑰都是不同的。
此外,“教科書 RSA”僅在消息不可預測、或多或少均勻分佈在 0 和模數之間以及同一消息從未使用多個 RSA 密鑰加密的情況下才是安全的。如果消息屬於整個範圍的一小部分,攻擊者可以通過暴力攻擊輕鬆解密它們;如果它們與模數相比太小,或者如果使用太多密鑰對同一消息進行加密,則它們可能比暴力破解更容易破解加密。
此外,即使通過適當的填充(有效地向消息添加足夠的(偽)隨機位以使其唯一、不可預測且足夠長)來解決這些問題,RSA(像大多數非對稱加密方案一樣)仍然不適合直接加密長消息。因此,使用 RSA 的標準方式是混合加密方案的一部分,其中數據首先使用具有隨機密鑰的對稱加密方案(即廣義上的流密碼)加密,然後使用隨機密鑰加密該隨機密鑰RSA。
所有這些問題使一些密碼學家(在某種程度上包括我自己)不願意將 RSA 稱為“密碼”,就像該術語適用於現代流密碼和早期的經典替換/轉置密碼一樣。在這些人的心目中,“密碼”是您可以用來直接加密普通明文消息(而不僅僅是某個區間內的隨機數)的東西,而 RSA 最好被描述為“算法”(在其“教科書”中) ”形式,它本身並不真正安全)或“密碼系統”(具有將其轉變為安全且可用的加密方案所需的所有額外陷阱)。
(Ps. 值得注意的是,不同的公鑰加密方案之間存在很大差異,就它們可以直接加密的內容而言。例如,傳統的ElGamal 加密非常靈活,可以安全地加密任何小於 (固定)組的順序,可能並且通常是由所有接收者共享的。相反,對於大多數基於橢圓曲線的系統,即使只是有效且明確地將任意消息編碼為可加密曲線點也是一項不平凡的練習。 )