1

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 でサポートされていませんか?

4

0 に答える 0