Как получить доступ к определенному байту из значения реестра, зашифрованного с помощью CryptProtectData
Я пытаюсь получить значение даты из реестра. Значение зашифровано с помощью CryptProtectData.
Интересующие нас байты (с прямым порядком байтов):
[-16] и [-15] - это год. [-14] и [-13] - это месяц, а [-12] и [-11] - это день.
RegistryKey HKCR;
RegistryKey dateKey;
HKCR = RegistryKey.OpenBaseKey(RegistryHive.ClassesRoot, RegistryView.Default);
dateKey = HKCR.OpenSubKey(subKeyPath);
byte[] registryValue = (byte[])dateKey.GetValue(null);
byte[] unprotectedRegistryValue = ProtectedData.Unprotect(registryValue, null, DataProtectionScope.LocalMachine);
UnprotectedRegistryValue - это массив байтов: {byte[224]}. Мне нужно дополнительно обработать диапазон [-16..-11] и передать предложенные значения в BitConverter.ToInt16([-16..-15]), а затем в функции Date, например, для получения информации о году.
К сожалению, я застрял со значением unprotectedRegistryValue, потому что нет отрицательного индекса. Когда я пытаюсь получить доступ к значениям для информации о году.
var yearBytes = new byte[] {unprotectedRegistryValue[-16], unprotectedRegistryValue[-15]};
Я получаю исключение IndexOutOfRangeException, потому что все индексы unprotectedRegistryValue положительны.
Мне не хватает понимания между частью шифрования данных и передачей интересующих байтов для дальнейшей обработки значений.
Как я мог получить интересующие байты и передать их дальше?
1 ответ
Отрицательный индекс не имеет смысла, если вы не знаете, где находится '0', когда у вас есть положительный индекс, вы предполагаете, что '0' является первым элементом в массиве, но когда у вас есть отрицательное число, консенсуса нет (это не даже действительный), поэтому ваш коллега должен иметь некоторую ссылку на то, где находится "0", где он считает, что данные начинаются и заканчиваются.
Стоит попробовать считать '0' последним байтом, в этом случае '-16' будет unprotectedRegistryValue.Length - 17
и '-15' unprotectedRegistryValue.Length - 16