#include "jiami.h"

#include "jni.h"
#include "com_test_start_CommonClassLoader.h" static void arraycopy(JNIEnv * env, jbyteArray sb, int spo, jbyteArray db,
int start, int len); static jbyteArray encrypt(JNIEnv * env, jbyteArray b, jint len);
static jbyteArray getValidateCode(JNIEnv * env);
static jbyteArray getCode(JNIEnv * env); /* * Clasbs: com_test_start_CommonClassLoader
* Method: defineClass0
* Signature: (Ljava/lang/String;[BII)Ljava/lang/Class;
*/
JNIEXPORT jclass JNICALL Java_com_test_start_CommonClassLoader_defineClass0(
JNIEnv * env, jobject loader, jstring name, jbyteArray buffer,
jint start, jint len) {
jbyteArray temp = env - > NewByteArray(len); //new一个数组,并申请一块内存
arraycopy(env, buffer, start, temp, start, len); //数组的复制相当于System.copy()方法
jbyteArray byte0 = encrypt(env, temp, len); //进行class文件的解密操作
if (byte0 == NULL) {
env - > DeleteLocalRef(temp); //释放内存
return NULL;
}
jsize size = env - > GetArrayLength(byte0); //技术数组的长度相当于Array的length属性
jclass classLoader = env - >
GetSuperclass(env - >
GetSuperclass(env - >
GetSuperclass(env - > GetObjectClass(loader)))); //获取父类装载器
jmethodID mid = env - >
GetMethodID(classLoader, "defineClass",
"(Ljava/lang/String;[BII)Ljava/lang/Class;"); //获取defineClass方法
defineClass jclass cls = (jclass) env - >
CallObjectMethod(loader, mid, name, byte0, start,
size); //调用Classloader的defineClass定义一个类到jvm中
env - > DeleteLocalRef(byte0); //释放内存
return cls;
}
/*
* Class: com_test_start_CommonClassLoader
* Method: defineClass1
* Signature: (Ljava/lang/String;[BIILjava/security/ProtectionDomain;)Ljava/lang/Class;
*/
JNIEXPORT jclass JNICALL Java_com_test_start_CommonClassLoader_defineClass1(
JNIEnv * env, jobject loader, jstring name, jbyteArray buffer,
jint start, jint len, jobject pro) {
jbyteArray temp = env - > NewByteArray(len);
arraycopy(env, buffer, start, temp, start, len);
jbyteArray byte0 = encrypt(env, temp, len);
if (byte0 == NULL) {
env - > DeleteLocalRef(temp);
return NULL;
}
jsize size = env - > GetArrayLength(byte0);
jclass classLoader = env - >
GetSuperclass(env - >
GetSuperclass(env - >
GetSuperclass(env - > GetObjectClass(loader))));
jmethodID mid = env - >
GetMethodID(classLoader, "defineClass",
"(Ljava/lang/String;[BIILjava/security/ProtectionDomain;)Ljava/lang/Class;");
jclass cls = (jclass) env - >
CallObjectMethod(loader, mid, name, byte0, start, size, pro);
env - > DeleteLocalRef(byte0);
return cls;
}
/* getCode,密钥,用于加密 */
static jbyteArray getCode(JNIEnv * env) {
char char0[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
char char1[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 's',
'y', 'z'
};
char char2[36];
int i = 0;
int j = 0;
int k = 0;
while (i < 36) {
if (i >= 12 && j < 10) {
char2[i] = char0[j];
j++;
} else if (i >= 23 && k < 26) {
char2[i] = char1[k];
k++;
} else {
char2[i] = char1[k];
k++;
}
i++;
}
jbyteArray code = env - > NewByteArray(36);
env - > SetByteArrayRegion(code, 0, 36, (jbyte * ) char2);
return code;
}
/* getValidateCode,验证码用于区分是否是加密文件 */
static jbyteArray getValidateCode(JNIEnv * env) {
char char0[] = {'0', '1', '2', '3', '4', '5', '6', '7'};
jbyteArray char1 = env - > NewByteArray(8);
env - > SetByteArrayRegion(char1, 0, 8, (jbyte * ) char0);
return char1;
}
/* encrypt,解密操作 */
static jbyteArray encrypt(JNIEnv * env, jbyteArray b, jint len) {
int i = 0;
jint j = 0;
int k = len;
jbyte * bb = (env - > GetByteArrayElements(b, JNI_FALSE));
while (i < k) {
j = bb[i];
if ((j >= 48) && (j <= 57)) {
j = (((j - 48) + 5) % 10) + 48;
} else if ((j >= 65) && (j <= 90)) {
j = (((j - 65) + 13) % 26) + 65;
} else if ((j
>= 97) && (j <= 122)) {
j = (((j - 97) + 13) % 26) + 97;
}
bb[i] = (jbyte) j;
i++;
}
env - > SetByteArrayRegion(b, 0, k, bb);
int length = 500; //长度
int start = 0; //起始次数
jbyteArray temp = getCode(env); //密钥
int mode = (k - 8) % (length + 36); //剩余部分
int count = (k - 8) / (length + 36); //总次数
int spo = 0; //源位置
int dpo = 0; //目标位置
int size = count * length + mode; //大小
jbyteArray byte0 = env - > NewByteArray(size); //密文大小
if (count > 0) { //进行解密
while (start < count) {
arraycopy(env, b, spo, byte0, dpo, length);
spo = spo + length + 36;
dpo = dpo + length;
start++;
}
}
if (mode > 0) { //复制剩余部分
arraycopy(env, b, spo, byte0, dpo, mode);
spo = spo + mode;
} //校验码
jbyteArray validateCode0 = getValidateCode(env);
jbyte *
validateCode = env - >
GetByteArrayElements(validateCode0, JNI_FALSE);
jbyteArray validate0 = env - > NewByteArray(8);
arraycopy(env, b, spo, validate0, 0, 8);
jbyte * validate = env - > GetByteArrayElements(validate0, JNI_FALSE);
for (int index = 0; index < 8; index++) { //校验解码是否成功
if (validate[index] != validateCode[index]) {
return NULL;
}
}
env - > DeleteLocalRef(validate0);
env - > DeleteLocalRef(validateCode0);
env - > DeleteLocalRef(temp);
return byte0;
}
/* decrypt,加密操作 */
static jbyteArray decrypt(JNIEnv * env, jbyteArray b, jboolean end) {
int length = 500; //长度
int start = 0; //起始次数
int count = env - > GetArrayLength(b) / length; //总次数
jbyteArray temp = getCode(env); //密钥
int spo = 0; //源位置
int dpo = 0; //目标位置
int mode = env - > GetArrayLength(b) % length; //剩余部分
int size = count * (length + 36) + mode; //大小
if (end == JNI_TRUE) { //是否结束
size = size + 8;
}
jbyteArray byte0 = env - > NewByteArray(size); //密文大小
if (count > 0) { //进行加密
while (start < count) {
arraycopy(env, b, spo, byte0, dpo, length);
arraycopy(env, temp, 0, byte0, dpo + length, 36);
spo = spo + length;
dpo = dpo + length + 36;
start++;
}
}
if (mode > 0) { //复制剩余部分
arraycopy(env, b, spo, byte0, dpo, mode);
dpo = dpo + mode;
}
if (end == JNI_TRUE) { //结束位置加校验码
jbyteArray validateCode = getValidateCode(env);
arraycopy(env, validateCode, 0, byte0, dpo, 8);
env - > DeleteLocalRef(validateCode);
}
jbyte * byte1 = env - > GetByteArrayElements(byte0, 0); //转换字节位置
int i = 0;
int j = 0;
int k = size;
while (i < k) {
j = byte1[i];
if ((j >= 48) && (j <= 57)) {
j = (((j - 48) + 5) % 10) + 48;
} else if ((j >= 65) && (j <= 90)) {
j = (((j - 65) + 13) % 26) + 65;
} else if ((j >= 97) && (j <= 122)) {
j = (((j - 97) + 13) % 26) + 97;
}
byte1[i] = (jbyte) j;
i++;
}
env - > SetByteArrayRegion(byte0, 0, size, byte1);
env - > DeleteLocalRef(temp);
return byte0;
}
/* arraycopy,自定义的数组赋值方法相当于System.copy() */
static void arraycopy(JNIEnv * env, jbyteArray sb, int spo, jbyteArray db,
int start, int len) {
jbyte * t = new jbyte[len];
env - > GetByteArrayRegion(sb, spo, len, t);
env - > SetByteArrayRegion(db, start, len, t);
delete t;
}

  参考:http://blog.csdn.net/chenshuang_com/article/details/7681670

使用定制ClassLoader来对保护j2ee程序

http://www.ibm.com/developerworks/cn/java/l-protectjava/

c++实现加密和解密算法以及JNI技术的应用实例的更多相关文章

  1. JAVA实现AES的加密和解密算法

    原文 JAVA实现AES的加密和解密算法 import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import ja ...

  2. DES的加密与解密算法(Python实现)

    DES的加密与解密算法(Python实现) 密码学实验:实现了DES的简单的加密和解密算法,DES算法的相关资料网上很多,这里不再赘述,仅仅贴出源代码给大家分享,源码中包含很多汉字注释,相信大家都是可 ...

  3. 常见的加密和解密算法—AES

    一.AES加密概述 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用 ...

  4. 常见的加密和解密算法—DES

    一.DES加密概述 DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并 ...

  5. 常见的加密和解密算法—BASE64

    一.BASE64加密和解密概述 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,Base64编码可用于在HTTP环境下传递较长的标识信息.例如,在Java Persistence系 ...

  6. 常见的加密和解密算法—MD5

    一.MD5加密概述 Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.该算法的文件号为RFC 13 ...

  7. BASE64,MD5,SHA,HMAC加密與解密算法(java)

    package com.ice.webos.util.security; import java.io.UnsupportedEncodingException; import java.math.B ...

  8. java之--加密、解密算法

    0.概述 在项目开发中,我们常需要用到加解密算法,加解密算法主要分为三大类: 1.对称加密算法,如:AES.DES.3DES 2.非对称加密算法,如:RSA.DSA.ECC 3.散列算法,如:MD5. ...

  9. c# DESEncrypt 加密、解密算法

    using System; using System.Security.Cryptography; using System.Text; namespace AttendService { publi ...

随机推荐

  1. 使用git推送代码到开源中国以及IDEA环境下使用git

    使用git推送代码到开源中国以及IDEA环境下使用git 在学习Java的过程中我们会使用到git这个工具来将我们本周所编写的代码上传到开源中国进行代码托管,而在使用git的时候有很多的同学由于不会操 ...

  2. 学习笔记——Maven实战(一)坐标规划

    坐标是什么?为什么要规划? 坐标是Maven最基本的概念,它就像每个构件的身份证号码,有了它我们就可以在数以千万计的构件中定位任何一个我们感兴趣的构件.举个最简单的例子,如果没有坐标,使用JUnit的 ...

  3. EF实体框架之CodeFirst四

    在EF实体框架之CodeFirst二中也提到数据库里面一般包括表.列.约束.主外键.级联操作.实体关系(E-R图).存储过程.视图.锁.事务.数据库结构更新等.前面几篇博客把表.存储过程.视图这些算是 ...

  4. DELL VENUE 11 PRO系统损坏之后的解决办法

    首页说明下我的平板是dell venue 11 pro atom版+win8.1版. 前两天测试玩win10,结果后来几天这货直接开不了机了,每次提示自动修复,但是却说找不到某一文件,然后蓝屏,win ...

  5. ios上uiwebview的一些实用技巧

    前几个星期接到公司一个项目,要用webview在客户端上播视频,作为一个前端实习生,这种需求真是蛋疼……一不知webview是何方神圣,二不知咋调试…… 下面就是蛋疼的开始:  寻找调试工具:好,非w ...

  6. [vijos1892]树上的最大匹配(树形DP)

    题目:https://vijos.org/p/1892 分析:(100分其实用到各种c++优化,没什么实际意义,所以弄70就可以了) 题目很简单,很容易想出用树形DP,但是求方案数的时候,满满都是细节 ...

  7. [poj2184]我是来水一下背包的

    http://poj.org/problem?id=2184 题意:01背包的变种,就是说有2组值(有负的),你要取一些物品是2阻值的和非负且最大 分析: 1.对于负的很好处理,可以把他们都加上一个数 ...

  8. Source Tree for MAC1.6

    Atlassian ID has become the new Atlassian Account. Read more about it here. After some great communi ...

  9. tomcat发布项目时,localhost可以访问,用ip地址不能访问,同时其他电脑也不能访问。

    最近在开发项目中,遇到的一个问题是:在 tomcat中发布一个web项目,但是发布成功后,只能用http://localhost:8080/aml访问项目,不能用http://172.0.0.1:80 ...

  10. 【转】document.documentElement和document.body的区别

    转自:http://www.cnblogs.com/ckmouse/archive/2012/01/30/2332070.html 网页中获取滚动条卷去部分的高度,可以通过 document.body ...