Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 390|回复: 0

[Java基础知识]自定义类加载器加载加密的类文件

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-9-30 23:47:24 | 显示全部楼层 |阅读模式
    以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]
    1. import java.io.*;
    2. import java.security.*;
    3. import javax.crypto.*;
    4. public class MyClassLoader2 extends ClassLoader
    5. {   
    6.    //覆盖loadClass( )方法
    7.    public Class loadClass( String name, boolean resolve )
    8.       throws ClassNotFoundException {
    9.        byte[ ] classData=null;
    10.        Class c = null;
    11.        try {
    12.           c = findLoadedClass(name);
    13.           if (c != null)  return(c);
    14.           try {
    15.                c=findClass(name);
    16.             } catch( Exception fnfe ) {
    17.           }
    18.           if (c==null){
    19.               c = findSystemClass (name);
    20.            }
    21.           if (resolve && c != null)
    22.                resolveClass( c );
    23.           return(c);
    24.       } catch( Exception e ) {
    25.                throw new ClassNotFoundException( e.toString());
    26.       }
    27.     }
    28.    
    29.   public Class findClass( String name){
    30.        byte[ ] classData=null;
    31.        try{
    32.         FileInputStream fkey=new FileInputStream("key1.dat");
    33.             ObjectInputStream ob=new ObjectInputStream(fkey);
    34.                 Key k=(Key)ob.readObject( );
    35.         Cipher cp=Cipher.getInstance("DESede");
    36.         cp.init(Cipher.DECRYPT_MODE, k);
    37.        //在当前目录下加载名字为name的类文件并解密
    38.        FileInputStream in=new FileInputStream(name+".class");
    39.        ByteArrayOutputStream out=new ByteArrayOutputStream( );
    40.        CipherOutputStream cout=new CipherOutputStream(out, cp);
    41.            int b=0;
    42.            while( (b=in.read())!=-1){
    43.                  cout.write(b);
    44.             }
    45.         cout.close();
    46.        classData=out.toByteArray( );
    47.    } catch(Exception e){  }
    48.    Class x=defineClass(name, classData, 0, classData.length);
    49.     return x;
    50.   }
    51. }
    52. 四、测试类
    53. import java.lang.reflect.*;
    54. public class MyURL4{
    55.   static public void main( String args[] ) throws Exception {
    56.       MyClassLoader3 x=new MyClassLoader3();
    57.       Class c = x.loadClass(args[0]);
    58.       Class getArg1[] = { (new String[1]).getClass() };
    59.       Method m = c.getMethod( "main", getArg1 );
    60.       String[] my1={"arg1 passed","arg2 passed"};
    61.       Object myarg1[] = {my1};
    62.       m.invoke( null, myarg1 );
    63.   }
    64. }
    复制代码


      
      运行结果:

    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
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-13 23:46 , Processed in 0.398266 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表