首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mifare火灾的MAC和CMAC计算

Mifare火灾的MAC和CMAC计算
EN

Stack Overflow用户
提问于 2012-09-10 04:53:11
回答 1查看 6.5K关注 0票数 3

有人能帮我指导Mifare Desfire的MAC(4字节)和CMAC(8字节)的计算吗?我得到了意想不到的结果。

代码语言:javascript
复制
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结果

代码语言:javascript
复制
AESKey          =       00000000000000000000000000000000
Block           =       000102030405060708090a0b0c0d0e0f
Enc(Block)      =       7aca0fd9bcd6ec7c9f97466616e6a282
SubKey1         =       CDD297A9DF1458771099F4B39468565C
SubKey2         =       9BA52F53BE28B0EE2133E96728D0AC3F
CMAC(16bytes)   =       8A57896F795CB6ABF6867DAD41A5FB15

CMAC只由DES生成,TDES像DES一样加密除最终块之外的所有块,在零售MAC计算中应该加密TDES吗?

EN

回答 1

Stack Overflow用户

发布于 2012-09-11 17:12:34

在MAC计算方面,它似乎是3 3DES模式的数据加密,明文上填充为零,而V4为零。3 3DES密钥由XORing创建,会话密钥为24 0字节。以下是Java中的一个示例:

代码语言:javascript
复制
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);
  }
}

输出:

代码语言:javascript
复制
2923BE84B149546100000000000000000000000000000000
F2F13994D24714CA880FE38AB9E8A8D3

您没有提供足够的信息来理解计算AES CMAC示例所需的内容,也不了解您的实际问题是什么。大概你没有得到预期的结果吧?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12345503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档