Bouncy Castle(http://www.bouncycastle.org/)是一个庞大的加密类库,支持Java和C#,其中Java部分发布的源代码压缩包就有24M左右,支持JDK 1.0~5.0,支持J2ME(现在叫JavaME)。
但是,这个类库使用起来并不那么方便,它并没有与普通Java类库那样以Jar形式发布立即可用的二进制类库,而只发布源代码,源代码包含了多份,包括JDK1.0,JDK1.1,JDK1.2,JDK1.3,JDK1.4,JDK1.5,J2ME等,每种环境都有少量文件不一样,有多个用于Ant的build xml,分别用于各种不同的JDK,但是每个xml定义了多个target,不知道哪个target才能build出可用的类库来,选中了其中某个target有可能会出现错误,build不下去。文档太简单,基本没讲到怎么生成可用的类库,网上的相关文档也很少。我尝试了两天才终于把第一个MIDP加密测试程序运行成功。
我的应用只是实现Java ME的加密,所以这里讲的只是针对JavaME的,JavaSE应该会简单一点。
打开下载下来的压缩包(crypto-138.zip),会发现里面有一堆文件夹和一堆文件,其中一个文件夹叫j2me,于是第一反应就是打开它看看里面是什么,发现里面只有少量的源代码文件,看来这只是适用于j2me的一部分源代码而已,其他通用的部分不在这里。
还有一个j2me.xml,是一个Ant的build文件,在eclipse里面用ant打开以后,发现里面有很多target,除了what(输出一些信息)和init(建立几个目录,复制一些文件)这两个能执行成功之外,其他几乎都是失败的,所以通过这个东西是搞不出我们可用的classes来的。
没办法,只有一个个目录地看,在一个zips目录里面发现cldc_sources.zip,里面的源代码文件有很多,有点像了,于是就把它解压后放到一个Eclipse ME测试项目的src目录下,找到org.bouncycastle.crypto.examples包,里面有个MIDPTest.java文件,还有个midp_test.jad,看来这个是用来测试用的MIDP了,调出WTK的模拟器来运行一下,果然是,成功了。
下一步是在手机上运行。如果不混淆,生成的JAR包有1.6M之巨,不管了,先试一下。安装到手机上,到最后出现“授权失败”的提示,安装不成功。记起原来找文档时在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开头的包是系统包,是不允许修改的,所以不处理过的话安装会失败。必须先用混淆器弄一下才行。Eclipse ME配置混淆器十分简单,我使用的是ProGuard。参照http://www.cnjm.net/eclipseme/docs/configuring.html配置即可。然后运行Create Obfuscated Package生成混淆过的包,只有13K。安装在Nokia 6681上,成功,运行,也成功了。尝试修改一下MIDPTest.java,在whichCipher方法里面,把返回值改为其他数字(0-4),就可以修改加密方式,但是由于DES加密使用的密钥长度为64bit,而默认的key是"0123456789abcdef0123456789abcdef",运行DES是会提示密钥太长,我开始以为把key改为4个字符就可以(因为Java使用Unicode,每个字符2字节,4个字符8字节=64bit),却出现了数组越界的异常,其实这个key并不是直接用作密钥,还要经过处理的。尝试了8个字符也不行,最后发现16个字符就可以了,应该是每两个字符对应一个16进制数。测试程序是对“www.bouncycastle.org”这个字符串进行加密和解密,速度还是挺快的,几乎感觉不到需要时间(在手机上启动Java程序本来就比较慢)。
中间还碰到一个问题,由于我是把源代码直接复制到一个原来建立好的MIDP项目里,那个MIDP项目里已经有个默认的JAD文件,但是里面没有表示要运行的Midlet,生成Jar包之后,安装到手机上到最后会出现安装文件无效的提示。打开那个JAD文件,在Midlets标签里点击Add按钮,把org.bouncycastle.crypto.examples.MIDPTest添加进去即可。
以上测试使用的环境是:
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/
刚刚发现Bouncy Castle的下载页面
http://www.bouncycastle.org/latest_releases.html里面有专用于J2ME的源代码发行包,里面只包含用于J2ME的代码,如果仅用在J2ME下的话,这个应该比较简单,不用找半天。