Android JNI Aes加密

/*
 * 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);
}
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末乘综,一起剝皮案震驚了整個(gè)濱河市谐岁,隨后出現(xiàn)的幾起案子演侯,更是在濱河造成了極大的恐慌辉川,老刑警劉巖巍膘,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件聚凹,死亡現(xiàn)場(chǎng)離奇詭異室琢,居然都是意外死亡麻汰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門叠赐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來欲账,“玉大人,你說我怎么就攤上這事芭概∪唬” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵罢洲,是天一觀的道長(zhǎng)踢故。 經(jīng)常有香客問我,道長(zhǎng)惹苗,這世上最難降的妖魔是什么殿较? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮桩蓉,結(jié)果婚禮上淋纲,老公的妹妹穿的比我還像新娘。我一直安慰自己院究,他們只是感情好帚戳,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布玷或。 她就那樣靜靜地躺著,像睡著了一般片任。 火紅的嫁衣襯著肌膚如雪偏友。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天对供,我揣著相機(jī)與錄音位他,去河邊找鬼。 笑死产场,一個(gè)胖子當(dāng)著我的面吹牛鹅髓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播京景,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼窿冯,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了确徙?” 一聲冷哼從身側(cè)響起醒串,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鄙皇,沒想到半個(gè)月后芜赌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伴逸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年缠沈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片错蝴。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡洲愤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出顷锰,到底是詐尸還是另有隱情柬赐,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布馍惹,位于F島的核電站躺率,受9級(jí)特大地震影響玛界,放射性物質(zhì)發(fā)生泄漏万矾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一慎框、第九天 我趴在偏房一處隱蔽的房頂上張望良狈。 院中可真熱鬧,春花似錦笨枯、人聲如沸薪丁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽严嗜。三九已至粱檀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間漫玄,已是汗流浹背茄蚯。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留睦优,地道東北人渗常。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像汗盘,于是被迫代替她去往敵國和親皱碘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容