其中用到的类在jdk 1.4中都有,请参考api中的:javax.crypto,java.security 等包。
如果是jdk 1.3请参考:http://java.sun.com/products/jce/
三、加密、解密
java加密扩展即java cryptography extension,简称jce。它是sun的加密服务软件,包含了加密和密匙生成功能。jce是jca(java cryptography architecture)的一种扩展。
jce没有规定具体的加密算法,但提供了一个框架,加密算法的具体实现可以作为服务提供者加入。除了jce框架之外,jce软件包还包含了sunjce服务提供者,其中包括许多有用的加密算法,比如des(data encryption standard)和blowfish。
为简单计,在本文中我们将用des算法加密和解密字节码。下面是用jce加密和解密数据必须遵循的基本步骤:
步骤1:生成一个安全密匙。在加密或解密任何数据之前需要有一个密匙。密匙是随同被加密的应用一起发布的一小段数据,listing 3显示了如何生成一个密匙。
【listing 3:生成一个密匙】
// des算法要求有一个可信任的随机数源
securerandom sr = new securerandom();
// 为我们选择的des算法生成一个keygenerator对象
keygenerator kg = keygenerator.getinstance( "des" );
kg.init( sr );
// 生成密匙
secretkey key = kg.generatekey();
// 获取密匙数据
byte rawkeydata[] = key.getencoded();
/* 接下来就可以用密匙进行加密或解密,或者把它保存
为文件供以后使用 */
dosomething( rawkeydata );
步骤2:加密数据。得到密匙之后,接下来就可以用它加密数据。除了解密的classloader之外,一般还要有一个加密待发布应用的独立程序(见listing 4)。
【listing 4:用密匙加密原始数据】
// des算法要求有一个可信任的随机数源
securerandom sr = new securerandom();
byte rawkeydata[] = /* 用某种方法获得密匙数据 */;
// 从原始密匙数据创建deskeyspec对象
deskeyspec dks = new deskeyspec( rawkeydata );
// 创建一个密匙工厂,然后用它把deskeyspec转换成
// 一个secretkey对象
secretkeyfactory keyfactory = secretkeyfactory.getinstance( "des" );
secretkey key = keyfactory.generatesecret( dks );
// cipher对象实际完成加密操作
cipher cipher = cipher.getinstance( "des" );
// 用密匙初始化cipher对象
cipher.init( cipher.encrypt_mode, key, sr );
// 现在,获取数据并加密
byte data[] = /* 用某种方法获取数据 */
// 正式执行加密操作
byte encrypteddata[] = cipher.dofinal( data );
// 进一步处理加密后的数据
dosomething( encrypteddata );
步骤3:解密数据。运行经过加密的应用时,classloader分析并解密类文件。操作步骤如listing 5所示。
【listing 5:用密匙解密数据】
// des算法要求有一个可信任的随机数源
securerandom sr = new securerandom();
byte rawkeydata[] = /* 用某种方法获取原始密匙数据 */;
// 从原始密匙数据创建一个deskeyspec对象
deskeyspec dks = new deskeyspec( rawkeydata );
// 创建一个密匙工厂,然后用它把deskeyspec对象转换成
// 一个secretkey对象
secretkeyfactory keyfactory = secretkeyfactory.getinstance( "des" );
secretkey key = keyfactory.generatesecret( dks );
// cipher对象实际完成解密操作
cipher cipher = cipher.getinstance( "des" );
// 用密匙初始化cipher对象
cipher.init( cipher.decrypt_mode, key, sr );
// 现在,获取数据并解密
byte encrypteddata[] = /* 获得经过加密的数据 */
// 正式执行解密操作
byte decrypteddata[] = cipher.dofinal( encrypteddata );
// 进一步处理解密后的数据
dosomething( decrypteddata );
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!


