為什麼不能在 Cuda 中實現 bcrypt?
我聽說雖然在 CUDA(或任何其他 GPU 平台)中實現 MD5、SHA-1、SHA-256 等消息摘要功能很容易,但在那裡實現 bcrypt 是不可能的。
bcrypt 與這些散列函式不同,因為 Blowfish 是一種分組密碼,並且為了產生單向散列,使用了“回饋”。
我對 GPU 平台不太熟悉。有誰知道 bcrypt 是否可以移植到 GPU,如果不能,為什麼?
這並非不可能,只是更難有效實施。這是因為 RAM。在 GPU 中,您有許多可以執行 32 位操作的核心。只要它們在各自的寄存器上執行,它們就會在每個週期和每個核心上執行一個操作。然而,RAM 訪問更麻煩。每組核心都可以訪問少量的共享 RAM,所有核心都可以讀寫 GPU 主 RAM,但有訪問限制:並非所有核心都可以同時讀取或寫入 RAM(主 RAM 限制更嚴格) )。
現在 bcrypt 是 Blowfish 密鑰調度的變體,它是在一個表(幾千字節)上定義的,該表在整個算法中不斷訪問和修改。由於表的大小,每個核心都必須將其儲存在 GPU 主 RAM 中,並且它們將競爭記憶體匯流排的使用。所以 bcrypt會執行——但不會完全並行。在任何時候,大多數核心都會停止,等待記憶體匯流排空閒。這來自於 bcrypt 所包含的基本操作的類型,而不是來自於 bcrypt 是從分組密碼的密鑰調度派生的事實。
對於 SHA-1 或 SHA-256,計算完全包含在少數寄存器上的 32 位操作,因此密碼破解程序將在根本不進行任何記憶體訪問的情況下執行,並且很容易實現完全並行(我在我的 GeForce 上做到了) 9800 GTX+,我通過簡單的展開 SHA-1 實現獲得了大約 98% 的理論最大速度)。
有關 CUDA 程式模型的詳細資訊,請查看CUDA C 程式指南。此外,bcrypt 的作者現在提出了scrypt(**編輯:**實際上那不是同一個人;scrypt 的作者是 Colin Percival,而 bcrypt 是由 Niels Provos 和 David Mazières 設計的),它在記憶體訪問上更加繁重,確切地說因此在 GPU 和 FPGA 上很難實現。