Внимание. Все что я описывал о шагах авторизации Desfire до данного момента не является TRUE. Принцип верный, но детали не описаны.
Авторизация чере des/3des = 1a ключ 00 (root)
-> 1a 00
<- 5D 99 4C E0 85 F2 40 89
5D 99 4C E0 85 F2 40 89 = RndB Карты.
Не торопимся его декодировать.
Теперь генерируется свой RndA
84 9B 36 C5 F8 BF 4A 09
Далее требуется так называемое сложение по модулю (XOR)
0 + 0 = 0
1 + 0 = 1
0 + 1 = 1
1 + 1 = 0
5D 99 4C E0 85 F2 40 89 ^
84 9B 36 C5 F8 BF 4A 09 = D9 02 7A 25 7D 4D 0A 80
Шифруем D9 02 7A 25 7D 4D 0A 80
Результат 21 D0 AD 5F 2F D9 74 54
Ура. По шаблону проверил, это первая часть ответа. Дальше будет интересней
Теперь берем зашифрованный RndB - 5D 99 4C E0 85 F2 40 89 и дешифруем (des/3des) (0x00 00 00 00 00 00 00 00 ~ HEX)
Результат RndB_dec - 4F D1 B7 59 42 A8 B8 E1 делаем смещение << на 8 бит. Результат = D1 B7 59 42 A8 B8 E1 4F
Теперь берем 21 d0 ad 5f 2f d9 74 54 ^ d1 b7 59 42 a8 b8 e1 4f и производим сложение по модулю (XOR)
Результат = f0 67 f4 1d 87 61 95 1b
Шифруем = A746CC80567F1B1C
А вот и вторая половина RNDAB_enc = 21D0AD5F2FD97454
A746CC80567F1B1C
Отправляем карте на что получаем RNDA_enc.
Ответ - 91 3C 6D ED 84 22 1C 41 ^
A746CC80567F1B1C = 9b 36 c5 f8 bf 4a 09 84 << 8 = 36 c5 f8 bf 4a 09 84 9b
If rnda == rnda_enc_dec (36 c5 f8 bf 4a 09 84 9b == 36 c5 f8 bf 4a 09 84 9b) значит мы авторизовались
Идем дальше. Вот простая схема, показывающая смысл происходящего:
rndb 5D 99 4C E0 85 F2 40 89
rnda 84 9B 36 C5 F8 BF 4A 09
XOR = D9 02 7A 25 7D 4D 0A 80
XOR_enc
21 D0 AD 5F 2F D9 74 54
rndb_dec_rot D1 B7 59 42 A8 B8 E1 4F
XOR = f0 67 f4 1d 87 61 95 1b
XOR_enc =
A7 46 CC 80 56 7F 1B 1C
Я тут смотрел в сети народ активно обсуждал разные алгоритмы.
Кто то предлагал 3DES(randA) + 3DES(randB' XOR 3DES(randA)) но у меня подобная форумала вообще не работает. Есть вероятность что я ее понял не правильно.
Кто то вообще предложил TDES_CBC(randA | randB), но второй вариант вообще не понятно как вычислять без XOR и смещения, так как карта сама по себе смещает 8 бит вправо любую последовательность возвращаемую процессору.
Моя формула выглядит так: part1(Des(rndB ^ rndA)) + des(rndb_dec_rot ^ part1);
Или 3desCBC(IV=5D994CE085F24089(84 9B 36 C5 F8 BF 4A 09)) = 21D0AD5F2FD97454
Надо понимать, что 3des = des_enc + des_dec + des_enc. То-есть второй вариант уже потратил три подхода, но создал только первую часть, тогда как
первый вариант создал сразу две части за три прохода.
Какой из данных вариантов более оптимальный по производительности надо будет выяснить.
Схема рабочая, требует 2 прохода шифрования (DES) и один дешифровки (DES). То-есть три прохода des = 1 проход 3des. То-ли у меня проблема с логикой, то-ли народ производит в три раза больше проходов чем требуется (см.выше).
Впрочем, это по сути тот же 3des с CBC. То-есть по сути, в теории, предложение использовать TDES_CBC(randA | randB) похоже на TRUE, но я как не пытался раскорячиться,- ну никак. Буду еще ковырять эту тему.
В общем пока не понимаю на 100% как эта штука функционирует.
Народ который разобрался в теме и выложил логи, которые не дают полного представления о механике.
Вот пример одного из них:
* RndB_enc: 5D 99 4C E0 85 F2 40 89
* RndB: 4F D1 B7 59 42 A8 B8 E1
* RndB_rot: D1 B7 59 42 A8 B8 E1 4F
* RndA: 84 9B 36 C5 F8 BF 4A 09
* RndAB: 84 9B 36 C5 F8 BF 4A 09 D1 B7 59 42 A8 B8 E1 4F
* RndAB_enc: 21 D0 AD 5F 2F D9 74 54 A7 46 CC 80 56 7F 1B 1C
Результат: ED7DDE10C75977DC753BA677F37133BD
Должно быть: 21 D0 AD 5F 2F D9 74 54 A7 46 CC 80 56 7F 1B 1C
Ладно, это дело такое.
Значит после отправки вот этой строки карте 21 D0 AD 5F 2F D9 74 54 A7 46 CC 80 56 7F 1B 1C
карта должна ответить статусом 00 и выслать нам наш rnda. В принципе, если статус 00, то это уже означает успех и авторизация является свершенной, но это все мое субьективное ИМХО.
После успешной авторизации, у нас на руках появился сесионный ключ. В чем его суть я пока не в теме, но вроде как народ при его помощи вычисляет некий CMAC. Я пока не читал что это, но по ходу эта штука нам помогает кодировать/декодировать ответы, и она каждый раз меняется после обмена меняется особым образом. ИМХО.
Далее теория, которая возможно не имеет ничего общего с реальность.
Session Key (IV) мы можем получить взяв первые четыре байта RNDA + первые четыре байта RNDB + повторим еще раз.
84 9B 36 C5 4F D1 B7 59 84 9B 36 C5 4F D1 B7 59
Но все не так просто, DES игнорирует каждый 0 бит байта, а значит потребуется операция, которая на C/C++ выглядит следующим образом
байт&=~(1<<0);
Пример:
84 9B 36 C5 4F D1 B7 59 84 9B 36 C5 4F D1 B7 59
84 9A 36 C4 4E D0 B6 58 84 9A 36 C4 4E D0 B6 58
Что бы понимать о чем речь.
Возьмем первые два байта:
84 9B - 1000010
0 1001101
1
84 9A - 1000010
0 1001101
0
84 9A 36 C4 4E D0 B6 58 84 9A 36 C4 4E D0 B6 58
Вероятно это и есть IV key.
Message authentication code = MAC (4 byte) 84 9A 36 C4 4E D0 B6 58
CMAC (зашифрованный MAC).
Вообще MAC используется для коммуникации через AES. Но не уверен.
Все это ИМХО, так как этот вопрос я сейчас и разбираю.
http://nvlpubs.nist.gov/nistpubs/Legacy ... 00-38b.pdf