【问题标题】:How can I send my public key in an APDU (Javacard)?如何在 APDU (Javacard) 中发送我的公钥?
【发布时间】:2021-05-26 23:46:57
【问题描述】:

我正在尝试将我的公钥从我的密钥对发送到 APDU 中,以便可以在另一个程序中验证签名。到目前为止,我还没有找到将密钥放入 APDU 缓冲区的方法。

我在网上找到了使用RSAPublicKey.getExponent() 将密钥存储在字节数组中的解决方案(然后将其添加到缓冲区中),但是由于我没有使用 RSAPublicKey,所以这并没有那么有用。这是唯一的方法吗?我是否需要使用 RSAPublicKey 而不是密钥对,或者有什么方法可以将我的密钥对中的公钥放入 APDU 缓冲区?

这是我的密钥生成代码:

KeyPair key = new KeyPair(KeyPair.ALG_RSA, (short)5120);
key.genKeyPair(); 

【问题讨论】:

    标签: java public-key javacard apdu key-pair


    【解决方案1】:

    首先,RSA公钥由模数和指数组成。首先,您需要使用 getPublic() 并恢复具有 RSAPublicKey 接口的对象,该接口公开 getExponent 和 getModulus 方法,这些方法将为您提供可以放入 APDU 缓冲区的字节数组。 公共指数可能类似于 0x010001,但模数将是您声明为 KeyPair 参数的位长度。

    对于如此长的模数,您将需要扩展 APDU 或将其拆分为多个 APDU 交换。为了兼容性,我通常会推荐第二种方法,但如果您正在处理的系统肯定会在两端处理扩展 APDU,您可以尝试一次性完成。

    【讨论】:

    • 谢谢,请问您所说的“使用 RSAPublicKey 恢复对象”是什么意思?还有模数和指数,有没有办法在另一端“重新构造”密钥?
    • @LozCodes 表示 getPublicKey() 返回的是 PubliKey 类型的对象,它是 RSAPublicKey 类实现的抽象接口。因此,当您为 RSA 构建一个专门的 keypar 对象时,您将得到一个 RSA 专门的公钥。这只是面向对象的编程。当然,您也可以构造一个公钥 - 如果在 Java 中,请查看 RSAPublicKeySpec,它有一个带模数和指数的构造函数。
    【解决方案2】:

    我面前没有有效的 JavaCard IDE,但类似的东西应该可以工作:

    KeyPair keyPair = new KeyPair(KeyPair.ALG_RSA, (short)xxx);
    keyPair.genKeyPair();
    RSAPublicKey pubKey = (RSAPublicKey) keyPair.getPublicKey();
    short len = pubkey.getExponent(apdu.getBuffer(), (short)0);
    

    从这里继续...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-17
      • 2021-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多