TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
以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);
}
}
[/code] 一、生成对称密钥,并保存到文件中
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);
}
}
[/code] 二、加密类文件
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[/code]C:java> 在当前目录中删除未加密的TestURL.class,并将加密后的TestURL1.class重命名为TestURL.class
三、自定义类装载器,在当前目录下加载已加密的类文件,并解密
[/code]- 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[/code] C:java>javac MyURL4.java C:java>java MyURL4 TestURL
From Main
arg1 passed
arg2 passed C:java>
源码下载:http://file.javaxxz.com/2014/9/30/234724625.zip |
|