|
// 现在,获取数据并解密 byte encryptedData[] = /* 获得经过加密的数据 */
// 正式执行解密操作 byte decryptedData[] = cipher.doFinal( encryptedData );
// 进一步处理解密后的数据 doSomething( decryptedData );
四、应用实例 前面介绍了如何加密和解密数据。要部署一个经过加密的应用,步骤如下:
步骤1:创建应用。我们的例子包含一个App主类,两个辅助类(分别称为Foo和Bar)。这个应用没有什么实际功用,但只要我们能够加密这个应用,加密其他应用也就不在话下。 步骤2:生成一个安全密匙。在命令行,利用GenerateKey工具(参见GenerateKey.java)把密匙写入一个文件: % java GenerateKey key.data
步骤3:加密应用。在命令行,利用EncryptClasses工具(参见EncryptClasses.java)加密应用的类: % java EncryptClasses key.data App.class Foo.class Bar.class
该命令把每一个.class文件替换成它们各自的加密版本。 步骤4:运行经过加密的应用。用户通过一个DecryptStart程序运行经过加密的应用。DecryptStart程序如Listing 6所示。 【Listing 6:DecryptStart.java,启动被加密应用的程序】
import java.io.*; import java.security.*; import java.lang.reflect.*; import javax.crypto.*; import javax.crypto.spec.*;
public class DecryptStart extends ClassLoader { // 这些对象在构造函数中设置, // 以后loadClass()方法将利用它们解密类 private SecretKey key; private Cipher cipher;
// 构造函数:设置解密所需要的对象 public DecryptStart( SecretKey key ) throws GeneralSecurityException, IOException { this.key = key;
String algorithm = "DES"; SecureRandom sr = new SecureRandom(); System.err.println( "[DecryptStart: creating cipher]" ); cipher = Cipher.getInstance( algorithm ); cipher.init( Cipher.DECRYPT_MODE, key, sr ); }
// main过程:我们要在这里读入密匙,创建DecryptStart的 // 实例,它就是我们的定制ClassLoader。 // 设置好ClassLoader以后,我们用它装入应用实例, // 最后,我们通过Java Reflection API调用应用实例的main方法 static public void main( String args[] ) throws Exception { String keyFilename = args[0]; String appName = args[1];
// 这些是传递给应用本身的参数 String realArgs[] = new String[args.length-2]; System.arraycopy( args, 2, realArgs, 0, args.length-2 );
// 读取密匙 System.err.println( "[DecryptStart: reading key]" ); byte rawKey[] = Util.readFile( keyFilename ); DESKeySpec dks = new DESKeySpec( rawKey ); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance( "DES" ); SecretKey key = keyFactory.generateSecret( dks );
// 创建解密的ClassLoader DecryptStart dr = new DecryptStart( key );
// 创建应用主类的一个实例 // 通过ClassLoader装入它 System.err.println( "[DecryptStart: loading "+appName+"]" ); Class clasz = dr.loadClass( appName );
// 最后,通过Reflection API调用应用实例 // 的main()方法
// 获取一个对main()的引用 String proto[] = new String[1]; Class mainArgs[] = { (new String[1]).getClass() }; Method main = clasz.getMethod( "main", mainArgs );
// 创建一个包含main()方法参数的数组 Object argsArray[] = { realArgs }; System.err.println( "[DecryptStart: running "+appName+".main()]" );
// 调用main() main.invoke( null, argsArray ); }
public Class loadClass( String name, boolean resolve ) throws ClassNotFoundException { try { // 我们要创建的Class对象 Class clasz = null;
// 必需的步骤1:如果类已经在系统缓冲之中 // 我们不必再次装入它 clasz = findLoadedClass( name );
|