【问题标题】:Java Card - Transfering ec public key from offcard to java card AppletJava Card - 将 ec 公钥从 offcard 传输到 java card Applet
【发布时间】:2014-07-14 09:49:10
【问题描述】:

我正在尝试为 java 卡小程序实现两种方式的身份验证流程。以下是我的方法。

  1. 为 offcard 应用程序创建 EC(椭圆曲线)密钥对。
  2. 将offcard应用程序的公钥存储在java卡中。
  3. 从卡外应用程序私钥签署输入数据。
  4. 使用存储在 java 卡小程序中的卡外应用程序公钥验证它。

我在第二步中挣扎。其他一切似乎都是微不足道的。我需要找到一种方法将外部创建的公钥编码为字节数组,然后将该字节数组传输到 java 卡小程序并重建公钥并将其存储在持久内存中。

任何提示。

【问题讨论】:

  • 您使用哪个 JavaCard 版本?
  • Java卡2.2.1,JCOP31 v2.4.1
  • 请注意,您最后一次“接受”是在 2012 年 8 月。请接受答案,以便将其视为“已回答”,或说明不可接受的原因。

标签: javacard


【解决方案1】:

使用以下命令数据创建一个 APDU:

  1. 一个短的键大小(订单的大小 N)
  2. 将除 G(基点)和 W(公钥)和 H 之外的所有参数作为静态大小的八位字节字符串(或字节数组,如果您习惯于 Java)发送
    • 剥离初始字节设置为00(如果存在)
    • 左填充零字节,直到获得密钥大小
  3. 将 G 和 W 作为未压缩点发送
    • 一个字节04
    • 后跟两个坐标,使用上述方法调整大小
    • 长度是密钥大小(以字节为单位)的 2 倍,加上 04 指示符的 1
  4. 可选择将辅因子 H 作为字节发送(但始终是 01
  5. 使用set...方法设置密钥

然后,为您准备一个 EC 密钥。


您当然也可以解析 PKCS#8 EC 密钥或为每个字段使用长度指示符,但这种方法可能是最紧凑的方法。

【讨论】:

    【解决方案2】:

    要实现这一点,您必须创建一个 Javacard 小程序,它......如下所示

    class MyApplet extends javacard.framework.Applet
    {
     // ...
     public void process(APDU apdu)
     {
      // ...
      byte[] buffer = apdu.getBuffer();
      //Other stuff
     }
    }
    

    要到达public void process(APDU apdu) 方法,您应该选择您的小程序及其 AID,之后每个命令都将开始到达此方法。
    您可以创建自己的专有 APDU 来发送“offcard 应用程序私钥”并可以在此处获取它
    byte[] buffer = apdu.getBuffer();,然后您可以将其存储在您的小程序的持久数组中。

    【讨论】:

    • 您解释了如何发送/接收 APDU。问题不在于这个问题,即使发送/接收 APDU 当然需要从卡外数据创建 EC 密钥。您的答案中甚至没有“EC”一词。最后,您似乎表明问题是发送私钥,而实际上需要发送公钥。
    猜你喜欢
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    相关资源
    最近更新 更多