Было бы полезно, если бы вы могли опубликовать свой C ++ и код C #. Возможно, есть некоторые тонкие различия параметров или что-то вроде этого. Например, вы должны убедиться, что параметр pOptionalEntropy одинаков (или установить его в NULL, чтобы проверить, является ли это источником ошибки). Также обязательно попытайтесь зашифровать и расшифровать на одном компьютере:
[...] дешифрование обычно может быть сделано только на
компьютер, на котором были данные
зашифрованы
(Источник: MSDN )
РЕДАКТИРОВАТЬ: Некоторые комментарии по поводу кода, который вы опубликовали, и версии C # из MSDN (ее части следующие):
public byte[] Encrypt(byte[] plainText, byte[] optionalEntropy) {
[...]
int bytesSize = plainText.Length;
plainTextBlob.pbData = Marshal.AllocHGlobal(bytesSize);
plainTextBlob.cbData = bytesSize;
Marshal.Copy(plainText, 0, plainTextBlob.pbData, bytesSize);
[...]
dwFlags = CRYPTPROTECT_LOCAL_MACHINE|CRYPTPROTECT_UI_FORBIDDEN;
[...]
if(null == optionalEntropy)
{//Allocate something
optionalEntropy = new byte[0]; // Is copied to entropyBlob later
}
[...]
retVal = CryptProtectData(ref plainTextBlob, "", ref entropyBlob,
IntPtr.Zero, ref prompt, dwFlags,
ref cipherTextBlob);
[...]
}
И снова ваш код C ++, чтобы иметь в виду оба:
[...]
BYTE *pbDataInput =(BYTE *)(char*)value.c_str();
DWORD cbDataInput = strlen((char *)pbDataInput)+1;
[...]
CryptProtectData(&DataIn, NULL, NULL, NULL, NULL, 0, &DataOut))
Параметры не совпадают, и я думаю, что это источник различий.
Первое - это флаги. Код C # использует dwFlags! = 0, ваш код C ++ использует dwFlags = 0, так что это явно различие.
Я не уверен насчет энтропии. Если вы не передали optionEntropy = null, это различие, но если оно пустое, есть назначение «new byte [0]», и я не уверен, что это создаст, но я думаю, что вы должны хотя бы попробовать передать IntPtr.Zero вместо entropyBlob в CryptProtectData для соответствия с кодом C ++.
Наконец, но не в последнюю очередь, ваш код C ++ включает в себя завершающий NUL, который разделяет строку C, я не знаю, как работает шифрование, используемое здесь, но есть шифрование, которое даст вам очень разные выходные данные, если один байт отличается ( или у вас есть еще один байт, как в этом случае), поэтому вы должны либо включить завершающий NUL в код C #, либо удалить его в код C ++.