Расчет MAC и CMAC для Mifare Desfire

Может ли кто-нибудь помочь мне рассчитать MAC (4 байта) и CMAC (8 байтов) для Mifare Desfire? Я получаю неожиданные результаты.

Deskey      =   0000000000000000
Block1(B1)  =   1122334455667788
Block2(B2)  =   9900112200000000
IV          =   0000000000000000
sessionkey  =   2923be84b1495461


R1 = Enc(B1 xor IV)         f2f13994d24714ca
R2 = Enc(R1 xor B2)         880fe38ab9e8a8d3
MAC   880fe38a

Expected MAC =  c8d70ad2 95a88a36

Результаты CMAC

AESKey          =       00000000000000000000000000000000
Block           =       000102030405060708090a0b0c0d0e0f
Enc(Block)      =       7aca0fd9bcd6ec7c9f97466616e6a282
SubKey1         =       CDD297A9DF1458771099F4B39468565C
SubKey2         =       9BA52F53BE28B0EE2133E96728D0AC3F
CMAC(16bytes)   =       8A57896F795CB6ABF6867DAD41A5FB15

Верно ли, что CMAC генерируется только DES, а TDES, подобно DES, шифрует все блоки, кроме последнего блока, который должен быть зашифрован TDES, как при расчете розничного MAC?


person Studuino    schedule 10.09.2012    source источник
comment
Я почти уверен, что ты не должен распространять эту документацию, Студуино.   -  person Maarten Bodewes    schedule 11.09.2012
comment
привет owlstead, я получил это из Интернета .. это связано с Phillipss NDA ??   -  person Studuino    schedule 11.09.2012
comment
Я не смог найти этот документ в Google, и тот факт, что он был лишен логотипа NXP, говорит о том, что да.   -  person Maarten Bodewes    schedule 11.09.2012
comment
Что вы используете для получения выходных данных выше? У вас есть код, чтобы поделиться? На каком языке?   -  person Duncan Jones    schedule 11.09.2012
comment
Примечание: 0x0000000000000000 не является допустимым ключом DES. Ключи DES требуют установки бита четности для каждого байта. 0x0101010101010101 будет действительным.   -  person Duncan Jones    schedule 11.09.2012
comment
@Studuino Кроме того, ваша ссылка на Dropbox все еще действительна и видна на странице предыдущих версий. Лучше удалить его или переименовать на сайте.   -  person Duncan Jones    schedule 12.09.2012
comment
@DuncanJones, установка бита четности может быть необходима в других случаях, но в случае Desfire он используется для номера версии, поэтому данный ключ действителен, и на нем установлен нулевой номер версии.   -  person AaA    schedule 19.12.2012


Ответы (1)


Что касается расчета MAC, похоже, что это шифрование данных в режиме 3DES CBC с нулевым дополнением к открытому тексту и полностью нулевым IV. Ключ 3DES создается путем операции XOR над сеансовым ключом с 24 нулевыми байтами. Вот пример на Java:

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;
import javax.xml.bind.DatatypeConverter;

public class MACTest {

  public static void main(String[] args) throws Exception {

    final byte[] keyBytes = new byte[24];
    final byte[] paddedPlaintext = 
        hexStringToByteArray("11223344556677889900112200000000");
    final byte[] iv = new byte[8];
    final byte[] sessionKeyBytes = hexStringToByteArray("2923be84b1495461");

    final byte[] derivedKeyBytes = new byte[24];
    for (int i = 0; i < sessionKeyBytes.length; i++) {
      derivedKeyBytes[i] = (byte) (keyBytes[i] ^ sessionKeyBytes[i]);
    }

    System.out.println(toHexString(derivedKeyBytes));
    SecretKeyFactory factory = SecretKeyFactory.getInstance("DESede");
    SecretKey derivedKey = factory.generateSecret(new DESedeKeySpec(
        derivedKeyBytes));

    Cipher c = Cipher.getInstance("DESede/CBC/NoPadding");
    c.init(Cipher.ENCRYPT_MODE, derivedKey, new IvParameterSpec(iv));
    byte[] result = c.doFinal(paddedPlaintext);
    System.out.println(toHexString(result));
  }

  public static String toHexString(byte[] array) {
    return DatatypeConverter.printHexBinary(array);
  }

  public static byte[] hexStringToByteArray(String s) {
    return DatatypeConverter.parseHexBinary(s);
  }
}

Выход:

2923BE84B149546100000000000000000000000000000000
F2F13994D24714CA880FE38AB9E8A8D3

Вы не предоставили достаточно информации, чтобы понять, что требуется для вычисления примера AES CMAC, и в чем на самом деле заключается ваша проблема. Предположительно, вы не получаете ожидаемого результата?

person Duncan Jones    schedule 11.09.2012
comment
Привет, Дункан, спасибо за демонстрацию расчета Mac. Я получил тот же результат, что и в моем вопросе. Но правильный mac это c8d70ad2 95a88a36. На самом деле первые четыре байта (C8D70AD2). Я также пробовал в соответствии с ISO 9797 en.wikipedia.org/wiki/ISO/IEC_9797-1 но эти алгоритмы также не дают мне того вывода. Я не знаю, что мне не хватает. Я не могу использовать шифрование TDES, так как ключ сеанса имеет длину всего 8 байт (но я тоже пробовал это). - person Studuino; 14.09.2012
comment
@Studuino Я мог бы поклясться, что документ, на который вы изначально ссылались, содержал тот же MAC-адрес, что и мой ответ. Вы уверены в правильности ответа? Возможно, вы можете опубликовать примеры значений, показанные в документе (которые, насколько я помню, немного отличаются от вашего вопроса). - person Duncan Jones; 14.09.2012
comment
The input in the example is DES Key 0000000000000000. Plain msg is 112233445566778899001122 hence the msg with padding is 11223344556677889900112200000000. Session key is 2923be84b1495461 and example output is f2f13994d24714cac8d70ad295a88a36 ,hence the data+mac(4 bytes) is 112233445566778899001122c8d70ad2 . С уважением - person Studuino; 15.09.2012
comment
@Studuino Ах, моя ошибка. Я не заметил, что второй блок моего вывода был неправильным. Я посмотрю на это. - person Duncan Jones; 15.09.2012