Android AES加密的NDK实现

来源:互联网 发布:斯米诺黑牌伏特加知乎 编辑:程序博客网 时间:2024/05/23 10:48

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转码一下,不然显示的是乱码。

原创粉丝点击