Bouncy Castle の Java API を使用して、DSA と ECDH キーペアの組み合わせを使用して OpenPGP キーリングを生成しようとしています。NIST 曲線に依存しないために、Curve25519 を使用する関数として選択しました。ただし、キーリングをエクスポートすると、次のようになりますIllegalArgumentException。
java.lang.IllegalArgumentException: illegal object in getInstance: org.bouncycastle.asn1.DLSequence at: org.bouncycastle.asn1.ASN1ObjectIdentifier.getInstance(Unknown Source) at: org.bouncycastle.openpgp.operator.jcajce.JcaPGPKeyConverter.getPGPPublicKey(Unknown Source) at: org.bouncycastle.openpgp.operator.jcajce.JcaPGPKeyConverter.getPGPPublicKey(Unknown Source) at: org.bouncycastle.openpgp.operator.jcajce.JcaPGPKeyPair.getPublicKey(Unknown Source) at: org.bouncycastle.openpgp.operator.jcajce.JcaPGPKeyPair.(Unknown Source)
両方のキーペアを生成するために使用しているコードは次のとおりです。
String identity, passphrase; // User input
OutputStream secretOut, publicOut; // File streams
try {
KeyPairGenerator dsaKeygen = KeyPairGenerator.getInstance ("DSA", "BC");
KeyPairGenerator ecdhKeygen = KeyPairGenerator.getInstance ("ECDH", "BC");
dsaKeygen.initialize (2048);
KeyPair dsaKeypair = dsaKeygen.generateKeyPair ();
X9ECParameters ecParams = CustomNamedCurves.getByName ("Curve25519");
ECParameterSpec ecSpecs = new ECParameterSpec (
ecParams.getCurve (),
ecParams.getG (),
ecParams.getN (),
ecParams.getH (),
ecParams.getSeed ()
);
ecdhKeygen.initialize (ecSpecs, new SecureRandom ());
KeyPair ecdhKeypair = ecdhKeygen.generateKeyPair ();
PGPKeyPair dsaPgpKeypair = new JcaPGPKeyPair (PGPPublicKey.DSA, dsaKeypair, new Date ());
PGPKeyPair ecdhPgpKeypair = new JcaPGPKeyPair (PGPPublicKey.ECDH, ecdhKeypair, new Date ()); // Fails
PGPSignatureSubpacketGenerator flagsGen = new PGPSignatureSubpacketGenerator ();
flagsGen.setKeyFlags (
true,
KeyFlags.CERTIFY_OTHER |
KeyFlags.SIGN_DATA |
KeyFlags.ENCRYPT_COMMS |
KeyFlags.ENCRYPT_STORAGE
);
PGPDigestCalculator sha1Calculator = new JcaPGPDigestCalculatorProviderBuilder ()
.build ()
.get (HashAlgorithmTags.SHA1);
PGPKeyRingGenerator keyRingGenerator = new PGPKeyRingGenerator (
PGPSignature.POSITIVE_CERTIFICATION,
dsaPgpKeypair,
identity,
sha1Calculator,
flagsGenerator.generate (),
null,
new JcaPGPContentSignerBuilder (dsaPgpKeypair.getPublicKey ().getAlgorithm (), AlgorithmTags.SHA1),
new JcePBESecretKeyEncryptorBuilder (PGPEncryptedDate.AES_256, sha1Calculator)
.setProvider ("BC")
.build (passphrase.toCharArray ())
);
keyRingGenerator.addSubKey (ecdhPgpKeypair);
keyRingGenerator.generateSecretKeyRing ().encode (secretOut);
secretOut.close ();
keyRingGenerator.generatePublicKeyRing ().encode (publicOut);
publicOut.close ();
} catch (Exception e) {
// obligatory exception handling
}
参考までに:この GitHub の問題から採用した Curve25519 キーを生成するコードと、この Bouncy Castle の例から採用したキーリング全体を生成およびエクスポートするコード。
ECNamedCurveTableただし、上記のコードは機能し、たとえばの曲線を使用して、インポート可能なキーリングをエクスポートします (SHA1 はキー チェックサム生成のために Bouncy Castle でのみサポートされているため、GnuPG にはインポートできません) prime256v1。
JCA キーペアと OpenPGP キーペア間の変換が、Curve25519 を使用して作成されたキーでは失敗するのに、 の仕様で作成されたキーでは失敗するのはなぜECNamedCurveTableですか? 何か不足していますか、それともカスタム カーブは OpenPGP キーの Bouncy Castle でサポートされていませんか?