JNI AES文件及字符串加解密

#include "aes.h"

#include "modes.h"

#include "e_os2.h"

#include "aes_locl.h"

#include "opensslconf.h"

AES_KEY aes;


//aes cbc模式加解密用到的向量

unsigned char iv[AES_BLOCK_SIZE];


for (i = 0; i < AES_BLOCK_SIZE; i++) {

   iv[i] = 0;


}

//設置aes加密的key和加密的長度

AES_set_encrypt_key(key, 128, &aes);

//開始aes加密,注意作爲cbc加密向量會改變

AES_cbc_encrypt((unsigned char*) string, encryptString, lenBuff, &aes, iv,AES_ENCRYPT);


JNIEXPORT jstring JNICALL Java_com_encrypt_EncryptActivity_aesEncryptFile(
        JNIEnv *env, jobject, jstring pathorg, jstring pathnow) {    int len;    char *buff;    const char *filepathorg;    const char *filepathnow;
    filepathorg = env->GetStringUTFChars(pathorg, 0);
    filepathnow = env->GetStringUTFChars(pathnow, 0);    AES_KEY aes;
    unsigned int i;    //aes加密所輸入的字符串
    unsigned char *inputString;    //aes加密後字符串指針
    unsigned char *encryptString;

    FILE* file = fopen(filepathorg, "rb+");    if (file) {
        fseek(file, 0L, SEEK_END);
        len = ftell(file);
        buff = (char *) malloc((len + 1) * sizeof(char));
        memset(buff, 0, len + 1);
        fseek(file, 0L, SEEK_SET);
        fread(buff, 1, len + 1, file);
        fclose(file);        //計算字符串的長度,如果不是16字節的倍數擴展爲16字節的倍數
        if ((len) % AES_BLOCK_SIZE == 0) {            //len = len + 1;
        } else {
            len = ((len) / AES_BLOCK_SIZE + 1) * AES_BLOCK_SIZE;
        }        //爲輸入字符串分配空間
        inputString = (unsigned char*) calloc(len + 1, sizeof(unsigned char));
        memset(inputString, 0, len + 1);        //爲aes加密後字符串分配空間
        encryptString = (unsigned char*) calloc(len + 1, sizeof(unsigned char));
        memset(encryptString, 0, len + 1);        //將從java段接收到的字串拷貝到加密輸入字串中,注意類型不一致
        memcpy((char*) inputString, buff, len + 1);        //設置加密向量,該值爲加密初始值
        for (i = 0; i < AES_BLOCK_SIZE; i++) {
            iv[i] = 0;
        }        //設置aes加密的key和加密的長度
        AES_set_encrypt_key(key, 128, &aes);        //開始aes加密,注意作爲cbc加密向量會改變
        AES_cbc_encrypt((unsigned char*) inputString, encryptString, len, &aes,
                iv, AES_ENCRYPT);
        FILE* filew = fopen(filepathnow, "wb");        if (filew) {
            fwrite(encryptString, 1, len, filew);
            fclose(filew);
        } else {            return env->NewStringUTF("Filed to create file!");
        }
    } else {        return env->NewStringUTF("Filed to read file!");
    }    //釋放出從java端接收的字符串
    env->ReleaseStringUTFChars(pathorg, filepathorg);
    env->ReleaseStringUTFChars(pathnow, filepathnow);    return 0;
}

1.aes加解密 採用openssl開源庫進行處理
2.將核心ase的代碼取出aes_core.cpp,aes.h,aes_locl.h,e_os2.h,modes.h,opensslconf.h
3.上述文件是openssl Aes加密的核心代碼,如下介紹的是aes cbc模式的加密方式,AES_ENCRYPT該值設爲AES_DECRYPT則爲解密,iv向量初始化加解密必須一致


資源下載:

Android jni aes加解密

http://192.210.60.138/dz/forum.php?mod=viewthread&tid=4

(出處: IStudy)



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章