打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
自定义类加载器加载加密的类文件
以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");//指定加密算法为DESedekg.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 );}}
运行结果:
C:\java>javac MyClassloader2.java

C:\java>javac MyURL4.java

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

C:\java>

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
A 类加载器
JVM——自定义类加载器(转载)
java nio 之MappedByteBuffer,高效文件/内存映射
java中输入输出总结-it群
java读写二进制文件用datainputstream和dataoutputstream
Java基础输入输出
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服