如何在 APDU (Javacard) 中发送我的 public 密钥?

How can I send my public key in an APDU (Javacard)?

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

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

这是我的密钥生成代码:

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

我面前没有有效的 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);

从这里继续...

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

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