как скопировать строку в bytearray для CryptUnprotectData - PullRequest
0 голосов
/ 14 ноября 2011

Я пытаюсь передать данные из файла sqlite3 в CryptUnprotectData.

После выбора данных с помощью библиотеки sqlite3 я могу распечатать их на консоли. Это данные, которые я пытаюсь расшифровать (argv [i]):

printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");

гекс (-пароль) = 01000000D08C9DDF0115D1118C7A00C04FC297EB01000000EEB05AE6044E5749B7BB63FAB045C99C00000000020000000000106600000001000020000000F6027D9B2EA5742C36075600DDFA7ECDAFD55BE247F984FBC92BFC9C7F9DE9520000000000000000020000200000006EC519ACA4DA90EFA7149FF16502E0985F4B86C75F52A1EF7CAAAC5FC88E48CC10000000F0B305A4829F3D397F1379CD63EAB48F400000001BD5A3B07DAA31AE35A2FCE8BDDBBA28055307E3137B3EBE899C0A0AD35E905AE125FF0ACBCA2982169ABAB0AE899493446897297D47BA65A09115AB13821EFE

Это прототип функции, которая будет расшифровывать:

BOOL WINAPI CryptUnprotectData(
  __in       DATA_BLOB *pDataIn,
  __out_opt  LPWSTR *ppszDataDescr,
  __in_opt   DATA_BLOB *pOptionalEntropy,
  __in       PVOID pvReserved,
  __in_opt   CRYPTPROTECT_PROMPTSTRUCT *pPromptStruct,
  __in       DWORD dwFlags,
  __out      DATA_BLOB *pDataOut
);

Структура DATA_BLOB выглядит следующим образом:

typedef struct _CRYPTOAPI_BLOB {
  DWORD cbData;
  BYTE  *pbData;
};

Где: cbData == Переменная DWORD, которая содержит количество данных в байтах. pbData == Указатель на буфер данных.

Я думаю , что мне нужно сделать, это создать такую ​​структуру: DATA_BLOB DataEncrypted;

DataEncrypted.pbData = ??? DataEncrypted.cbData = strlen (argv [i]) / 2

и скопируйте данные из argv [i] в ​​байтовый массив ... и затем установите pbData == указатель на байтовый массив.

Я не уверен, как сделать эту часть ... какие-либо предложения?

1 Ответ

0 голосов
/ 14 ноября 2011

Вот хороший ответ .Это на Java, но алгоритм тот же:

public static byte[] hexStringToByteArray(String s) {
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                             + Character.digit(s.charAt(i+1), 16));
    }
    return data;
}
...