站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Java 专题自定义类加载器加载加密的类文件

自定义类加载器加载加密的类文件

摘要: 自定义类加载器加载加密的类文件

</td> </tr> <tr> <td height="35" valign="top" class="ArticleTeitle">
以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.class

C:\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.java

C:\java>javac MyURL4.java

C:\java>java MyURL4 TestURL
From Main
arg1 passed
arg2 passed

C:\java>

</td> <td width="389"> </td> </tr> </table> </td> </tr> <tr>


↑返回目录
前一篇: 把目录中的文件名全部改为小写
后一篇: 获取类的方法列表