AES加密用java方式javax.crypto.Cipher这个类就行了,用NDK实现呢,也很简单。
NDK实现AES加密
这里我只做了ECB模式的加密,主要遇到的问题是加密后再次解密有一段乱码,而且奇葩的是每次执行效果不一定一样,c部分的代码是GitHub上搜索的,基本没有问题。后来发现在java 的string转化为byte,传入到C时会根据不足16位自动补全,只要在手动加上’\0’标识字符结束,然后在解密时也处理下这个结束字符,一切就正常了;
代码如下:
JNIEXPORT jbyteArray JNICALL Java_comulez_github_encryptlib_Encrypt4C_AES_1ECB_1decrypt_1byte
(JNIEnv *env, jobject instance, jbyteArray originByte, jbyteArray keyByte) {
jsize len = env->GetArrayLength(originByte); //获取长度
unsigned char *originChar = as_unsigned_char_array(env, originByte);
unsigned char *keyByteChar = as_unsigned_char_array(env, keyByte);
uint8_t buffer[len];
AES_ECB_decrypt(originChar, keyByteChar, buffer, len);
int realLen = 0;
for (int i = 0; i < len; i++) {
if (buffer[i] == '\0') {
break;
}
realLen++;
}
return as_byte_array(env, buffer, realLen);
}
unsigned char *as_unsigned_char_array(JNIEnv *env, jbyteArray array) {
int len = env->GetArrayLength(array);
unsigned char *buf = new unsigned char[len+1];
env->GetByteArrayRegion(array, 0, len, reinterpret_cast<jbyte *>(buf));
buf[len]='\0';
return buf;
}
源码地址:https://github.com/Ulez/EncryptLib
还有如果想要把加密后的字符显示出来,需要用Base64转码一下,不然显示的是乱码。