amp@java

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            99 隨筆 :: 0 文章 :: 228 評論 :: 0 Trackbacks
          Bouncy Castle(http://www.bouncycastle.org/)是一個(gè)龐大的加密類庫,支持Java和C#,其中Java部分發(fā)布的源代碼壓縮包就有24M左右,支持JDK 1.0~5.0,支持J2ME(現(xiàn)在叫JavaME)。
          但是,這個(gè)類庫使用起來并不那么方便,它并沒有與普通Java類庫那樣以Jar形式發(fā)布立即可用的二進(jìn)制類庫,而只發(fā)布源代碼,源代碼包含了多份,包括JDK1.0,JDK1.1,JDK1.2,JDK1.3,JDK1.4,JDK1.5,J2ME等,每種環(huán)境都有少量文件不一樣,有多個(gè)用于Ant的build xml,分別用于各種不同的JDK,但是每個(gè)xml定義了多個(gè)target,不知道哪個(gè)target才能build出可用的類庫來,選中了其中某個(gè)target有可能會(huì)出現(xiàn)錯(cuò)誤,build不下去。文檔太簡單,基本沒講到怎么生成可用的類庫,網(wǎng)上的相關(guān)文檔也很少。我嘗試了兩天才終于把第一個(gè)MIDP加密測試程序運(yùn)行成功。
          我的應(yīng)用只是實(shí)現(xiàn)Java ME的加密,所以這里講的只是針對JavaME的,JavaSE應(yīng)該會(huì)簡單一點(diǎn)。

          打開下載下來的壓縮包(crypto-138.zip),會(huì)發(fā)現(xiàn)里面有一堆文件夾和一堆文件,其中一個(gè)文件夾叫j2me,于是第一反應(yīng)就是打開它看看里面是什么,發(fā)現(xiàn)里面只有少量的源代碼文件,看來這只是適用于j2me的一部分源代碼而已,其他通用的部分不在這里。
          還有一個(gè)j2me.xml,是一個(gè)Ant的build文件,在eclipse里面用ant打開以后,發(fā)現(xiàn)里面有很多target,除了what(輸出一些信息)和init(建立幾個(gè)目錄,復(fù)制一些文件)這兩個(gè)能執(zhí)行成功之外,其他幾乎都是失敗的,所以通過這個(gè)東西是搞不出我們可用的classes來的。
          沒辦法,只有一個(gè)個(gè)目錄地看,在一個(gè)zips目錄里面發(fā)現(xiàn)cldc_sources.zip,里面的源代碼文件有很多,有點(diǎn)像了,于是就把它解壓后放到一個(gè)Eclipse ME測試項(xiàng)目的src目錄下,找到org.bouncycastle.crypto.examples包,里面有個(gè)MIDPTest.java文件,還有個(gè)midp_test.jad,看來這個(gè)是用來測試用的MIDP了,調(diào)出WTK的模擬器來運(yùn)行一下,果然是,成功了。
          下一步是在手機(jī)上運(yùn)行。如果不混淆,生成的JAR包有1.6M之巨,不管了,先試一下。安裝到手機(jī)上,到最后出現(xiàn)“授權(quán)失敗”的提示,安裝不成功。記起原來找文檔時(shí)在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. 似乎因?yàn)橛糜趈2me的版本有幾個(gè)以java開頭的包,里面包含了一些兼容類,可能是用于補(bǔ)充CLDC的不足,由于java開頭的包是系統(tǒng)包,是不允許修改的,所以不處理過的話安裝會(huì)失敗。必須先用混淆器弄一下才行。Eclipse ME配置混淆器十分簡單,我使用的是ProGuard。參照http://www.cnjm.net/eclipseme/docs/configuring.html配置即可。然后運(yùn)行Create Obfuscated Package生成混淆過的包,只有13K。安裝在Nokia 6681上,成功,運(yùn)行,也成功了。嘗試修改一下MIDPTest.java,在whichCipher方法里面,把返回值改為其他數(shù)字(0-4),就可以修改加密方式,但是由于DES加密使用的密鑰長度為64bit,而默認(rèn)的key是"0123456789abcdef0123456789abcdef",運(yùn)行DES是會(huì)提示密鑰太長,我開始以為把key改為4個(gè)字符就可以(因?yàn)镴ava使用Unicode,每個(gè)字符2字節(jié),4個(gè)字符8字節(jié)=64bit),卻出現(xiàn)了數(shù)組越界的異常,其實(shí)這個(gè)key并不是直接用作密鑰,還要經(jīng)過處理的。嘗試了8個(gè)字符也不行,最后發(fā)現(xiàn)16個(gè)字符就可以了,應(yīng)該是每兩個(gè)字符對應(yīng)一個(gè)16進(jìn)制數(shù)。測試程序是對“www.bouncycastle.org”這個(gè)字符串進(jìn)行加密和解密,速度還是挺快的,幾乎感覺不到需要時(shí)間(在手機(jī)上啟動(dòng)Java程序本來就比較慢)。

          中間還碰到一個(gè)問題,由于我是把源代碼直接復(fù)制到一個(gè)原來建立好的MIDP項(xiàng)目里,那個(gè)MIDP項(xiàng)目里已經(jīng)有個(gè)默認(rèn)的JAD文件,但是里面沒有表示要運(yùn)行的Midlet,生成Jar包之后,安裝到手機(jī)上到最后會(huì)出現(xiàn)安裝文件無效的提示。打開那個(gè)JAD文件,在Midlets標(biāo)簽里點(diǎn)擊Add按鈕,把org.bouncycastle.crypto.examples.MIDPTest添加進(jìn)去即可。

          以上測試使用的環(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下的話,這個(gè)應(yīng)該比較簡單,不用找半天。
          posted on 2008-01-25 19:59 amp@java 閱讀(1457) 評論(1)  編輯  收藏 所屬分類: Java ME

          評論

          # re: 可用在JavaME上的加密包Bouncy Castle的使用 2009-09-02 13:16 LorenLuo
          你好 我想請教一下關(guān)于bouncycastle的用法,要是愿意請加我的:qq 276539211  回復(fù)  更多評論
            

          主站蜘蛛池模板: 嵩明县| 临邑县| 武清区| 乐平市| 临沂市| 河津市| 偃师市| 康马县| 太和县| 沭阳县| 中山市| 湖南省| 揭西县| 烟台市| 青州市| 法库县| 太仆寺旗| 四子王旗| 永宁县| 江川县| 望谟县| 瑞金市| 五台县| 苗栗县| 宕昌县| 黄梅县| 乌拉特中旗| 滁州市| 文化| 嘉善县| 汉阴县| 连州市| 青海省| 上高县| 景洪市| 泾川县| 无为县| 义马市| 宝丰县| 上蔡县| 武城县|