以TestURL.java為例,先加密TestURL.class文件,再用自定義類(lèi)裝載器加載并運行。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);}}一、生成對稱(chēng)密鑰,并保存到文件中
import java.io.*;import javax.crypto.*;public class Skey_DES{public static void main(String args[]) throws Exception{KeyGenerator kg=KeyGenerator.getInstance("DESede");//指定加密算法為DESedekg.init(168); //密鑰長(cháng)度SecretKey k=kg.generateKey( );//產(chǎn)生密鑰FileOutputStream f=new FileOutputStream("key1.dat");//將密鑰保存到文件ObjectOutputStream b=new ObjectOutputStream(f);b.writeObject(k);}}二、加密類(lèi)文件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重命名為T(mén)estURL.class
三、自定義類(lèi)裝載器,在當前目錄下加載已加密的類(lèi)文件,并解密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的類(lèi)文件并解密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;}}四、測試類(lèi)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 );}}運行結果:
C:\java>javac MyClassloader2.java
C:\java>javac MyURL4.java
C:\java>java MyURL4 TestURL
From Main
arg1 passed
arg2 passed
C:\java>
聯(lián)系客服