Android AES加密的NDK实现

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值