以TestURL.java为例,先加密TestURL.class文件,再用自定义类装载器加载并运行。
import java.io.*;
public class TestURL{
static public void main( String args[] ) throws Exception {
System.out.println("From Main");
System.out.println(args[0]);
System.out.println(args[1]);
}
public void tt( ) throws Exception{
System.out.println("From tt without args");
byte b[]="How are you!".getBytes("UTF8");
FileOutputStream f=new FileOutputStream("ssss.txt");
f.write(b);
}
public void tt(String s, int i){
System.out.println("Fron tt with args");
System.out.println(s);
System.out.println(i);
}
}
一、生成对称密钥,并保存到文件中
import java.io.*;
import javax.crypto.*;
public class Skey_DES{
public static void main(String args[]) throws Exception{
KeyGenerator kg=KeyGenerator.getInstance("DESede");//指定加密算法为DESede
kg.init(168); //密钥长度
SecretKey k=kg.generateKey( );//产生密钥
FileOutputStream f=new FileOutputStream("key1.dat");//将密钥保存到文件
ObjectOutputStream b=new ObjectOutputStream(f);
b.writeObject(k);
}
}
二、加密类文件import java.io.*;
import java.security.*;
import javax.crypto.*;
public class StreamOut{
public static void main(String args[]) throws Exception{
//获取密钥
FileInputStream f=new FileInputStream("key1.dat");
ObjectInputStream ob=new ObjectInputStream(f);
Key k=(Key)ob.readObject( );
//初始化密码器
Cipher cp=Cipher.getInstance("DESede");
if(args[0].equals("dec"))//解密模式
cp.init(Cipher.DECRYPT_MODE, k);
else //加密模式
cp.init(Cipher.ENCRYPT_MODE, k);
FileInputStream in=new FileInputStream(args[1]);//需要加密(解密)的源文件
FileOutputStream out=new FileOutputStream(args[2]);//加密(解密)后的文件
CipherOutputStream cout=new CipherOutputStream(out, cp);
int b=0;
while( (b=in.read())!=-1){
cout.write(b);
}
cout.close();
out.close();
in.close();
}
}
加密运行:
C:\java>java StreamOut enc TestURL.class TestURL1.classC:\java>
在当前目录中删除未加密的TestURL.class,并将加密后的TestURL1.class重命名为TestURL.class
三、自定义类装载器,在当前目录下加载已加密的类文件,并解密import java.io.*; import java.security.*; import javax.crypto.*; public class MyClassLoader2 extends ClassLoader { //覆盖loadClass( )方法 public Class loadClass( String name, boolean resolve ) throws ClassNotFoundException { byte[ ] classData=null; Class c = null; try { c = findLoadedClass(name); if (c != null) return(c); try { c=findClass(name); } catch( Exception fnfe ) { } if (c==null){ c = findSystemClass (name); } if (resolve && c != null) resolveClass( c ); return(c); } catch( Exception e ) { throw new ClassNotFoundException( e.toString()); } } public Class findClass( String name){ byte[ ] classData=null; try{ FileInputStream fkey=new FileInputStream("key1.dat"); ObjectInputStream ob=new ObjectInputStream(fkey); Key k=(Key)ob.readObject( ); Cipher cp=Cipher.getInstance("DESede"); cp.init(Cipher.DECRYPT_MODE, k); //在当前目录下加载名字为name的类文件并解密 FileInputStream in=new FileInputStream(name+".class"); ByteArrayOutputStream out=new ByteArrayOutputStream( ); CipherOutputStream cout=new CipherOutputStream(out, cp); int b=0; while( (b=in.read())!=-1){ cout.write(b); } cout.close(); classData=out.toByteArray( ); } catch(Exception e){ } Class x=defineClass(name, classData, 0, classData.length); return x; } } 四、测试类 import java.lang.reflect.*; public class MyURL4{ static public void main( String args[] ) throws Exception { MyClassLoader3 x=new MyClassLoader3(); Class c = x.loadClass(args[0]); Class getArg1[] = { (new String[1]).getClass() }; Method m = c.getMethod( "main", getArg1 ); String[] my1={"arg1 passed","arg2 passed"}; Object myarg1[] = {my1}; m.invoke( null, myarg1 ); } }<table width="665" border="0"> <tr> <td width="266">运行结果:
C:\java>javac MyClassloader2.javaC:\java>javac MyURL4.java
C:\java>java MyURL4 TestURL
From Main
arg1 passed
arg2 passedC:\java>
</td> <td width="389"> </td> </tr> </table> </td> </tr> <tr>
↑返回目录
前一篇: 把目录中的文件名全部改为小写
后一篇: 获取类的方法列表