将ECPublicKey从Java恢复到JavaCard

将ECPublicKey从Java恢复到JavaCard,java,cryptography,javacard,apdu,elliptic-curve,Java,Cryptography,Javacard,Apdu,Elliptic Curve,这个问题与我昨天问的问题有关: 我也有同样的问题,但情况正好相反: 将公钥从我的卡发送到我的计算机后(根据ANSI X9.62,该点表示为未压缩形式的八位字节字符串),我可以恢复相应的密钥 但是,如果我从计算机发送,我无法在卡上恢复它,我会得到一个加密异常(非法值),这意味着形状不正确或点与曲线参数不匹配 我验证了,我的参数定义良好,我以正确的形式发送点 为了调试它,我尝试将公钥从我的卡发送到我的计算机,然后将其重新发送到我的卡以尝试恢复它(因此我确信参数是正确的)。不管怎样,我还是会犯同样的错

这个问题与我昨天问的问题有关:

我也有同样的问题,但情况正好相反: 将公钥从我的卡发送到我的计算机后(根据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);