Bouncy Castle(http://www.bouncycastle.org/)是一個龐大的加密類庫,支持Java和C#,其中Java部分發(fā)布的源代碼壓縮包就有24M左右,支持JDK 1.0~5.0,支持J2ME(現(xiàn)在叫JavaME)。
但是,這個類庫使用起來并不那么方便,它并沒有與普通Java類庫那樣以Jar形式發(fā)布立即可用的二進制類庫,而只發(fā)布源代碼,源代碼包含了多份,包括JDK1.0,JDK1.1,JDK1.2,JDK1.3,JDK1.4,JDK1.5,J2ME等,每種環(huán)境都有少量文件不一樣,有多個用于Ant的build xml,分別用于各種不同的JDK,但是每個xml定義了多個target,不知道哪個target才能build出可用的類庫來,選中了其中某個target有可能會出現(xiàn)錯誤,build不下去。文檔太簡單,基本沒講到怎么生成可用的類庫,網(wǎng)上的相關(guān)文檔也很少。我嘗試了兩天才終于把第一個MIDP加密測試程序運行成功。
我的應(yīng)用只是實現(xiàn)Java ME的加密,所以這里講的只是針對JavaME的,JavaSE應(yīng)該會簡單一點。
打開下載下來的壓縮包(crypto-138.zip),會發(fā)現(xiàn)里面有一堆文件夾和一堆文件,其中一個文件夾叫j2me,于是第一反應(yīng)就是打開它看看里面是什么,發(fā)現(xiàn)里面只有少量的源代碼文件,看來這只是適用于j2me的一部分源代碼而已,其他通用的部分不在這里。
還有一個j2me.xml,是一個Ant的build文件,在eclipse里面用ant打開以后,發(fā)現(xiàn)里面有很多target,除了what(輸出一些信息)和init(建立幾個目錄,復(fù)制一些文件)這兩個能執(zhí)行成功之外,其他幾乎都是失敗的,所以通過這個東西是搞不出我們可用的classes來的。
沒辦法,只有一個個目錄地看,在一個zips目錄里面發(fā)現(xiàn)cldc_sources.zip,里面的源代碼文件有很多,有點像了,于是就把它解壓后放到一個Eclipse ME測試項目的src目錄下,找到org.bouncycastle.crypto.examples包,里面有個MIDPTest.java文件,還有個midp_test.jad,看來這個是用來測試用的MIDP了,調(diào)出WTK的模擬器來運行一下,果然是,成功了。
下一步是在手機上運行。如果不混淆,生成的JAR包有1.6M之巨,不管了,先試一下。安裝到手機上,到最后出現(xiàn)“授權(quán)失敗”的提示,安裝不成功。記起原來找文檔時在index.html里面看到有這么一句話:The final caveat to this is that as the j2me distribution includes some compatibility classes starting in the java package, you need to use an obfuscator to change the package names before attempting to import a midlet using the BC API. 似乎因為用于j2me的版本有幾個以java開頭的包,里面包含了一些兼容類,可能是用于補充CLDC的不足,由于java開頭的包是系統(tǒng)包,是不允許修改的,所以不處理過的話安裝會失敗。必須先用混淆器弄一下才行。Eclipse ME配置混淆器十分簡單,我使用的是ProGuard。參照http://www.cnjm.net/eclipseme/docs/configuring.html配置即可。然后運行Create Obfuscated Package生成混淆過的包,只有13K。安裝在Nokia 6681上,成功,運行,也成功了。嘗試修改一下MIDPTest.java,在whichCipher方法里面,把返回值改為其他數(shù)字(0-4),就可以修改加密方式,但是由于DES加密使用的密鑰長度為64bit,而默認(rèn)的key是"0123456789abcdef0123456789abcdef",運行DES是會提示密鑰太長,我開始以為把key改為4個字符就可以(因為Java使用Unicode,每個字符2字節(jié),4個字符8字節(jié)=64bit),卻出現(xiàn)了數(shù)組越界的異常,其實這個key并不是直接用作密鑰,還要經(jīng)過處理的。嘗試了8個字符也不行,最后發(fā)現(xiàn)16個字符就可以了,應(yīng)該是每兩個字符對應(yīng)一個16進制數(shù)。測試程序是對“www.bouncycastle.org”這個字符串進行加密和解密,速度還是挺快的,幾乎感覺不到需要時間(在手機上啟動Java程序本來就比較慢)。
中間還碰到一個問題,由于我是把源代碼直接復(fù)制到一個原來建立好的MIDP項目里,那個MIDP項目里已經(jīng)有個默認(rèn)的JAD文件,但是里面沒有表示要運行的Midlet,生成Jar包之后,安裝到手機上到最后會出現(xiàn)安裝文件無效的提示。打開那個JAD文件,在Midlets標(biāo)簽里點擊Add按鈕,把org.bouncycastle.crypto.examples.MIDPTest添加進去即可。
以上測試使用的環(huán)境是:
JDK 1.5.02
Eclipse 3.2.0
Eclipse ME 1.7.7 http://eclipseme.org
Sun WTK 2.5.2 for CLDC
ProGuard 4.1 http://proguard.sourceforge.net/
剛剛發(fā)現(xiàn)Bouncy Castle的下載頁面
http://www.bouncycastle.org/latest_releases.html里面有專用于J2ME的源代碼發(fā)行包,里面只包含用于J2ME的代碼,如果僅用在J2ME下的話,這個應(yīng)該比較簡單,不用找半天。