#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)