关于java程序商业软件中的加密问题

        经济时代的社会制度总是自相矛盾,从提倡保护知识产权以来,各种乱七八糟的东西都开始收费,现在估计你也深刻体会到了,生活到处充斥着黄牛党,坐车,看电影,去医院,驾校学车,都要交取额外的费用。在互联网上看电影也收费的,快播死后,免费的A片资源也没得看了。

       然而互联网行业是个提倡开源的行业,很多人以收取服务费用。但我个人认为开源的门很快就会闭上,现在就java商业软件的简单加密方法。现在最流行的加密方法就是 android 的签名工具apk了,现在就解释一下原理。

       在java核心卷2中提到,对类文件加密有很大的用途,如果没有加密秘钥,类文件就毫无用途。它们既不能被标准的虚拟机执行,也不能被轻易的反编译。

      加密类文件的关键是,需要一个自定义的类加载器,在加载完成了需要对类的内容进行解密,然后正常运行,而没有秘钥的类文件,由于加密算法的缘故,显示的是乱码。

//类文件简单加密

public static void encoder(String src,String des, String keyword){
        try {
            FileInputStream in=new FileInputStream(src);
            FileOutputStream out=new FileOutputStream(des);
            int key=Integer.parseInt(keyword);
            int ch;
            while((ch=in.read())!=-1){
                byte c=(byte)(ch+key);
                out.write(c);
            }
            out.close();
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

// 要重写findclass这个方法,loadclass会调用它
    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        byte[] classBytes = null;
         try {
            classBytes = loadClassBytes(name);
        } catch (IOException e) {
            
            e.printStackTrace();
        }
         name=name.substring(0,name.length()-1);
         Class c1 = defineClass(name, classBytes, 0, classBytes.length, null);
        if (c1 == null)
            throw new ClassNotFoundException(name);
        return c1;

    }

    private byte[] loadClassBytes(String name) throws IOException{
        String cname=name.replace('.', '/')+".clazz";
        FileInputStream in = null;
        try {
            // in=new FileInputStream(this.getClass().getResource("/")+"/"+ cname);
             in=new FileInputStream("d://"+ cname);
            ByteArrayOutputStream buffer=new ByteArrayOutputStream();
            int ch;

          //类文件解密

           while((ch=in.read())!=-1){
                byte b=(byte)(ch-key);
                buffer.write(b);
            }
            in.close();
            return buffer.toByteArray();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            in.close();
        }
        return null;
    }

运行

private void runClass(String name, String key) {
        try {
            MyClassLoader loader = new MyClassLoader(name, key);
            Class c = loader.loadClass(name);
            String[] args = new String[] {};
            Method m = c.getMethod("main", args.getClass());
            m.invoke(null, (Object) args);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(this, e);
        }
    }

加密的外在表现为“文件类型的多样性”。无论是doc,docx,excel ,还是bat,ext,ini,随便你怎么搞。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大巨魔战将

如果对您有帮助,请打赏1分钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值