我遵循了ICAO的第7版“第11部分的附录D-实际示例:基本访问控制”,以便使用Xamarin.Android创建一个Android应用,该Android可从ePassport读取数据。但是,我在EXTERNAL AUTHENTICATE步骤中从芯片上获取了6300状态代码,并且关于该错误代码的信息不多。太模糊了...
以下是该应用执行的步骤的日志:
Tag tech list from the chip: android.nfc.tech.IsoDep, android.nfc.tech.NfcA
Select AID command:
00A4040C07A0000002471001
Select AID response:
9000
GET_CHALLENGE command:
0084000008
GET_CHALLENGE response:
6211B520F00565DD9000
documentNumber:
HU1234560
dateOfBirth:
920229
dateOfExpiry:
150101
keySeed SHA1(documentNumber + checkDigit + dateOfBirth + checkDigit + dateOfExpiry + checkDigit):
F3B48FDEF6A2374676C6B8892AFA58FB
kEnc SHA1(keySeed + 00000001):
9F399B0855DAD12F04FB3CB84D1F9AB3
kMac SHA1(keySeed + 00000002):
51102BA4C6A69CEF26BD45C94537B103
rndIFD:
CC95C0CD499F6306
kIFD:
39D661B07605B175E8BEF948609556F1
rndICC:
6211B520F00565DD
S:
CC95C0CD499F63066211B520F00565DD39D661B07605B175E8BEF948609556F1
eIFD(DesEdeEngine/CBC/NoPadding):
EC95CF0953AF87CA7FE3059A4B89A018309E8FD60359F38C4BA3216E763DD1D4
mIFD(DesEngine/ISO9797Alg3Mac/ISO7816d4Padding):
CED0EA4979A35978
External Authenticate command:
0082000028EC95CF0953AF87CA7FE3059A4B89A018309E8FD60359F38C4BA3216E763DD1CED0EA4979A359780028
External Authenticate response:
6300
有什么建议吗?
答案 0 :(得分:2)
您的EXTERNAL AUTHENTICATE命令似乎是错误的。好像您将M_IFD值复制到错误的位置(一一对应)。因此,您将E_IFD的最后一个字节切掉,并且末尾有一个零字节:
00 82 0000 28 EC95CF0953AF87CA7FE3059A4B89A018309E8FD60359F38C4BA3216E763DD1 CED0EA4979A35978 00 28 ^^ ^^ Last byte of E_IFD missing (only 31 bytes here) <--/ | Additional zero byte here? <--/
除了您的值(或多或少)与我的MRTD测试台的组合匹配。尽管您没有纠正K_ENC和K_MAC的奇偶校验位,但是除非您(将来)使用实际检查DES密钥的奇偶校验位的密码库,否则不会有任何区别。您当前的加密库似乎忽略了它们,并给出了预期的结果。
此外,您是否已验证文件编号,出生日期和有效日期与机器可读区域中使用的格式完全匹配?问题中的证件号码和有效日期似乎都不是真实护照的合理值。
最后,正如Maarten解释的那样,状态字6300指示身份验证失败。您不能期望该文档透露有关身份验证为何失败的更多详细信息。当然,这不是缺少国际民航组织的规范,而是从安全角度出发的必要性。例如,想象一下,护照将能够报告您用作输入的出生日期是错误的。这样,攻击者将只能对部分关键输入进行暴力破解。
答案 1 :(得分:1)
正如@Michael Roland指出的那样,所有步骤和计算都是正确的,但是按照建议仔细检查了MRZ(输入)后,我注意到我错误键入了DateOfBirth,这导致了状态码=6300。因此,该状态码可能会返回输入错误时。
不幸的是,国际民航组织的文件不够清楚,无法表明这种情况。