HMAC с криптографическим API C / переполнение стека

Я использую пример Microsoft из http://msdn.microsoft.com/en-us/library/aa382379(v=vs.85).aspx. Прекрасно компилируется и работает, возвращая результат:

48 f2 57 38 29 29 43 16 fd f4 db 58 31 e1 0c 74 48 8e d4 e2

Однако когда я выполняю те же вычисления с использованием кода C # ниже, я получаю другой хэш?

4C-2D-E3-61-BA-89-58-55-8D-Е3-D0-49-ED-1F-В5-C1-15-65-6E-65

        HMAC hashMaker = new HMACSHA1(new byte[]{0x70,0x61,0x73,0x73,0x77,0x6F,0x72,0x64});
byte[] hash = hashMaker.ComputeHash(new byte[] {0x6D,0x65,0x73,0x73,0x61,0x67,0x65});
string hashStr = BitConverter.ToString(hash);

Я боюсь, что пример кода C в некотором роде правильный. Что здесь происходит?

1

Решение

Размещенный код C # и код C, связанные (но не опубликованные), делают разные вещи. Таким образом, результат будет отличаться.

Код WinCrypt выполняет следующее:

  • Создайте хеш SHA1 из байтов ключа
  • Получите ключ сеанса из полученного хэша, используя RC4
  • Инициализируйте дайджест HMAC_SHA1, используя производный ключ
  • Выполните HMAC CryptHashData с HMAC
  • Запросить результирующие байты хеша

Код C # выполняет следующее:

  • Создайте HMAC_SHA1, используя ключевые байты как фактический ключ (без происхождения)
  • Выполните HMAC через ComputeHash, возвращая полученный хэш-дайджест

Другими словами, они разные, потому что они делают разные вещи. Какой из них «правильный», зависит от того, что вы пытаетесь сделать (что не было упомянуто в вопросе).

OpenSSL, эквивалентный коду C #

unsigned char key[] = { 0x70,0x61,0x73,0x73,0x77,0x6F,0x72,0x64 };
unsigned char bytes[] = { 0x6D,0x65,0x73,0x73,0x61,0x67,0x65 };
unsigned char md[32] = {0};
unsigned int md_len = (int)sizeof(md);

HMAC_CTX ctx;
HMAC_CTX_init(&ctx);
HMAC_Init(&ctx, key, (int)sizeof(key), EVP_sha1());
HMAC_Update(&ctx, bytes, sizeof(bytes));
HMAC_Final(&ctx, md, &md_len);

Полученный дайджест в md соответствует коду C # соответственно (опущено, но поверьте мне на слово или проверьте сами).

4

Другие решения

Я считаю, что с помощью CryptoAPI CryptCreateHash невозможно выполнить HMAC с ключом без наследования.

Однако можно выполнить HMAC SHA1 / SHA256, используя набор методов BCrypt в API криптографии: следующее поколение (CNG). Увидеть этот вопрос для примера.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector