gpt4 book ai didi

java - 将 ECPublicKey 从 Java 恢复到 JavaCard

转载 作者:行者123 更新时间:2023-11-30 03:23:42 25 4
gpt4 key购买 nike

这个问题与我昨天问的问题相关:Recovering an ECPublicKey from JavaCard to Java

我有同样的问题,但方式相反:将公钥从我的卡发送到我的计算机后(该点按照 ANSI X9.62 以未压缩形式表示为八位字节字符串),我可以恢复相应的 key 。

但如果我从计算机发送它,我无法在卡上恢复它,我会收到 CryptoException (ILLEGAL_VALUE),这意味着该表单不是正确或该点与曲线参数不匹配。

我已验证,我的参数定义良好,并且我以正确的形式发送了点...

为了调试它,我尝试将公钥从我的卡发送到我的计算机,然后将其重新发送到我的卡以尝试恢复它(所以我确信参数没问题)。不管怎样,我仍然遇到同样的错误......

为了说明我的问题,我发布相应的代码:

在卡侧 - 发送公钥:

pubKey = (ECPublicKey) KeyBuilder.buildKey(
KeyBuilder.TYPE_EC_FP_PUBLIC, (short) 0x0100, false);
pubKey.setFieldFP(p, (short) 0x0001, (short) 0x0020);
pubKey.setA(a, (short) 0x0001, (short) 0x0020);
pubKey.setB(b, (short) 0x0000, (short) 0x0020);
pubKey.setR(r, (short) 0x0001, (short) 0x0020);
pubKey.setG(g, (short) 0x0000, (short) g.length);

privKey = (ECPrivateKey) KeyBuilder.buildKey(
KeyBuilder.TYPE_EC_FP_PRIVATE, (short) 0x0100, false);

KeyPair keypair = new KeyPair(pubKey, privKey);
keypair.genKeyPair();

short len = pubKey.getW(apduBuffer, (short) 0x0000);
setOutgoingAndSend((short) 0x0000, len);

发送的响应是:

APDU <<<: 04C2B28FBE96C5EAC1E81750E9B288B0BD8357D3AED4EA39413197D734B145EBC92F3FD7489B9A7EF4C8A956427668851F0BB3A55D5C7B9033A533F21463E1A2139000

所以第一个坐标是x = C2B28FBE96C5EAC1E81750E9B288B0BD8357D3AED4EA39413197D734B145EBC9,第二个坐标是y = 2F3FD7489B9A7EF4C8A956427668851F0BB3A55D 5C7B9033A533F21463E1A213

在计算机端 - 恢复 key 并重新发送:

byte[] x = new byte[32];
byte[] y = new byte[32];
System.arraycopy(W, 1, x, 0, x.length);
System.arraycopy(W, 1 + x.length, y, 0, y.length);

ECPublicKeySpec pub = new ECPublicKeySpec(new ECPoint(new BigInteger(1,x), new BigInteger(1,y)), ecParamSpec);

ECPublicKey ecPubKey = (ECPublicKey) kf.generatePublic(pub);

byte[] k_x = ecPubKey.getEncoded();

byte[] tmp = new byte[70];
tmp[0] = (byte) 0x80;
tmp[1] = (byte) 0x20;
tmp[2] = (byte) 0x00;
tmp[3] = (byte) 0x00;
tmp[4] = (byte) (65);
System.arraycopy(k_x, k_x.length - 65, tmp, 5,65);

sendApdu(cardChan, tmp);

发送的APDU是:

APDU >>>: 802000004104C2B28FBE96C5EAC1E81750E9B288B0BD8357D3AED4EA39413197D734B145EBC92F3FD7489B9A7EF4C8A956427668851F0BB3A55D5C7B9033A533F21463E1A213

因此我们可以很容易地看到发送的数据与之前收到的数据完全相同。

最后,在卡方面,我有以下代码来恢复 key :

pubKey.setW(apduBuffer, ISO7816.OFFSET_CDATA,
ISO7816.OFFSET_LC);

len = pubKey.getW(apduBuffer, (short) 0x0000);
setOutgoingAndSend((short) 0x0000, len);

但是我得到APDU >>>:0401

这意味着在指令中引发的 CryptoException.ILLEGAL_VALUE

pubKey.setW(apduBuffer, ISO7816.OFFSET_CDATA,
ISO7816.OFFSET_LC);

知道我发送的内容与通过 pubKey.getW() 获取的内容相同,它如何引发异常?

最佳答案

问题可能是:

pubKey.setW(apduBuffer, ISO7816.OFFSET_CDATA, ISO7816.OFFSET_LC);

首先,您不应该直接使用 ISO7816.OFFSET_CDATAISO7816.OFFSET_LC。使用 APDU.getOffsetCData 获取命令数据的位置,并使用 APDU.setIncomingAndReceive 获取 Nc 值(Lc 是 Nc 值的编码>).

目前,您的代码因使用 ISO7816.OFFSET_LC 而不是 setIncomingAndReceive 的输出而失败。 ISO7816.OFFSET_LC 是一个设置为值 4 的常量。您的公共(public)点比该值更大。

关于java - 将 ECPublicKey 从 Java 恢复到 JavaCard,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30752639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com