在我的Android应用程序中,我使用openssl lib和JNI来加密数据。 在C程序中,我能够使用RSA_public_encrypt()成功加密数据。但是我无法使用
返回字符串return (*env)->NewStringUTF(env, encryptedData);
我收到以下错误。
应用程序中的JNI检测错误:输入无效修改的UTF-8:非法连续字节0x5c。
JNIEXPORT jstring JNICALL Java_com_jni_JniLayer_PublicEncryption
(JNIEnv *env, jobject thisObj, jstring inData) {
__android_log_print(ANDROID_LOG_DEBUG, "Func", "---> %s \n", __func__);
const char *cData = (*env)->GetStringUTFChars(env, inData, NULL);
if( NULL == cData )
return (*env)->NewStringUTF(env, "NULL");
__android_log_print(ANDROID_LOG_DEBUG, "RSA", "The data to encrypt is : %s\n", cData);
RSA *rsa = NULL;
FILE *out = fopen("/sdcard/PublicKey", "r");
if( NULL == out )
{
__android_log_print(ANDROID_LOG_ERROR, "File", "Unable to Open file : PublicKey\n");
return (*env)->NewStringUTF(env, "NULL");
}
rsa = PEM_read_RSAPublicKey(out, NULL,NULL,NULL);
fclose(out);
//rsa = PEM_read_bio_RSA_PUBKEY(bioKey, &rsa, NULL, NULL);
if (NULL == rsa)
{
__android_log_print(ANDROID_LOG_ERROR, "File", "Unable to generate RSA struct from BioKey\n");
return (*env)->NewStringUTF(env, "NULL");
}
if(strlen(cData) > (RSA_size(rsa)-11) )
{
__android_log_print(ANDROID_LOG_ERROR, "RSA", "The data to be encrypted is more than maximum length of data to encrypt is : %d.\n",(RSA_size(rsa)-11));
return (*env)->NewStringUTF(env, "NULL");
}
unsigned char chEncryptedData[4098] = {};
int iResult = RSA_public_encrypt(strlen(cData), cData, chEncryptedData, rsa, RSA_PKCS1_PADDING);
(*env)->ReleaseStringUTFChars(env, inData, cData);
// If encryption fails, returns NULL string, else returns encrypted string
if(-1 == iResult)
{
char *chErrMsg = malloc(256);
ERR_load_crypto_strings();
ERR_error_string(ERR_get_error(), chErrMsg);
__android_log_print(ANDROID_LOG_ERROR, "RSA", "The data Encryption failed due to the reason : %s\n", chErrMsg);
free(chErrMsg);
return (*env)->NewStringUTF(env, "NULL");
}
__android_log_print(ANDROID_LOG_DEBUG, "RSA", "The Encrypted data is : %s\n", chEncryptedData);
return (*env)->NewStringUTF(env, chEncryptedData);
}
答案 0 :(得分:0)
问题是你没有尊重字节和字符之间的区别。在Java中,字节只是8位值,并且都是有效的。另一方面,字符是Unicode字符的UTF-8 format中的表示。现在大多数127以下的字节值表示UTF-8字符,但对于较大的值则不是这种情况。字符可以由几个字节组成,并且有关于哪些序列形成有效字符的严格规则。
如果要加密值,则需要使用字节,因为无法保证加密将产生有效的字符序列。事实上几乎可以肯定,序列无效。