Почему я получаю различные выводы при шифровании использующий DPAPI?

Мы будем, если Вы будете думать об этом, как Вы предлагаете, чтобы Вы нашли количество строк в файле, не читая целый файл для новых строк? Несомненно, можно найти размер файла, и если Вы можете gurantee, что длина строки является x, можно получить количество строк в файле. Но если у Вас нет некоторого ограничения, мне не удается видеть, как это может работать вообще. Кроме того, так как iterables может быть бесконечно длинным...

6
задан Vic 18 September 2009 в 23:05
поделиться

1 ответ

Было бы полезно, если бы вы могли опубликовать свой C ++ и свой код C #. Возможно, есть небольшие различия в параметрах или что-то в этом роде. Например, вы должны убедиться, что параметр pOptionalEntropy такой же (или установить для него значение NULL, чтобы проверить, является ли это источником ошибки). Кроме того, не забудьте попытаться зашифровать и расшифровать на том же ПК:

[...] дешифрование обычно может быть выполнено только на компьютер, на котором были данные encrypted

(Источник: 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, так что это очевидная разница.

Я не уверен в энтропии. Если вы не передали optionalEntropy = null, это разница, но если оно равно null, есть назначение «новый байт [0]», и я не уверен, что это создаст, но я думаю, вам следует хотя бы попробовать передать IntPtr.Zero вместо entropyBlob в CryptProtectData для сопоставления с кодом C ++.

И последнее, но не менее важное:

5
ответ дан 17 December 2019 в 04:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: