Моя цель - извлечь данные из паспорта, в котором у меня уже есть 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
Внедрить «розничный Mac» для аутентификации Passport BAC ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1747525642
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. Что я делаю не так?>
Подробнее здесь: [url]https://stackoverflow.com/questions/79627060/implement-the-retail-mac-for-bac-passport-authentication[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия