【问题标题】:CryptUnprotectData returns false when using JNICryptUnprotectData 在使用 JNI 时返回 false
【发布时间】:2013-02-03 00:27:36
【问题描述】:

我正在尝试编写一个使用 WinAPI CryptprotectData 和 CryptUnprotectData 函数的 java 应用程序。我正在尝试通过使用 java JNI 来实现这一点。这是我第一次使用 JNI,我在解密数据时遇到了问题。我在 Visual Studio 中对此进行了调试,发现对 CryptUnprotectData 的调用返回 false 并且函数返回 NULL。我不知道它为什么这样做。

代码如下:

JNIEXPORT jbyteArray JNICALL Java_Caller_Decrypt(JNIEnv * env, jobject obj, jbyteArray bytes)
{
   int len = env->GetArrayLength(bytes);
   jbyte * data = env->GetByteArrayElements(bytes,NULL);
   env->ReleaseByteArrayElements(bytes, data, 0);
   DATA_BLOB inData = {len, reinterpret_cast<unsigned char *>(data)};
   DATA_BLOB outData = {0,NULL};

   if(CryptUnprotectData(&inData,NULL,NULL,NULL,NULL,0,&outData))
   {
       LocalFree(inData.pbData);
       jbyteArray buff= env->NewByteArray(len);
       env->SetByteArrayRegion(buff,0,len,reinterpret_cast<jbyte *>(outData.pbData));
       return buff;
   }
   else
   {
       return NULL;
   }
}

这里是相关的java代码:

String password = "Password";
Caller c = new Caller();
System.out.println("Password");
byte[] buffer = c.Encrypt(password.getBytes());
System.out.println("Encrypted: " + new String(buffer));
System.out.println("Decrypted: " + new String(c.Decrypt(buffer)));

我不知道为什么 CryptUnprotectData 函数返回 false。自从我使用 c++ 并迷上了 java 已经有一年了,所以我有点生疏了,所以我可能只是错过了一些东西,但我想知道我是否只是错过了一步,因为这是我第一次使用JNI。任何帮助/建议将不胜感激!

【问题讨论】:

    标签: java c++ winapi java-native-interface


    【解决方案1】:

    这个程序有几个大的内存管理错误。

    1) 你调用env-&gt;ReleaseByteArrayElements(bytes, data, 0) 然后继续使用数据指针指向的内存内容。这个方法可能已经释放了它的内存,可能用内存管理信息覆盖了它的部分数据。这可能解释了为什么CryptUnprotectedData() 失败了。您必须在 CryptUnprotectedData() 之后或在复制数据之后调用 env-&gt;ReleaseByteArrayElements()

    2) 您在 inData.pbData 上调用 LocalFree()。这是指向env-&gt;GetByteArrayElements(bytes,NULL) 的指针,由JNI API 管理。并且必须由 JNI API 发布(您使用 ReleaseByteArrayElements BTW 太快了)。

    3) 您没有在 outData.pbData 上调用 LocalFree(),只有在使用 SetByteArrayRegion 复制数据后才应该这样做

    否则,我对 Windows Crypto API 的了解还不够,无法确定您是否正确调用它,但它对我来说是正确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-25
      • 1970-01-01
      • 2021-11-08
      • 2020-11-07
      • 2012-11-11
      • 1970-01-01
      • 2019-03-29
      • 1970-01-01
      相关资源
      最近更新 更多