Java Card - 将ec公钥从offcard转移到java卡Applet

时间:2014-07-14 09:49:10

标签: javacard

我正在尝试为Java卡小程序实现双向身份验证流程。以下是我的方法。

  1. 为offcard应用程序创建EC(Eliptic曲线)密钥对。
  2. 将offcard应用程序的公钥存储在Java卡中。
  3. 从offcard应用程序私钥中签名输入数据。
  4. 使用存储在java卡小程序中的offcard应用程序公钥验证它。
  5. 我在第二步挣扎。所有其他人似乎微不足道。我需要找到一种方法将外部创建的公钥编码为字节数组,然后将该字节数组传输到Java卡小程序并重新构建公钥并将其存储在持久存储器中。

    对此有任何提示。

2 个答案:

答案 0 :(得分:2)

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

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


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

答案 1 :(得分:-3)

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

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

要使用public void process(APDU apdu)方法,您应该选择具有AID的applet,然后每个命令都会开始使用此方法。
您可以创建自己的专有APDU来发送" offcard应用程序私钥"并且可以在这里得到 byte[] buffer = apdu.getBuffer();然后您可以将其存储在applet的持久数组中。