我正在嘗試編寫一個使用WinAPI CryptprotectData和CryptUnprotectData函數的java應用程序。我正在嘗試通過使用java JNI來完成此操作。這是我第一次使用JNI,並且在解密數據時遇到了問題。我在Visual Studio中調試了這個,發現對CryptUnprotectData的調用返回false,並且函數返回NULL。我不知道爲什麼這樣做。使用JNI時CryptUnprotectData返回false
下面是代碼:
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。任何幫助/建議將不勝感激!
謝謝!我不知道我是如何錯過的,現在起作用 – user1036756