📄 loader.cpp
字号:
#include "loader.h"
#include "blowfish.h"
#include "memory.h"
/*
* Class: EnDecrypt
* Method: Decrypt
* Signature: ([BI[BI)V
* 加密操作
*/
JNIEXPORT jbyteArray JNICALL Java_Loader_Encrypt
(JNIEnv *jenv, jobject jobj, jbyteArray jsrc)
{
//加密和解密的密钥,BLOWFISH是对称加密算法,
//所以他的加密和解密的密钥是相同的
char *pucKey = "FTSAFE";
//构造一个BLOWFISH加解密算法对象,
//并初始化对象的密钥和密钥的大小
CBlowfish bf((unsigned char*)pucKey, sizeof(pucKey));
//由于blowfish要求数据长度必须时8字节的整数倍,
//所以这里要记录下原始数据的真实长度,并且把它保存
//到文件的头四个字节中
//然后根据8字节对齐要求添加相应的位数
int srcLen = jenv->GetArrayLength(jsrc);
int destLen = srcLen+4;
int off = destLen%8;
destLen += (8-off)%8;
jbyteArray jdest = jenv->NewByteArray(destLen);
jbyte *src = jenv->GetByteArrayElements(jsrc, 0);
jbyte *dest = jenv->GetByteArrayElements(jdest, 0);
memset(dest, 0, destLen);
memcpy(dest, &srcLen, sizeof(srcLen)); //保存数据的原始长度
memcpy(dest+sizeof(srcLen), src, srcLen);
bf.Encrypt((unsigned char*)dest, destLen);
jenv->ReleaseByteArrayElements(jsrc, src, 0);
jenv->ReleaseByteArrayElements(jdest, dest, 0);
return jdest;
}
/*
* Class: EnDecrypt
* Method: Encrypt
* Signature: ([BI[BI)V
* 解密操作,和加密操作相类似,
* 在解密的时候要去除头部的长度信息和尾部的
* 数据对齐信息,并且只保留真的的数据
*/
JNIEXPORT jbyteArray JNICALL Java_Loader_Decrypt
(JNIEnv *jenv, jobject jobj, jbyteArray jsrc)
{
char *pucKey = "FTSAFE";
CBlowfish bf((unsigned char*)pucKey, sizeof(pucKey));
jint destLen;
jint srcLen = jenv->GetArrayLength(jsrc);
jbyte *src = jenv->GetByteArrayElements(jsrc, 0);
bf.Decrypt((unsigned char*)src, srcLen);
memcpy(&destLen, src, sizeof(destLen)); //获取原始数据的长度
jbyteArray jdest = jenv->NewByteArray(destLen);
jbyte *dest = jenv->GetByteArrayElements(jdest, 0);
memcpy(dest, src+sizeof(destLen), destLen);
jenv->ReleaseByteArrayElements(jsrc, src, 0);
jenv->ReleaseByteArrayElements(jdest, dest, 0);
return jdest;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -