密碼學系列之:twofish對稱金鑰分組演算法

flydean發表於2021-06-30

簡介

之前的文章我們講到blowfish演算法因為每次加密的塊比較小隻有64bits,所以不建議使用blowfish加密超過4G的檔案。同時因為加密塊小還會導致生日攻擊等。所以才有了blowfish的繼承者twofish。

今天我們一起來揭祕一下twofish這個加密演算法。

twofish的起源

twofish和blowfish一樣,也是一種對稱加密演算法。不同的是twofish的塊大小是128bits,而它的金鑰長度是256bits。

AES相信大家都很熟悉了,AES的全稱是The Advanced Encryption Standard,它是由美國國家標準技術研究院(NIST)批准的標準的對稱分組密碼技術。

AES是從1997年到2000年公開選拔出來的。主要是為了替換DES而建立的。因為DES只有56位金鑰,容易受到暴力攻擊。

NIST在1997年1月2日宣佈,他們希望選擇DES的繼任者,即AES。 與DES一樣,它也應是“一種能夠在二十世紀之前很好地保護政府敏感資訊的,未公開的,公開的加密演算法。” 但是,NIST並沒有簡單地釋出一個繼任者,而是進行公開的選拔,候選者需要提供相關的資料,證明其比DES優秀。 這種開放式徵集立即引起了人們的濃厚興趣。

在隨後的幾個月裡面,NIST收到了來自多個國家的15個提案。他們是CAST-256,CRYPTON,DEAL,DFC,E2,FROG,HPC,LOKI97,MAGENTA,MARS,RC6,Rijndael,SAFER +,Serpent和Twofish。

在隨後的評估中,密碼學家對這些候選的演算法進行了包括安全性,效能和有限環境執行等因素進行了評估,最終在1999年8月宣佈了5個最終入圍的演算法:MARS ,RC6,Rijndael,Serpent和Twofish。

最終在2000年10月2日,NIST宣佈選中Rijndael作為最終的AES演算法。並於2001年11月26日作為正式的AES標準。

twofish雖然沒有作為最後的AES標準,但是能夠躋身5強,也是很厲害了。

twofish的效能

在2000年的時候,對於大多數平臺來說,twofish在128-bit keys的表現要比Rijndael 要慢,這也是為什麼Rijndael會當選為AES標準的原因。但是在256-bit keys的表現要好於Rijndael 。

但是隨著Rijndael 作為AES的標準,越來越多的硬體都基於AES做了優化,最後導致twofish和Rijndael 的差距越來越大。

twofish和Blowfish一樣也是免費的。

twofish的原理

twofish是由blowfish演化來的。我們先看下twofish的工作圖:

twofish和DES一樣,也是使用的Feistel structure。

首先將128bits的明文分成4部分,然後分別和K0,K1,K2,K3進行異或操作,生成4個結果,我們稱他們為A1,A2,A3,A4。

虛線括起來的部分是F函式。

A1,A2作為F的輸入生成的結果和A3進行異或操作,然後右移一位,和A4左移一位的結果進行異或操作,然後交換左右部分的位置。

最後一輪的輸出不進行交換直接與四個擴充套件金鑰字進行異或而得到密文C。

我們再來看看F函式。

F是64位資料上與金鑰相關的置換函式,它有三個引數,R1,R2兩個輸入,還有一個r表示的子項的輪數。

R1和R2先通過S-box的變換,然後乘以MDS矩陣,然後再進行PHT變換,最後和子金鑰進行異或操作。

本文已收錄於 http://www.flydean.com/twofish/

最通俗的解讀,最深刻的乾貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!

相關文章