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