微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 BouncyCastle BCFKS 密钥库中存储 X25519 密钥对

如何解决在 BouncyCastle BCFKS 密钥库中存储 X25519 密钥对

为了与 Curve25519 执行 Diffie-Hellman 密钥协议,我使用 BouncyCastle 1.68 生成以下密钥对:

// Generate a key pair
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("X25519",BouncyCastleProvider.PROVIDER_NAME);
keyPairGenerator.initialize(new XDHParameterSpec(XDHParameterSpec.X25519));
KeyPair keyPair = keyPairGenerator.generateKeyPair();

使用此密钥对,我现在可以成功执行密钥协议:

// Perform a (dummy) key agreement
KeyAgreement keyAgreement = KeyAgreement.getInstance("X25519",BouncyCastleProvider.PROVIDER_NAME);
keyAgreement.init(keyPair.getPrivate());
keyAgreement.doPhase(keyPair.getPublic(),true);
byte[] secret = keyAgreement.generateSecret();

现在我想将此密钥对安全地存储在 BCFKS 密钥库中以备将来使用,如下所示:

// Create a key store for the key pair
KeyStore keyStore = KeyStore.getInstance("BCFKS",BouncyCastleProvider.PROVIDER_NAME);
keyStore.load(null,"keyStorePassword".tochararray());

// Put the key pair in the key store as a PrivateKeyEntry
final X509Certificate selfSignedCertificate = generateSelfSignedCertificate(keyPair); // Todo: How to generate a certificate?
final KeyStore.PrivateKeyEntry entry = new KeyStore.PrivateKeyEntry(keyPair.getPrivate(),new Certificate[]{selfSignedCertificate});
keyStore.setEntry("alias",entry,new KeyStore.PasswordProtection("keyEntryPassword".tochararray()));

... 除了 KeyStore.PrivateKeyEntry 构造函数需要证书(而不是公钥),并且 X25519 根据定义不能用于签署证书。 (尝试使用它创建 Signer 自然会失败,java.lang.IllegalArgumentException: UnkNown signature type requested: X25519

在这里遗漏了一些明显的东西,还是目前没有简单的方法可以将 X25519 密钥对放入 BCFKS 密钥库? 考虑到我真的不需要证书,只是一种将私钥/公钥存储在密钥库中的方法,是否有我可以应用的解决方法

解决方法

问题是 X25519 证书不需要自签名。

使用第二个伪造/一次性密钥(f.i. RSA)签署证书工作正常。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。