我目前使用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也不会从应用中读取任何内容。
似乎有两个犯人:
Response[510]
是不正确的大小。- 发送给Arduino的加密数据太大了。
我改变了Response[]
为各种值诸如80, 1022, 2046, 8196,
等。然而,这些值越大,越吓了一跳阿尔杜伊诺变。价值太低,没有任何反应。 510
似乎是神奇的数字。我已经记录被转移我的数据的长度计数:
- 没有AES加密,数据长度为
197 bytes
其输出的Arduino的串行控制台上的罚款。 - 使用AES加密,数据长度为
268 bytes
,并导致的“失败发送SELECT AID”的输出,这是一个虚假的错误,因为我是能够检索AID请求和APDU报头。
什么似乎是问题,我该如何去解决它,或者至少有一些解决方法?
更新:如果我让发送小于245
字节的数据,Arduino的将输出的串行控制台上的数据。一旦它产生了246
字节,它就会失败并输出“发送SELECT AID失败”。