Android JNI Aes加密

简介: /* * AES 加密工具类 * Created by mazaiting on 2018/7/3. */#include #include #include //#include "openssl/evp.
/*
 * 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) {
    // 待加密的数据
    const unsigned char *vItem = (const unsigned char *) "mazaiting";
    // 源数据长度
    int inLen = (int) strlen((const char *) vItem);
    // 加密长度
    int encLen = 0;
    // 输出长度
    int outlen = 0;
    // 加密数据长度
    unsigned char encData[1024] = {0};

    LOGD("source: %s\n", vItem);
    // 创建加密上下文
    EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
    // 初始化加密上下文
    EVP_CipherInit_ex(ctx, EVP_aes_256_ecb(), NULL, _key, _iv, 1);
    // 加密数据
    EVP_CipherUpdate(ctx, encData, &outlen, vItem, inLen);
    // 拼接长度
    encLen = outlen;
    // 结束加密
    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));
    // 解密长度
    int decLen = 0;
    // 解码数据长度
    outlen = 0;
    // 解码后的数据
    unsigned char decData[1024];
    // 创建解密上下文
    EVP_CIPHER_CTX *ctx2 = EVP_CIPHER_CTX_new();
    // 初始化解密
    EVP_CipherInit_ex(ctx2, EVP_aes_256_ecb(), NULL, _key, _iv, 0);
    // 执行解密
    EVP_CipherUpdate(ctx2, decData, &outlen, (const unsigned char *) encData1, encLen);
    // 设置长度
    decLen = outlen;
    // 结束解密
    EVP_CipherFinal(ctx2, decData + outlen, &outlen);
    // 拼接长度
    decLen += outlen;
    // 释放
    EVP_CIPHER_CTX_free(ctx2);
    // 设置字符串结尾标识
    decData[decLen] = '\0';
    LOGD("decrypt: %s\n", decData);
}
}
目录
相关文章
|
7天前
|
Android开发
Android JNI与CAN通信遇到的问题总结
Android JNI与CAN通信遇到的问题总结
30 1
|
29天前
|
Linux 数据安全/隐私保护 Windows
aes加密在linux下会生成随机key的解决办法
aes加密在linux下会生成随机key的解决办法
16 2
|
2月前
|
PHP 数据安全/隐私保护
在PHP中使用AES进行加密和解密
在PHP中使用AES进行加密和解密
|
3月前
|
存储 算法 安全
【加密算法】AES对称加密算法简介
【加密算法】AES对称加密算法简介
|
3月前
|
安全 小程序 数据安全/隐私保护
aes加密算法python版本
aes加密算法python版本
39 0
|
8天前
|
Android开发
Android JNI 报错(signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr )
Android JNI 报错(signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr )
36 1
|
4月前
|
算法 安全 物联网
全面了解AES加密:入门指南(二)
全面了解AES加密:入门指南
|
8天前
|
传感器 Java 开发工具
[NDK/JNI系列03] Android Studio集成NDK开发环境
[NDK/JNI系列03] Android Studio集成NDK开发环境
14 0
|
2月前
|
Android开发
[Android jni] Bitmap与Mat对象的相互转换
[Android jni] Bitmap与Mat对象的相互转换
56 0
|
3月前
|
算法 Android开发
安卓逆向 -- 自吐算法(3DES和AES)
安卓逆向 -- 自吐算法(3DES和AES)
20 1