由于DES不再安全,現(xiàn)在都流行使用AES加密算法替代DES,Rijndael是AES的實(shí)現(xiàn)。我從網(wǎng)上找到了很多Rijndael的java實(shí)現(xiàn)代碼,我用了其中的一個(gè),并且寫了一個(gè)工具類,使得更方便使用它。
http://www.cnblogs.com/Files/jobs/Rijndael.rarRijndael_Util.java是我寫的,使用方法如下:
由于Rijindael的算法要求每次加密的數(shù)據(jù)必須是一個(gè)block,blockSize可以是16、24或者32。因此,當(dāng)需要加密一個(gè)byte數(shù)組paintBytes時(shí),如果byte數(shù)組plainBytes的長(zhǎng)度不為blockSize的倍數(shù),則需要補(bǔ)位。此時(shí),就需要一個(gè)數(shù)值來(lái)保留明文byte數(shù)組的長(zhǎng)度。最初我是用四個(gè)byte來(lái)保存plainBytes的長(zhǎng)度,然后直接放在密文byte數(shù)組cipherBytes的最前面。但是我考慮到把直接把明文的長(zhǎng)度暴露出來(lái),不是很好,于是,就做了一個(gè)處理。當(dāng)blockSize為16或者24時(shí),而且plainBytes的長(zhǎng)度不為blockSize的倍數(shù),最后一個(gè)block的blockSize使用一個(gè)長(zhǎng)度為blckSize+8的byte數(shù)組lastBlockBytes來(lái)保存,這樣,最后一個(gè)block的長(zhǎng)度就比普通的block長(zhǎng)8個(gè)byte,這個(gè)8個(gè)byte的前4位用來(lái)保存plainBytes的長(zhǎng)度。當(dāng)blockSize為32時(shí),則最后一個(gè)block拆為兩個(gè)block,一個(gè)block的長(zhǎng)度為16,一個(gè)block的長(zhǎng)度為24,這樣一來(lái),又有多余的8位來(lái)保存plainBytes的長(zhǎng)度了。把int變?yōu)樗膫€(gè)byte和把四個(gè)byte讀回一個(gè)int的實(shí)現(xiàn)如下:
.NET的朋友注意,java中的byte是帶符號(hào),而c#中的byte是無(wú)符號(hào)的。以前,由于很少寫低級(jí)的代碼,所以對(duì)位運(yùn)算不夠熟悉,最初是,把一個(gè)int拆成4個(gè)byte的算法自己寫,但是覺得不夠好,后來(lái)和flier_lu交流后,flier_lu建議我看java.nio中的ByteBuffer的實(shí)現(xiàn),可能會(huì)有收獲。我查看后java.nio.Bytes類后,發(fā)現(xiàn)了java.nio.Bits的實(shí)現(xiàn)比我做的更好一些。java.nio.Bits是一個(gè)內(nèi)部類,不是public,我們不能調(diào)用它,但是可以參考他的源碼實(shí)現(xiàn)。在這個(gè)過(guò)程中,我和以往的感覺一樣,一個(gè)基礎(chǔ)類庫(kù),開放源碼對(duì)于使用者會(huì)有很大幫助。最近有人對(duì).NET的前途提出質(zhì)疑,有人說(shuō)到關(guān)鍵點(diǎn)上來(lái)了:.NET是一個(gè)相當(dāng)封閉的平臺(tái)。微軟對(duì)于公開基礎(chǔ)類庫(kù)的源碼,在走倒退的道路。以前微軟的基礎(chǔ)類庫(kù)MFC是可以查看源碼的,你甚至可以調(diào)試源碼,但是微軟提供.NET的基礎(chǔ)類庫(kù)而是不開放源代碼的,雖然你可以通過(guò)Reflectro或者M(jìn)ono了解一些基礎(chǔ)類庫(kù)的源碼,但這個(gè)不能夠確定你通過(guò)這些途徑得到的源碼和你正在使用的是一致的。從.NET轉(zhuǎn)向Java快兩年了,越來(lái)越對(duì)Java的前途充滿希望,也很多人一樣,對(duì)微軟的.NET越來(lái)越失望。