Android AES暗号化のNDK実装

2609 ワード

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(buf));
    buf[len]='\0';
    return buf;
}

ソースアドレス:https://github.com/Ulez/EncryptLib また、暗号化された文字を表示するには、Base 64でトランスコードする必要があります.そうしないと、文字化けが表示されます.