在硬體上執行加密——例如,硬體中的 AES
我試圖了解在硬體中執行的加密算法與在軟體中執行的加密算法之間的區別。從上一篇文章(見這裡:硬體實現的算法和軟體實現的算法之間的區別?),我對這個問題有部分答案。答案是,在軟體中執行加密算法通常意味著它在 CPU 或 GPU 上執行,而在硬體中執行加密算法意味著它在 FPGA 或 ASIC 上執行。
這是我的困惑:在這兩種情況下,算法仍然作為一組指令傳遞給 CPU、GPU、FPGA 或 ASIC。對我來說,這意味著算法被編譯成一組指令,這些指令傳遞給底層硬體(其中硬體是指 CPU、GPU、ASIC 或 FPGA)。所以這意味著所有四種情況都以完全相同的方式執行——這讓我想知道為什麼有些被稱為基於硬體,而另一些被稱為基於軟體。
有人請澄清一下嗎?
**這個問題不是前面問題的重複,因為我正在尋找兩者之間的操作差異。換句話說,假設我有一些數據要加密。有人可以給我從(1)硬體案例和(2)軟體案例的加密開始到結束的逐步過程嗎?我不是在尋找兩者的優點和缺點。我只是在尋找它們工作方式的差異。
“基於軟體”和“基於硬體”的區別在於經濟學。
從形式上的數學角度來看,沒有質的區別:算法接受一些輸入(包括隨機位源,用於隨機算法),並產生一些完全由輸入確定的輸出。從輸入中產生輸出的準確程度在該級別上沒有影響。
但實際上,必須引入一個新因素,而且它至關重要:金錢。每當某些應用程序(這裡我說的是一般性的,不僅僅是密碼學)要體現為有形系統時,無論是在建構(晶片、佈線、外殼……)還是在操作(功耗)方面,都需要付出一定的代價,重量,尺寸…)。建構器將嘗試最小化給定性能目標的成本。在可以做出的結構選擇中,一個非常基本的選擇是選擇“軟體”或“硬體”:
- 軟體路徑是關於使用一些通用晶片,通常稱為“CPU”,通過可程式性可以實現各種行為:CPU 是一個固定電路,但它可以解釋從一些記憶體儲存中獲得的指令。CPU 包括執行許多基本通用操作的電路,例如“將兩個 32 位整數相加”。
- 硬體路徑意味著直接從晶體管或基本邏輯門為手頭的任務建構專用電路。專用電路會變成ASIC或者FPGA(FPGA就像一個ASIC,可以擦一遍又畫一遍,很漂亮但是增加了功耗和晶片成本,同時降低了最高工作頻率)。
軟體路徑的好處是通用CPU是大批量生產的商品,單個價格相當低;從經濟上講,製造數百萬個 CPU 也證明了使用更精細的雕刻技術是合理的,這再次提升了性能(更高的工作頻率,更低的功耗)。此外,CPU 固有的多功能性允許減少系統所需的硬體數量,因為單個 CPU 可以執行大量功能。
軟體的缺點是 CPU 基本上是執行操作的解釋器,而且成本很高。與等效電路相比,要實現相同的算法,CPU 將調動更多數量級的晶體管和/或時鐘週期。使用專用電路可能會在這方面節省很多,或允許顯著的性能提升,或兩者兼而有之,但代價是多功能性大大降低。專用硬體也喪失了龐大生產系列的經濟效益;FPGA 試圖重新獲得這些優勢,但與 ASIC 相比在性能上有所損失。
因此,對於任何給定的應用程序,使用軟體還是硬體取決於系統應該做什麼。通常,CPU 更便宜,除非是非常專業的應用程序,這些應用程序並不真正需要多功能性,並且必須實現原始性能(例如,高能粒子加速器中的檢測器,必須每秒處理數以億計的數據;比特幣礦工,需要計算SHA-256 全天,只有 SHA-256;起搏器,必須以盡可能低的能量消耗可靠地調節患者的心跳)。
**這就是風景。這對加密算法意味著什麼?密碼學家在設計算法時一般都是這樣做的,也就是說,沒有考慮特定的應用程序。嗯,真的,他們確實有應用程序,但他們試圖使他們的算法適用於許多應用程序。他們認識到整個計算行業在兩種主要模型上執行,因此他們嘗試定義在其中一個或兩個模型中都“高性能”(快速、輕便、經濟……)的算法。
對於基於軟體的算法,這意味著使用 CPU 原生提供的操作。基於軟體的算法的一個例子是散列函式 SHA-256,它使用了大量的 32 位整數加法。
基於硬體的算法將更專注於產生更好的專用電路的操作。新的 SHA-3 函式(又名“Keccak”)就是這種類型:它是圍繞按位邏輯組合建構的。對於 CPU,32 位 ADD 和 32 位 XOR 具有相同的成本:兩者都是將在同一時間執行的基本操作,具有相同的 CPU 資源。但是當你使用硬體時,這兩種操作是完全不同的:ADD 需要更多的晶體管(因為進位傳播)和更深的電路(同樣是因為進位傳播),所以 XOR 更便宜(更少的晶體管,所以更少矽面積),能耗更輕,速度更快(因為電路更淺)。結果是,Keccak 往往是軟體的豬,但硬體的尖叫者。
當然,完整的情況是複雜的。有許多類型的 CPU,其中一些(GPU)針對通用 CPU 傳統上不擅長的任務(特別是高並行性)進行了優化。一些現代 CPU 現在包括專用於某些特定加密算法(例如用於AES 加密)的電路。此外,FPGA 有一些,比方說,傾向於 CPU,因為它們是可重新程式的,有些包括類似 CPU 的功能(RAM 塊,甚至嵌入式 DSP/微控制器)。這模糊了界限。
事實上,算法“用於軟體”或“用於硬體”的概念必須被理解為一種廣泛的設計分類,它更多地描述了產生算法的密碼學家的初始意圖,而不是明確定義的數學屬性。有一些極端情況,例如前 AES 候選RC6,它是純軟體(它使用整數乘法,硬體中非常昂貴的操作,恰好是大多數 CPU 的一部分,因為它是一個非常有用的操作很多情況下),以及舊的 GSM 電話加密算法A5/1,它在硬體上非常高效(可以在少於 500 個門中完成),但在軟體上卻非常緩慢和繁瑣。
大多數現代密碼設計都試圖變得通用,雖然它們通常意味著對軟體更友好或更硬體友好,但如果它們在任何一種情況下都不會產生糟糕的性能,這被認為是一件好事。這可能是讓 Rijndael 成為 AES 競賽獲勝者的原因之一,也許是主要原因:雖然在大型 PC 上表現不佳,但在所有設想的軟體平台和專用硬體上仍然表現不錯;最終,這允許將這種專用硬體包含在現代 CPU 產品線中。
一個例外是密碼散列函式,它的目標是在防御者的平台上最有效(假設是通用 PC,即軟體的縮影),並且在專用硬體上盡可能慢和昂貴。最近的密碼雜湊競賽揭示了許多候選人試圖通過廣泛使用 RAM(FPGA 中的傳統痛點)或大量使用乘法(如Makwa)來實現這一目標。
有明確的硬體塊有兩個原因:速度和功率。速度因素更多是數據流的問題,而功耗問題更多是嵌入式系統的問題。如果您擁有無限的電源訪問權限,並且不受 IO 限制,則沒有理由花時間和金錢將 AES 塊放入您的 CPU。
在速度點上,雖然這取決於實現,但在某些實現中,您可以在 8 個週期內從 AES 塊中得到答案。AES 的軟體實現大約需要 10k 個週期(您可以更快地獲得這個,但這是來自我拍攝的快照)。
在功率方面,硬體中的 AES 在每比特基礎上的功率大約是非加密儲存的 80 倍。這是一個估計值,但實際上只會隨著特性變得更小而變得更糟,因為晶體管的增益只會降低。