c++实现加密和解密算法以及JNI技术的应用实例

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

#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技术的应用实例,布布扣,bubuko.com

时间: 2024-12-14 18:11:14

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

一次一密加密、解密算法

1. 一次一密加密.解密算法 一次一密密码系统的一个重要特性是密钥K为一个真随机序列,且密钥只使用一次. 下面通过计算机的伪随机函数产生的随机序列作为密钥来简单演示一次一密的加密解密算法,代码示例如下: /** * 一次一密加密.解密算法 * @param str 明文(密文) * @param key 密钥 * @return 密文(明文) */ static char[] bitcode(char[] str, char[] key){ int len,i; char[] wen; len

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

一.AES加密概述 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用.经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准.2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一. Rijndae

替换加密、解密算法

替换加密解密算法方案的起源可以追溯到凯撒(Caesar)时代,据说凯撒为了保障情报的可靠性而发明了凯撒密码.凯撒密码是一种简单的置换密码,在加密时,字母表中的每个字母都用其后的第三个字母表示,例如,a用d表示,b用e表示,.......在解密时,只需要执行逆过程即可. 1. 替换加密.解密算法 随这历史的发展,替换密码算法方案已具有很多种形式,主要有以下几种: 单表代替密码算法方案 同音代替密码算法方案 多表代替密码算法方案 多字母组代替密码算法方案 下面以单表代替密码算法方案为例进行介绍. 1

位加密、解密算法

位加密解密算法即将明文信息转化为二进制数据,然后对这些二进制位进行加密便得到密文.位加密算法依托于计算机的强大的位处理能力,在实际应用中非常流行.现代密码学中的很多加密.解密算法方案都依赖于位加密.解密思路,例如,非常流行的序列密码方案. 1. 位加密.解密算法 在java语言中,提供了6种位运算符,如下表所示.在密码学中,可以根据需要来选择合适的位运算符进行加密.解密.一般来说,使用异或运算要比较方便. 位运算 名称 & 按位与(AND) | 按位或(OR) ^ 按位异或(XOR) ~ 取反(

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

一.MD5加密概述 Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.该算法的文件号为RFC 1321(R.Rivest,MIT Laboratory for Computer Science and RSA Data Security Inc. April 1992). MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用

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

原文 JAVA实现AES的加密和解密算法 import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; /** * AES 是一种可逆加密算法,对用户的敏感信息加密处理 * 对原始数据进行AES加密后,在进行Base6

换位加密、解密算法

换位密码算法方案,又称为置换加密方案,其根据一定的规则重新安排明文字母,使之成为密文.换位密码是最简单的密码学算法. 1. 换位加密.解密算法 换位加密解密的算法有很多种,这里介绍基于二维数组移位的换位加密.解密算法.二维数组移位的换位加密.解密算法即将明文字符串按照一个给定的顺序保存在二维数组中,然后按照另外一个顺序读出,便的到密文.执行相反的过程便可以恢复出明文. 1)换位加密算法 基于二维数组移位的加密算法的操作步骤如下: (1)给定一个二维数组的列数,即该二维数组每行可以保存的字符个数.

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

一.DES加密概述 DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来.需要注意的是,在某些文献中,作为算法的DES称为数据加密算法(Data Encryption Algorithm,DEA),已与作为标准的DES区分开来. DES入口参数 DES算法的入口参数有三个:Key.Data.Mode.其中Key为

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

package com.ice.webos.util.security; import java.io.UnsupportedEncodingException; import java.math.BigInteger; import java.security.Key; import java.security.MessageDigest; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.c