将ECPublicKey从Java恢复到JavaCard
这个问题与我昨天问的问题有关: 我也有同样的问题,但情况正好相反: 将公钥从我的卡发送到我的计算机后(根据ANSI X9.62,该点表示为未压缩形式的八位字节字符串),我可以恢复相应的密钥 但是,如果我从计算机发送,我无法在卡上恢复它,我会得到一个将ECPublicKey从Java恢复到JavaCard,java,cryptography,javacard,apdu,elliptic-curve,Java,Cryptography,Javacard,Apdu,Elliptic Curve,这个问题与我昨天问的问题有关: 我也有同样的问题,但情况正好相反: 将公钥从我的卡发送到我的计算机后(根据ANSI X9.62,该点表示为未压缩形式的八位字节字符串),我可以恢复相应的密钥 但是,如果我从计算机发送,我无法在卡上恢复它,我会得到一个加密异常(非法值),这意味着形状不正确或点与曲线参数不匹配 我验证了,我的参数定义良好,我以正确的形式发送点 为了调试它,我尝试将公钥从我的卡发送到我的计算机,然后将其重新发送到我的卡以尝试恢复它(因此我确信参数是正确的)。不管怎样,我还是会犯同样的错
加密异常
(非法值
),这意味着形状不正确或点与曲线参数不匹配
我验证了,我的参数定义良好,我以正确的形式发送点
为了调试它,我尝试将公钥从我的卡发送到我的计算机,然后将其重新发送到我的卡以尝试恢复它(因此我确信参数是正确的)。不管怎样,我还是会犯同样的错误
为了说明我的问题,我发布了相应的代码:
在卡端-要发送公钥:
发送的响应是:
APDU <<<: 04C2B28FBE96C5EAC1E81750E9B288B0BD8357D3AED4EA39413197D734B145EBC92F3FD7489B9A7EF4C8A956427668851F0BB3A55D5C7B9033A533F21463E1A2139000
发送的APDU为:
APDU >>>: 802000004104C2B28FBE96C5EAC1E81750E9B288B0BD8357D3AED4EA39413197D734B145EBC92F3FD7489B9A7EF4C8A956427668851F0BB3A55D5C7B9033A533F21463E1A213
因此,我们可以很容易地看到,发送的数据与之前接收的数据完全相同
最后,在卡片方面,我有以下代码来恢复密钥:
pubKey.setW(apduBuffer, ISO7816.OFFSET_CDATA,
ISO7816.OFFSET_LC);
len = pubKey.getW(apduBuffer, (short) 0x0000);
setOutgoingAndSend((short) 0x0000, len);
但是我得到了APDU>>>:0401
这意味着CryptoException.在指令中引发的非法\u值
pubKey.setW(apduBuffer, ISO7816.OFFSET_CDATA,
ISO7816.OFFSET_LC);
知道我发送的东西与通过pubKey.getW()
获得的东西相同,它怎么会引发异常?问题可能是:
pubKey.setW(apduBuffer, ISO7816.OFFSET_CDATA, ISO7816.OFFSET_LC);
首先,你不应该直接使用ISO7816.OFFSET\U CDATA和ISO7816.OFFSET\U LC。使用APDU.getOffsetCData
获取命令数据的位置,并使用APDU.setIncomingAndReceive
获取Nc值(Lc是Nc值的编码)
当前,由于使用
ISO7816.OFFSET\u LC
而不是setIncomingAndReceive
的输出,您的代码失败<代码>ISO7816。偏移量LC是一个常量,设置为值4。您的公共点比这个大。我可以问一下“那04
在响应开始时意味着什么?”在与卡中的公钥相对应的响应中:APDU这是我的一个答案发生接受的新记录。可惜没有徽章:)我现在完全瞎了,事实上它需要超过4个字节:)TY第一条评论是什么意思?我猜答案在发布后立即被接受。我说得对吗?:)@亚伯拉罕是的,几分钟后。
pubKey.setW(apduBuffer, ISO7816.OFFSET_CDATA,
ISO7816.OFFSET_LC);
pubKey.setW(apduBuffer, ISO7816.OFFSET_CDATA, ISO7816.OFFSET_LC);