Внедрить «розничный Mac» для аутентификации Passport BACC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Внедрить «розничный Mac» для аутентификации Passport BAC

Сообщение Anonymous »

Моя цель - извлечь данные из паспорта, в котором у меня уже есть MRZ. Я начинаю на основе сценария Cardpeek Lua, который работает и пытается реализовать это в C ++ с помощью API CNG. Mac ". DE3737718D12260E21D6237319004D54AD7239F6F56EDD41725431B2EB4000FB. < /P>
My Code в Win32 API до сих пор и Script Lua дает те же результаты. IS: < /p>
local CBC_MAC = crypto.create_context(crypto.ALG_ISO9797_M3+crypto.PAD_ISO9797_P2,KM_MAC);
m_ifd = crypto.mac(CBC_MAC,e_ifd)
< /code>
И это создает значение 0A2B038851996635 < /p>
Теперь я пытаюсь реализовать это в C ++, но что -то не так, и я не могу понять, почему (обработка ошибок удаляет).bool ComputeRetailMAC(const BYTE* k_mac, const BYTE* data, size_t dataLen, BYTE* mac)
{
BCRYPT_ALG_HANDLE hAlg = NULL;
BCRYPT_KEY_HANDLE hKey = NULL;
NTSTATUS status;
bool result = false;

// 3DES key: K1 || K2 || K1 (24 bytes)
BYTE k_mac_24[24] = {};
memcpy(k_mac_24, k_mac, 16);
memcpy(k_mac_24 + 16, k_mac, 8);

status = BCryptOpenAlgorithmProvider(&hAlg, BCRYPT_3DES_ALGORITHM, NULL, 0);

// Set chaining mode to CBC
status = BCryptSetProperty(hAlg, BCRYPT_CHAINING_MODE, (PUCHAR)BCRYPT_CHAIN_MODE_CBC, wcslen(BCRYPT_CHAIN_MODE_CBC)*2, 0);

// Generate symmetric key
status = BCryptGenerateSymmetricKey(hAlg, &hKey, NULL, 0, (PUCHAR)k_mac_24, sizeof(k_mac_24), 0);

// CBC IV = 0
BYTE iv[8] = { 0 };

// Pad data to 8-byte boundary with zeroes
size_t paddedLen = (dataLen + 7) & ~7;
if (dataLen % 8 == 0)
paddedLen += 8;

std::vector paddedData(paddedLen);
memcpy(paddedData.data(), data, dataLen);

paddedData[dataLen] = 0x80;
if (paddedLen > dataLen + 1)
memset(paddedData.data() + dataLen + 1, 0x00, paddedLen - dataLen - 1);

// Encrypt
DWORD cbResult = 0;
std::vector encrypted(paddedLen);
status = BCryptEncrypt(hKey, paddedData.data(), (ULONG)paddedLen, NULL, iv, sizeof(iv), encrypted.data(), (ULONG)paddedLen, &cbResult, 0);

memcpy(mac, encrypted.data() + cbResult - 8, 8); // Last block is MAC
... cleanup here
}
< /code>
Я также где -то обнаружил, что заполнение должно добавить +8 байтов, если уже выровнен. В любом случае я не могу получить (правильный) результат 0A2B038851996635. Что я делаю не так?>

Подробнее здесь: https://stackoverflow.com/questions/796 ... entication
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»