- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题与我昨天问的问题相关: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_CDATA
和 ISO7816.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/
我已经开始使用 JavaCards 并试图掌握 CLA 字节的含义。 如果阅读RFC 5.4.1 Class byte 5.4.1 Class byte According to table 8 us
我有一张 Gemalto Top DL v2 java 卡。当我 list 内容时,卡中加载了很多包: GlobalPlatformPro:> gp -visa2 -key 47454D5850524
我想读取 Java 卡上的 TLV 编码证书(NXP JCOP J3D081、JCOP 版本 2.4.2、Java 卡版本 3.0.1 Classic)。 cap 文件已成功创建,但当我尝试将其安装到
我想知道 JavaCard 中的 Util.* 函数是否通常是抗侧 channel 的。 是否存在一些具有侧 channel 抗性 Util.* 功能的 JavaCard? 我查看了几个公共(publ
我想配置一个 JavaCard,以便它只允许安装由特定 key 签名的小程序。我不确定这个签名是否是 cap 文件格式的一部分。我已经可以通过 GlobalPlatformPro 中的代码从 Andr
在尝试反编译 capfile 时研究 JCVM 规范,我想到了以下问题: 描述符组件(6.13)说: The Descriptor Component provides sufficient info
如您所知,OTA 消息或无线消息是特制的二进制 SMS 消息,移动运营商使用这些消息向 SIM 卡发送 APDU 命令以进行管理。例如,他们可以使用此类消息在 SIM 卡上安装或删除小程序。 我想知道
我正在寻找一个使用Java Card在SIM卡上运行的简单初学者程序。谁能给我一些入门的基本信息?我已经看过一些关于工具包api的描述,但是我正在寻找类似的东西:sim卡支持哪些功能,如何将我的代码上
我有一个空的 Javacard,如下所示: user@system$ java -jar gp.jar --list ISD: A000000003000000 (OP_READY) Pri
我是智能卡开发的新手。请帮助我了解如何开始。 Javacard和JCOP之间有什么关系? 如何将JCOP版本映射到GlobalPlatform Card Specification? 例如,JCOP
我正在尝试理解java卡的概念,我有一些疑问,我想与大家分享,也许你能给我任何最好的建议。 //Jcop- 我在某处读到 Java Card OpenPlatform (JCOP) 是由 IBM Zü
java卡现在有什么用?该文档要么非常旧,要么非常稀疏。谷歌搜索了一段时间后,这是我的想法: eID:使用私钥签署文档哈希,由中央机构(政府)颁发 - 签署法律文件 唯一 ID - 通过 ID 识别(
我想在 Linux 计算机上生成证书,将其传输到卡并在那里加密。然后将其存储并稍后取回。我想知道如何在卡上获取 4k RSA 数据之类的东西。它可以与 APDU 配合使用吗? 最佳答案 证书一般不需要
我尝试使用oracle java card development kit 3.0.5u2命令行工具。 我用的是netbeans生成的cap文件 我用 verifycap.bat在我的帽子上以及 sd
有人可以给我一些关于如何使用 javacard 签名并验证它的小建议吗?我想我在签名生成和验证方面做错了: ... SignatureMessageRecovery sig; ... private
我正在尝试在卡上签署一条消息并在卡外验证它。 结果总是假的。 我可能获取的模数和指数不正确。有什么想法吗? Java 小程序代码: protected MainApplet() { try {
我想开发一个使用 java 卡的生物识别指纹认证,我发现 javacard 2.2 提供了 APIs (javacardx.biometry) 来做到这一点,但我没有找到任何关于Match On Ca
我注意到我的智能卡(带有 Omnikey 5121 读卡器的 NXP J2E145、J3A081、J3C145)上出现了一些非常奇怪的行为:调用 JavaCard 方法后立即断电 JCSystem.r
我有一个包含我的小程序的双接口(interface) Java 卡。我想对来自不同接口(interface)的单个命令有两个不同的 APDU 响应。 例如,当从接触界面接收到命令时,我想用“Con
我一直在查看 JavaCard API 和示例,但找不到对更高级别数据集合(如 List、ArrayList、HashMaps 等)的任何引用? 我错过了什么吗? 我知道 JavaCard 环境的资源
我是一名优秀的程序员,十分优秀!