/*
* AES 加密工具類
* Created by mazaiting on 2018/7/3.
*/
#include <jni.h>
#include <cstring>
#include <android/log.h>
//#include "openssl/evp.h"
#include <openssl/evp.h>
#include <openssl/buffer.h>
#define TAG "AES_CPP"
#define LOGD(FORMAT, ...) __android_log_print(ANDROID_LOG_DEBUG,TAG,FORMAT,##__VA_ARGS__);
// 命名空間
//using namespace std;
extern "C" {
// 初始化key
const unsigned char *_key = (const unsigned char *) "0123456789012345";
// 初始化iv
const unsigned char *_iv = (const unsigned char *) "0123456789012345";
/**
* Use EVP to Base64 encode the input byte array to readable text
*/
char *base64(const unsigned char *inputBuffer, int inputLen) {
EVP_ENCODE_CTX ctx;
int base64Len = (((inputLen + 2) / 3) * 4) + 1; // Base64 text length
// int pemLen = base64Len + base64Len/64; // PEM adds a newline every 64 bytes
char *base64 = new char[base64Len];
int result;
EVP_EncodeInit(&ctx);
EVP_EncodeUpdate(&ctx, (unsigned char *) base64, &result, (unsigned char *) inputBuffer,
inputLen);
EVP_EncodeFinal(&ctx, (unsigned char *) &base64[result], &result);
return base64;
}
/**
* Use EVP to Base64 decode the input readable text to original bytes
*/
char *unbase64(char *input, int length) {
EVP_ENCODE_CTX ctx;
int orgLen = (((length + 2) / 4) * 3) + 1;
char *orgBuf = new char[orgLen];
int result, tmpLen;
EVP_DecodeInit(&ctx);
EVP_DecodeUpdate(&ctx, (unsigned char *) orgBuf, &result, (unsigned char *) input, length);
EVP_DecodeFinal(&ctx, (unsigned char *) &orgBuf[result], &tmpLen);
result += tmpLen;
return orgBuf;
}
JNIEXPORT jobjectArray JNICALL
Java_com_mazaiting_aesdemo_Encrypt_setValues(JNIEnv *env, jclass type) {
// 待加密的數(shù)據(jù)
const unsigned char *vItem = (const unsigned char *) "mazaiting";
// 源數(shù)據(jù)長(zhǎng)度
int inLen = (int) strlen((const char *) vItem);
// 加密長(zhǎng)度
int encLen = 0;
// 輸出長(zhǎng)度
int outlen = 0;
// 加密數(shù)據(jù)長(zhǎng)度
unsigned char encData[1024] = {0};
LOGD("source: %s\n", vItem);
// 創(chuàng)建加密上下文
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
// 初始化加密上下文
EVP_CipherInit_ex(ctx, EVP_aes_256_ecb(), NULL, _key, _iv, 1);
// 加密數(shù)據(jù)
EVP_CipherUpdate(ctx, encData, &outlen, vItem, inLen);
// 拼接長(zhǎng)度
encLen = outlen;
// 結(jié)束加密
EVP_CipherFinal(ctx, encData + outlen, &outlen);
// 拼接
encLen += outlen;
// 釋放
EVP_CIPHER_CTX_free(ctx);
// base64編碼
char *baseEnc = base64(encData, encLen);
LOGD("encrypted : %s\n", baseEnc);
// base64解碼
char *encData1 = unbase64(baseEnc, (int) strlen(baseEnc));
// 解密長(zhǎng)度
int decLen = 0;
// 解碼數(shù)據(jù)長(zhǎng)度
outlen = 0;
// 解碼后的數(shù)據(jù)
unsigned char decData[1024];
// 創(chuàng)建解密上下文
EVP_CIPHER_CTX *ctx2 = EVP_CIPHER_CTX_new();
// 初始化解密
EVP_CipherInit_ex(ctx2, EVP_aes_256_ecb(), NULL, _key, _iv, 0);
// 執(zhí)行解密
EVP_CipherUpdate(ctx2, decData, &outlen, (const unsigned char *) encData1, encLen);
// 設(shè)置長(zhǎng)度
decLen = outlen;
// 結(jié)束解密
EVP_CipherFinal(ctx2, decData + outlen, &outlen);
// 拼接長(zhǎng)度
decLen += outlen;
// 釋放
EVP_CIPHER_CTX_free(ctx2);
// 設(shè)置字符串結(jié)尾標(biāo)識(shí)
decData[decLen] = '\0';
LOGD("decrypt: %s\n", decData);
}
}
Android JNI Aes加密
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- Java Native Interface (JNI)標(biāo)準(zhǔn)是java平臺(tái)的一部分,它允許Java代碼和其他語(yǔ)言寫(xiě)的...
- 最近項(xiàng)目涉及到傳輸加密,對(duì)于現(xiàn)在比較安全和流行的加密技術(shù)做一個(gè)記錄和分享。 Demo地址 RSA對(duì)稱加密 所謂對(duì)稱...
- 簡(jiǎn)書(shū)地址:http://www.itdecent.cn/p/c68e08069460 GitHub地址:http...
- 需求 現(xiàn)在大多數(shù)的手機(jī)客戶端采用Http+Json的方式與服務(wù)器進(jìn)行通信,也有采用TCP+ProtoBuf實(shí)現(xiàn),前...
- 什么是aes加密?高級(jí)加密標(biāo)準(zhǔn)(英語(yǔ):Advanced Encryption Standard,縮寫(xiě):AES),在...