如何在APDU(Javacard)中发送公钥?

如何在APDU(Javacard)中发送公钥?,java,public-key,javacard,apdu,key-pair,Java,Public Key,Javacard,Apdu,Key Pair,我正试图从APDU中的密钥对发送公钥,以便在另一个程序中验证签名。到目前为止,我还没有找到任何方法将密钥放入APDU缓冲区 我在网上找到了使用RSAPublicKey.getExponent()将密钥存储在字节数组中(然后将其添加到缓冲区)的解决方案,但由于我没有使用RSAPublicKey,所以这没有多大帮助。这是唯一的办法吗?我是否需要使用RSAPublicKey而不是密钥对,或者是否有某种方法将密钥对中的公钥放入APDU缓冲区 这是我的密钥生成代码: KeyPair key = new K

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

我在网上找到了使用
RSAPublicKey.getExponent()
将密钥存储在字节数组中(然后将其添加到缓冲区)的解决方案,但由于我没有使用RSAPublicKey,所以这没有多大帮助。这是唯一的办法吗?我是否需要使用RSAPublicKey而不是密钥对,或者是否有某种方法将密钥对中的公钥放入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公钥由模和指数组成。首先,您需要使用getPublic()并恢复具有RSAPublicKey接口的对象,该接口公开getExponent和getmodule方法,这些方法将获取可以放入APDU缓冲区的字节数组。 公共指数可能类似于0x010001,但模数将是您声明为密钥对参数的位长度


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

谢谢,我可以问一下“使用RSAPublicKey恢复对象”是什么意思吗?还有模和指数,也就是说,有没有办法“重新构造”另一端的键?@LozCodes这意味着getPublicKey()返回PubliKey类型的对象,这是一个由RSAPublicKey类实现的抽象接口。因此,当您构造一个专门用于RSA的keypar对象时,您将得到一个专门用于RSA的公钥。这只是面向对象编程。当然,您也可以构造一个公钥——如果是在Java中,那么请查看RSAPublicKeySpec,它有一个带模和指数的构造函数。