NFC读卡器无法读取加密卡仿真数据

时间:2015-02-17 22:20:11

标签: android encryption aes arduino-uno

我目前正在使用Seeed Studio的NFC Shield v2和Arduino Uno R3。这是我用来阅读的草图中的代码。它基于Seeed Studio Android HCE库提供的示例:

void loop() {
    ...
    uint8_t response[510];
    uint8_t responseLen = sizeof(response);
    success = nfc.inDataExchange(selectApdu, sizeof(selectApdu), 
              response, &responseLen);

    if(success) {
      Serial.print("Response Length: "); Serial.println(responseLen);
      // nfc.PrintHexChar(response, responseLen);
      printResponse(response, responseLen);
    } else Serial.println("Failed sending SELECT AID"); 
  } else Serial.println("Didn't find anything!");
  delay(1000);
}

在我拥有的Android应用中,我通过添加数字签名和AES加密来扩展Android Developer的HCE示例。我知道,如果我不添加AES加密,该应用程序是可读的,并且可以使用Python脚本验证内容。一旦我添加加密,即使Android设备输出显示请求APDU的日志,Arduino也不会从应用程序中读取任何内容。

似乎有两个罪魁祸首:

  1. Response[510]的尺寸不合适。
  2. 发送给Arduino的加密数据太大了。
  3. 我将Response[]更改为各种值,例如80, 1022, 2046, 8196,等。但是,值越高,Arduino就会变得越恐怖。价值太低,没有任何反应。 510似乎是一个神奇的数字。我记录了正在传输的数据的长度计数:

    • 没有AES加密,数据长度为197 bytes,在Arduino串口控制台上输出正常。
    • 使用AES加密,数据长度为268 bytes并导致"输出SELECT AID"失败,这是一个错误的错误,因为我能够检索AID请求和APDU标头

    什么似乎是问题,我该如何解决它,或者至少有一些解决方法?


    更新:如果我要发送的数据少于245个字节,Arduino会在串行控制台上输出数据。一旦它成为246字节,它就会失败并输出"发送SELECT AID失败"。

1 个答案:

答案 0 :(得分:0)

我仍然不知道如何解决这个问题"限制"关于Arduino,但我找到了一个解决方法。关键是要保持数据低于245 bytes

我所做的不是一起加密数据和签名,而是决定只加密数据并将签名附加到数据的末尾以及我可以用来分隔的内容。 (即。" ::")。

这个组合结果是总206 bytes,它正被读取并作为串行数据传递给我的Python脚本。