NFC Reader 无法读取加密的卡仿真数据
NFC Reader Cannot Read Encrypted Card Emulation Data
我目前正在使用 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 开发人员的 HCE 示例。我知道如果我不添加 AES 加密,应用程序是可读的,并且可以使用 Python 脚本验证内容。添加加密后,即使 Android 设备输出显示已请求 APDU 的日志,Arduino 也不会从应用程序中读取任何内容。
似乎有两个罪魁祸首:
Response[510]
尺寸不对。
- 发送到 Arduino 的加密数据太大。
我将 Response[]
更改为各种值,例如 80, 1022, 2046, 8196,
等。但是,值越高,Arduino 变得越害怕。值太低,什么也不会发生。 510
似乎是一个神奇的数字。我记录了正在传输的数据的长度计数:
- 没有 AES 加密,数据长度为
197 bytes
,在 Arduino 串行控制台上输出正常。
- 使用 AES 加密,数据长度为
268 bytes
并导致输出 "Failed sending SELECT AID",这是一个假错误,因为我能够检索 AID 请求和 APDU header .
似乎是什么问题,我该如何解决它,或者至少有一些解决方法?
更新: 如果我要发送的数据少于 245
字节,Arduino 将在串行控制台上输出数据。一旦达到 246
字节,它就会失败并输出 "Failed sending SELECT AID".
我仍然不知道如何在 Arduino 上解决这个 "limitation" 但我找到了解决方法。关键是让数据小于245 bytes
.
我所做的是,我没有将数据和签名一起加密,而是决定只加密数据并将签名附加到数据的末尾以及我可以用来分隔的内容(即“::”)。
这个组合的结果是总 206 bytes
,它被读取并作为串行数据传递到我的 Python 脚本。
我目前正在使用 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 开发人员的 HCE 示例。我知道如果我不添加 AES 加密,应用程序是可读的,并且可以使用 Python 脚本验证内容。添加加密后,即使 Android 设备输出显示已请求 APDU 的日志,Arduino 也不会从应用程序中读取任何内容。
似乎有两个罪魁祸首:
Response[510]
尺寸不对。- 发送到 Arduino 的加密数据太大。
我将 Response[]
更改为各种值,例如 80, 1022, 2046, 8196,
等。但是,值越高,Arduino 变得越害怕。值太低,什么也不会发生。 510
似乎是一个神奇的数字。我记录了正在传输的数据的长度计数:
- 没有 AES 加密,数据长度为
197 bytes
,在 Arduino 串行控制台上输出正常。 - 使用 AES 加密,数据长度为
268 bytes
并导致输出 "Failed sending SELECT AID",这是一个假错误,因为我能够检索 AID 请求和 APDU header .
似乎是什么问题,我该如何解决它,或者至少有一些解决方法?
更新: 如果我要发送的数据少于 245
字节,Arduino 将在串行控制台上输出数据。一旦达到 246
字节,它就会失败并输出 "Failed sending SELECT AID".
我仍然不知道如何在 Arduino 上解决这个 "limitation" 但我找到了解决方法。关键是让数据小于245 bytes
.
我所做的是,我没有将数据和签名一起加密,而是决定只加密数据并将签名附加到数据的末尾以及我可以用来分隔的内容(即“::”)。
这个组合的结果是总 206 bytes
,它被读取并作为串行数据传递到我的 Python 脚本。