【问题标题】:encrypt and decrypt utf8 string in android NDK jni在android NDK jni中加密和解密utf8字符串
【发布时间】:2013-08-18 14:01:40
【问题描述】:

我编写了一个简单的字符串加密和解密,将字符串拆分为两个 var,并在字符串的左右交换后递增 asci 代码。

当我加密这个文本=“这是测试”时,这很好用,但是当加密 utf 字符时,不要像这个字符串那样的词=“تست تست تست تست”

加密代码是:

JNIEXPORT jstring JNICALL Java_com_test_ndk_MainActivity_encrypt(JNIEnv* env, jobject thiz, jstring dec) {
const char *nativeString = (*env)->GetStringUTFChars(env, dec, 0);
char *newstr;
char *left;
char *right;
int decLenght = strlen(nativeString);
int middl = decLenght / 2;
int i;
newstr = substr(nativeString, 0, middl);
int lenght = strlen(newstr);
left = malloc(lenght);
for (i = 0; i < lenght; i++) {
    left[i] = newstr[i] + 1;
}
left[lenght] = '\0';
newstr = substr(nativeString, middl, decLenght - middl);
lenght = strlen(newstr);
right = malloc(lenght);
for (i = 0; i < lenght; i++) {
    right[i] = newstr[i] - 1;
}
right[lenght] = '\0';
strcat(right, left);
(*env)->ReleaseStringUTFChars(env, dec, nativeString);
return (*env)->NewStringUTF(env, right);
}

解密代码是:

JNIEXPORT jstring JNICALL Java_com_test_ndk_MainActivity_decrypt(JNIEnv* env, jobject thiz, jstring enc) {
const char *nativeString = (*env)->GetStringUTFChars(env, enc, 0);
char *newstr;
char *left;
char *right;
int encLenght = strlen(nativeString);
int middl = encLenght / 2;
int i;
if (encLenght % 2 != 0) {
    middl++;
}
newstr = substr(nativeString, 0, middl);
int lenght = strlen(newstr);
left = malloc(lenght);
for (i = 0; i < lenght; i++) {
    left[i] = (char) ((int) newstr[i] + 1);
}
left[lenght] = '\0';
newstr = substr(nativeString, middl, encLenght - middl);
lenght = strlen(newstr);
right = malloc(lenght);
for (i = 0; i < lenght; i++) {
    right[i] = (char) ((int) newstr[i] - 1);
}
right[lenght] = '\0';
strcat(right, left);
(*env)->ReleaseStringUTFChars(env, enc, nativeString);
return (*env)->NewStringUTF(env, right);
}

substr 函数:

char* substr(const char *source, unsigned int start, unsigned int end) {
return strndup(source + start, end);
}

有人有解决办法吗?

【问题讨论】:

  • 您的代码有很多问题 - 它超出缓冲区并泄漏内存。阅读 C 中的字符串处理线 - 它与 Java 完全不同。此外,您使用的 +1/-1 加密方案可能会破坏 UTF-8 字符,因此需要格外小心。阅读 UTF-8 的结构。
  • 在字节数组上定义加密和解密算法更容易。您可以使用 Java 库类轻松地将 Java 字符串转换为字节数组。就此而言,您可以使用 Java 库类轻松加密和解密。

标签: android c++ c android-ndk java-native-interface


【解决方案1】:

UTF-8 对于操作来说并非易事。对于您的编码/解码,您可以使用GetStringChars()(或更高效但也更严格的GetStringCritical())并操作生成的 16 位 jchar 数组。

【讨论】:

  • 哪个函数可以操作 jchar ?我测试 get error 例如 substring 或 strlen ,...everythink 与 char 一起工作。
  • 你可以使用wcslen()等,或者更好的std::wstring类。参见例如stackoverflow.com/a/9100041/192373。问题是,wchar_t 在 NDK 中是 32 位的。但出于您的目的,对 16 位 字符 数组轻松实现 strlen() 就足够了。
  • 我无法工作,你能将我的代码变量转换为使用 unicode 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 1970-01-01
  • 2012-07-01
  • 2023-03-14
相关资源
最近更新 更多