2015-02-17 278 views
0

我目前使用Seeed Studio的NFC Shield v2和Arduino Uno R3。下面是我用来阅读草图的代码。它基于由Seeed工作室的Android HCE库提供的示例:NFC读卡器无法读取加密卡仿真数据

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开发者的HCE例子。我知道,如果我不添加AES加密,应用程序可读,并且可以使用Python脚本验证内容。一旦我添加加密,即使Android设备输出显示APDU请求的日志,Arduino也不会从应用中读取任何内容。

似乎有两个犯人:

  1. Response[510]是不正确的大小。
  2. 发送给Arduino的加密数据太大了。

我改变了Response[]为各种值诸如80, 1022, 2046, 8196,等。然而,这些值越大,越吓了一跳阿尔杜伊诺变。价值太低,没有任何反应。 510似乎是神奇的数字。我已经记录被转移我的数据的长度计数:

  • 没有AES加密,数据长度为197 bytes其输出的Arduino的串行控制台上的罚款。
  • 使用AES加密,数据长度为268 bytes,并导致的“失败发送SELECT AID”的输出,这是一个虚假的错误,因为我是能够检索AID请求和APDU报头。

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


更新:如果我让发送小于245字节的数据,Arduino的将输出的串行控制台上的数据。一旦它产生了246字节,它就会失败并输出“发送SELECT AID失败”。

回答

0

我仍然不知道如何解决Arduino上的这个“限制”,但我找到了解决方法。关键是保持数据少于245 bytes

我所做的是,我不是一起加密数据和签名,而是决定只对数据进行加密,并将签名附加到数据的末尾,以及我可以用来分隔的一些东西(即“::”)。

这种联合获得是一个总206 bytes,并且它正在读通过了关于为串行数据,以我的Python脚本。