[Java密码学] 3、加密Class文件并实现调用加密的文件

Hello,大家好, 我是Shendi,这次给大家带来一系列密码学教程,这次给大家带来了加密Class文件并实现运行加密的Class

同系列博文:

[Java密码学]1、Java的反射

[Java密码学]2、简单加密,解密

先说思路,通过第二节我们学会了加密数据(文件),所以我们可以很容易的加密class文件,但是加密后如何运行呢?

我们可以通过字节流将加密后的class加载进内存

Java提供了ClassLoader 类加载器,所有类都是通过这个来加载的

通过第一节,我们知道了ClassLoader中有一个defineClass函数 可以将data数组转为一个类,

但是要使用这个函数我们就需要自己定义ClassLoader

获取到类后,我们就可以通过反射来调用此类的函数和字段了

(因为是反射调用,所以性能方面会慢一点,并且代码方面不再是平常的导入了,而全都是通过反射调用)

举个例子,有三个Class,Start,Hello,World

Start类为启动类,所以我们不能加密此类,我们只能加密Hello和World类

在Start类中,我们需要将这两个加密类加载进内存,用流的方式,在通过类加载器加载这两个类,我们就可以调用这两个类的函数

但是如果我们想在Hello类的函数中调用World的函数,则又需要重复此操作---将World类的加密形式加载成byte[]然后通过...

下面我们就来实现 Start类 Hello类 World类

(我们通过Start类调用Hello的hello函数,hello函数调用World的world函数)

首先我们先编写两个加密类,从World类开始 World类只有world函数 输出world字符串 很简单

/**
 * @author Shendi
 * <a href='tencent://AddContact/?fromId=45&fromSubId=1&subcmd=all&uin=1711680493'>QQ</a>
 */
public class World {
	public void world() {
		System.out.println(" world");
	}
}

然后我们将World编译,并加密此Class(加密方法看第二节)

接下来我们编写Hello类,我们的Hello类有hello函数,并且函数内要调用World类的world函数 

所以需要解密 要将解密后的数据加载成类,所以需要继承ClassLoader

/**
 * @author Shendi
 * <a href='tencent://AddContact/?fromId=45&fromSubId=1&subcmd=all&uin=1711680493'>QQ</a>
 */
public class Hello extends ClassLoader {
	public void hello() throws Exception {
		System.out.println("hello");
		//我们需要调用World类 所以我们需要知道World.class的位置
		//我用的dos编译 所以文件会在此类的同目录(这里为了方便 异常全都抛出了)
		InputStream input = new FileInputStream("World.class");
		//存储World.class的二进制形式(加密后的)
		byte[] data = new byte[input.available()];
		//读取
		while (input.read(data) != -1);
		input.close();
		//解密数据(注:World.class是已经加密的)
		decodeAddI(data);
		//解密后我们将byte[]加载成类 这里的第一个参数为null 因为我们不知道这个类的全名
		Class<?> World = defineClass(null, data,0,data.length);
		//我们要调用World类的world函数 所以我们需要获取这个类的实例
		Object world = World.newInstance();
		//获取此方法
		Method method = World.getMethod("world");
		method.invoke(world);
	}
	/**
	 * -解密算法 加i算法 将所有字节减i 可和加密算法互换用
	 * @param encrypt 传递此参数 将此参数解密
	 */
	public void decodeAddI(byte[] encrypt) {
		encrypt[0] -= 1;
		for (int i = 1;i < encrypt.length;i++) {
			encrypt[i] = (byte) (encrypt[i] - i);
		}
	}
}

我们的Start类是启动类,所以有main函数,并且需要解密文件,那么就需要有一个解密的函数(就用上节的字节+i法)

而且需要将class加载成流,所以要用到InputStream,并且需要将流加载成类,要继承ClassLoader,所以代码如下(详细看注释)

 

/**
 * @author Shendi
 * <a href='tencent://AddContact/?fromId=45&fromSubId=1&subcmd=all&uin=1711680493'>QQ</a>
 */
public class Start extends ClassLoader {
	public Start() throws Exception {
		//我们需要调用Hello类 不需要调用World类 所以我们需要知道Hello.class的位置
		//我用的dos编译 所以文件会在此类的同目录(这里为了方便 异常全都抛出了)
		InputStream input = new FileInputStream("Hello.class");
		//存储Hello.class的二进制形式(加密后的)
		byte[] data = new byte[input.available()];
		//读取
		while (input.read(data) != -1);
		input.close();
		//解密数据(注:Hello.class是已经加密的)
		decodeAddI(data);
		//解密后我们将byte[]加载成类 这里的第一个参数为null 因为我们不知道这个类的全名
		Class<?> Hello = defineClass(null, data,0,data.length);
		//我们要调用Hello类的hello函数 所以我们需要获取这个类的实例
		Object hello = Hello.newInstance();
		//获取此方法
		Method method = Hello.getMethod("hello");
		method.invoke(hello);
	}
	
	public static void main(String[] args) throws Exception {
		new Start();
	}
	
	/**
	 * -解密算法 加i算法 将所有字节减i 可和加密算法互换用
	 * @param encrypt 传递此参数 将此参数解密
	 */
	public void decodeAddI(byte[] encrypt) {
		encrypt[0] -= 1;
		for (int i = 1;i < encrypt.length;i++) {
			encrypt[i] = (byte) (encrypt[i] - i);
		}
	}
}

最后,测试运行结果,我们将三个文件都编译,放一个文件夹内,并且将Hello,World类加密

然后我们运行Start类,结果如下

加密完成!

如果对您有用的话,点个赞再走吧~ 

关注我,获取更多

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
简要介绍: 本工具是对java class文件进行加密保护的工具!本工具全面支持linux/unix/windows操作系统。 众所周知,java编译后的class文件是一种中间字节字文件, 很容易被反编译工具反编译,而传统的java源代码保护方法基本都是采用混淆的方式, 但这样会带来很多麻烦,而且也不能真正保护class文件, 本工具是对class文件进行加密,采用jni的方式解密运行, 加密算法达到256位,加密后的class文件不可能被破解,反编译工具也对加密后的class文件无能为力。 运行方式: 运行时,要能正确的加载加密后的class文件, 必须使用我们提供的动态链接库classloader.dll(wndows操作系统)或者libclassloader.so(Linux、Unix操作系统)。 执行java时带上参数-agentlib:\classloader 注意此处不要后缀名.dll(或者.so)。 如: windows下执行javajava -agentlib:C:\classloader HelloWorld Linux、Unix等系列操作系统下执行javajava -agentlib:/home/classloader HelloWorld 应用场合: 独立的应用程序,运行java时,带上参数-agentlib:\classloader Tomcat、Jboss等Java application server修改启动脚本, 把执行java的命令行后面加上参数-agentlib:\classloader 适应环境: 操作系统:所有操作系统,Windows系统、Linux/Unix,只是运行时, 使用的动态链接库文件不一样而已,其它配置完全一样。 jdk必须1.5以上。 下载地址: http://www.cr8ge.com/admin/upload/2011020917102317195.rar http://www.kmcxzs.cn/admin/upload/2011020917131925480.rar
软件介绍 本工具是对java class文件进行加密保护防止反编译的工具!本工具全面支持linux/unix/windows操作系统。 继推出v1.0版本后,获得了用户大量的支持与的反馈,我们再次推出本v2.0版,对加密算法进行了更大的改进,安全性大大提升! 众所周知,java编译后的class文件是一种中间字节字文件, 很容易被反编译工具反编译,而传统的java源代码保护方法基本都是采用混淆的方式, 但这样会带来很多麻烦,而且也不能真正保护class文件, 本工具是对class文件进行加密,采用jni的方式解密运行, 加密算法达到256位,加密后的class文件不可能被破解,反编译工具也对加密后的class文件无能为力。 运行方式: 运行时,要能正确的加载加密后的class文件, 必须使用我们提供的动态链接库classloader.dll(windows操作系统)或者libclassloader.so(Linux、Unix操作系统)。 执行java时带上参数-agentlib:\classloader 注意此处不要后缀名.dll(或者.so)。 如: 我把classloader.dll放在C:\目录下; 运行加密后的class文件命令如下: windows下执行javajava -agentlib:C:\classloader Sample Linux、Unix等系列操作系统下执行javajava -agentlib:/home/classloader Sample 或者把libclassloader.so拷贝到如“/home/yzj/jdk1.6.0_23/jre/lib/i386/”这jdk的运行目录下, 然后执行java如:java -agentlib:classloader Sample 当然如果class文件加密,这样运行也不会出错! 应用场合: 独立的应用程序,运行java时,带上参数-agentlib:\classloader Tomcat、Jboss等Java application server修改启动脚本, 把执行java的命令行后面加上参数-agentlib:\classloader 适应环境: 操作系统:所有操作系统,Windows系统、Linux/Unix,只是运行时, 使用的动态链接库文件不一样而已,其它配置完全一样。 jdk必须1.5以上。 备注:如果下载站下载下来的程序有运行bug,请从上面两个下载地址更新软件。并给我们留言!谢谢... 升级提示:v2.1相比v2.0修改了一个注册bug。
Java国产加密算法主要包括SM2密码算法和SM3密码杂凑算法。 SM2密码算法是一种国产的非对称加密算法,用于数字签名和加密通信。它基于椭圆曲线密码学,具有高度安全性和效率。通过Java可以使用国密文档提供的实现,使用SM2算法进行加密、签名和验签操作。要使用SM2算法,可以引入Bouncy Castle库的依赖,该库提供了对SM2算法的支持。例如,可以在项目的pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15to18</artifactId> <version>1.68</version> </dependency> ``` 然后,可以使用Java代码来调用Bouncy Castle库提供的SM2算法实现,进行加密、签名和验签等操作。 SM3密码杂凑算法是一种国产的密码学哈希函数,常用于数据完整性校验和身份认证等场景。与传统的哈希算法相比,SM3具有更高的安全性和抗碰撞能力。在Java中,可以使用相应的库或者工具类来调用SM3算法,对数据进行杂凑计算。然而,由于没有给出具体的引用内容,我无法提供更加详细的使用说明。 因此,如果你需要在Java中使用国产加密算法,可以参考国密文档提供的实现方式,同时引入Bouncy Castle库的依赖来支持SM2算法的使用。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [国产加密SM3算法java实现长度64位](https://download.csdn.net/download/qq_27917221/11649513)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Java实现国产加密算法SM4(ECB和CBC两种模式)](https://blog.csdn.net/trustProcess/article/details/127865787)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

HackShendi

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值