介紹XXTEA加密算法及其C實現
http://en.wikipedia.org/wiki/XXTEA
“微型加密算法(TEA)及其相關變種(XTEA,Block TEA,XXTEA)都是分組加密算法,它們很容易被描述,實現也很簡單(典型的幾行代碼)。
TEA 算法最初是由劍橋計算機實驗室的 David Wheeler 和 Roger Needham 在 1994 年設計的。該算法使用 128 位的密鑰為 64 位的信息塊進行加密,它需要進行 64 輪迭代。該算法使用了一個神秘常數δ作為倍數,它來源於黃金比率,以保證每一輪加密都不相同。但δ的精確值似乎並不重要,這里 TEA 把它定義為 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9 )。”
其實,TEA跟我們的關系非常密切,因為QQ就是使用16輪迭代的TEA算法。
XXTEA是其最新的變種,於1998年提出。目前還沒有人找到對其進行攻擊的方法,是對前面一些變種的改進。XXTEA 算法很安全,而且非常快速,非常適合應用於 Web 開發中。
下面是作者給出的該算法的C實現:
#define MX (z>>5^y<<2) + (y>>3^z<<4)^(sum^y) + (k[p&3^e]^z); long btea(long* v, long n, long* k) { unsigned long z=v[n-1], y=v[0], sum=0, e, DELTA=0x9e3779b9; long p, q ; if (n > 1) { q = 6 + 52/n; while (q-- > 0) { sum += DELTA; e = (sum >> 2) & 3; for (p=0; p<n-1; p++) y = v[p+1], z = v[p] += MX; y = v[0]; z = v[n-1] += MX; } return 0 ; } else if (n < -1) { n = -n; q = 6 + 52/n; sum = q*DELTA ; while (sum != 0) { e = (sum >> 2) & 3; for (p=n-1; p>0; p--) z = v[p-1], y = v[p] -= MX; z = v[n-1]; y = v[0] -= MX; sum -= DELTA; } return 0; } return 1; }
瞧,短的驚人吧!
咱也搞不明白數學上的東西,有興趣的話就去上面那個wikipedia里看吧。我這里就講講怎么用。
teab will encode or decode n words as a single block where n > 1
- v is the n word data vector
- k is the 4 word key
- n is negative for decoding
- if n is zero result is 1 and no coding or decoding takes place, otherwise the result is zero
- assumes 32 bit ‘long’ and same endian coding and decoding
這是wikipedia里的說明,講得比較明白了。
最核心的是要明白:XXTEA算法使用128bit的密鑰對以32bit為單位的信息塊進行加密。
這段介紹里的'word’這個詞讓我很費了一番周折。我開始以為是“字”,也就是2byte,16bit。但是在我耗費了不少時間進行測試和實驗后,可以確定,word在這里不是一個單位,大概是要翻譯成“組元”之類的詞,其實就是后面說的一個32bit的long類型。
搞清楚這個,別的就沒什么了。剛才那段代碼:
long btea(long* v, long n, long* k)
v是要加密的組元的起始地址,以32bit為單位,這里用long來實現。
n是要加密的組元個數,正數是加密,負數是解密。
k是密鑰的起始地址,長度為4個組元,4*32=128bit。
返回值為0或1(對應n=0,沒有計算)。
加密的結果會直接寫回到v中。
經過試驗,我還有一點要補充的,XXTEA的計算是空間相關的,也就是說,在一個組元中,4個字節是不能斷章取義的,即密文的一部分,並不能還原成明文的一部分。所以,當數據不能被4個字節整除時,要做好字節的填充和對其等輔助工作。
