跳轉至內容

Io 程式設計/附加元件和您/Blowfish

來自華夏公益教科書

什麼是 Blowfish?

[編輯 | 編輯原始碼]

首先,Blowfish 究竟是什麼?

“Blowfish 是一種對稱分組密碼,可以用作 DES 或 IDEA 的直接替代。它採用可變長度金鑰,從 32 位到 448 位,使其非常適合國內和出口使用。Blowfish 由布魯斯·施奈爾於 1993 年設計,作為現有加密演算法的快速、免費替代方案。從那時起,它受到了相當大的分析,並且正在逐漸被接受為一種強大的加密演算法。Blowfish 沒有專利和免版稅,並且可免費用於所有用途。” — http://www.schneier.com/blowfish.html

在撰寫本文時,它是一段 17 年曆史的加密程式碼,至今仍未被破解,儘管它有一個推薦用於更新應用程式的替代演算法(Twofish),但 Blowfish 對於新舊應用程式來說仍然相當安全。

可用性

[編輯 | 編輯原始碼]

Blowfish 附加元件與 Io 原始碼分發一起提供,並且沒有外部依賴項,因此如果您使用 Io 直譯器編譯了附加元件並且您的直譯器支援載入附加元件,那麼它將可用。如果您在您的平臺上按照 Io 的標準構建程式進行操作,或者下載了二進位制包,那麼您很可能可以訪問 Blowfish 物件。

何時加密

[編輯 | 編輯原始碼]

請注意,加密可能是一個繁瑣的操作,因為它為任何資料處理管道添加了一個額外的步驟,您必須有一些方法來安全地獲取和處理加密金鑰,並且在某些國家/地區,處理和分發加密資料的法律後果。也就是說,有時潛在的複雜性是值得的。您應該理想地將加密用於敏感資料,例如

  • 如果您在使用者的機器上儲存信用卡資訊。
  • 如果您在使用者的機器上儲存財務資訊。
  • 如果您透過網路或以其他方式以這種方式傳遞私人資訊,以便其他使用者可以訪問資料,但不是那些應該閱讀資料的人。
  • 出於身份驗證目的,例如在身份驗證伺服器和服務渲染伺服器之間傳遞令牌。有關此類身份驗證的示例,請閱讀 Kerberos 協議。
  • 根據使用者的請求,因為他們輸入了他們認為足夠重要的資料來保護。

同樣重要的是要記住,沒有加密演算法或做法是 100% 安全的,並且資料只能使未經授權的人員難以(但並非不可能)讀取。安全研究人員和硬體進步可以使任何曾經被認為是“不可穿透”的演算法在足夠的時間和奉獻精神下很容易被破解,並且情報機構可能已經破解了常用演算法,而沒有透露他們已經能夠做到這一點。請注意,如果您打算將資料保密,而該使用者也應該以某種方式與資料互動,那麼加密就沒什麼用,並且如果您嘗試使用這種方式來實現某種形式的數字版權管理,通常只會讓終端使用者感到厭煩。

準備加密

[編輯 | 編輯原始碼]

要加密或解密資料,您需要建立一個 Blowfish 物件並將加密金鑰設定為將要使用的序列。此序列對於解密物件和加密物件必須相同,以便解密的資料有意義,請在傳輸或儲存資料時牢記這一點。請注意,將加密金鑰儲存在指令碼中將從一開始就破壞使用加密進行本地儲存的目的,除非您可以嚴格控制誰可以使用檔案許可權設定讀取指令碼內容。首先開啟一個文字檔案(我們將將其稱為“blowfish_test.io”以供參考),並在其中輸入以下文字

encryptor := Blowfish clone
decryptor := Blowfish clone

然後,在終端中執行該檔案

$ io blowfish_test.io

如果結果類似於以下內容

 Exception: Object does not respond to 'Blowfish'
 ---------
 Object Blowfish                      Command Line 1

那麼您沒有安裝 Blowfish 附加元件。如果執行該命令沒有輸出,那麼您確實安裝了該附加元件,並且該指令碼執行成功。假設一切順利,我們需要新增一個金鑰才能使其有任何用處,畢竟,如果任何人都可以在沒有任何努力的情況下開啟訊息,那麼加密就沒有意義,對吧?:) 現在將以下程式碼新增到您的指令碼中

key := "secret"
encryptor setKey(key)
decryptor setKey(key)

這將加密和解密物件都設定為使用相同的金鑰,因此解密物件將能夠理解加密物件輸出的資料。使用 Blowfish 附加元件加密或解密資料有兩種方法:一次性或流式。本指南涵蓋了這兩種方法。

一次性加密/解密

[編輯 | 編輯原始碼]

要一次性加密整個序列,只需將 encrypt 訊息傳送到一個 Blowfish 物件,其加密金鑰設定為如下

encryptedText := encryptor encrypt("This is a very secret sentence.")

要一次性解密整個序列,您執行相同的操作,但訊息現在稱為 decrypt

decryptedText := decryptor decrypt(encryptedText)

加密/解密流

[編輯 | 編輯原始碼]

在流模式下使用 Blowfish 物件時,您需要首先設定流是加密還是解密,您可以使用 setIsEncrypting 訊息來執行此操作,該訊息對於加密流為 true,對於解密流為 false

encryptor setIsEncrypting(true)
decrypting setIsEncrypting(false)

其工作原理是存在 inputBufferoutputBuffer 插槽,它們是序列,您首先發送 beginProcessing 來準備流,然後使用 appendSeq 將加密或未加密的塊放入 inputBuffer 中,然後定期傳送 process 訊息以使盡可能多的來自輸入緩衝區的資料被加密並放入輸出緩衝區,這可以透過給定資料完成。由於 Blowfish 在加密固定大小的塊方面的工作方式,因此當您執行 process 時,任何小於預期塊大小的內容都不會被加密,當您完成將所有要加密或解密的資料匯入管道後,只需傳送 endProcessingendProcessing 會使任何剩餘的資料被加密或解密,並根據需要填充資料以使其正常工作,這表示流的結束。請參閱以下示例

encryptor beginProcessing
encryptor inputBuffer appendSeq("Hello, I am a toaster.")
encryptor process
encryptor inputBuffer appendSeq(" I am another toaster.")
encryptor endProcessing
encryptor outputBuffer println # this should print what looks like garbage
華夏公益教科書