0

「openssl dhparam -out dh1024.pem 1024」コマンドの出力を Java でプログラム的に再現しようとしています。コード スニペットは次のとおりです。

            DHParametersGenerator generator = new DHParametersGenerator();
            generator.init(1024, 0, new SecureRandom());
            DHParameters params = generator.generateParameters();
            // Generator G is set as random in params, but it has to be 2 to conform to openssl
            DHParameters realParams = new DHParameters(params.getP(), BigInteger.valueOf(2));

            byte[] p = realParams.getP().toByteArray();
            byte[] g = realParams.getG().toByteArray();
            byte[] l = new byte[(byte) realParams.getL()];
            byte[] pgl = new byte[p.length+g.length+l.length];

            System.arraycopy(p, 0, pgl, 0, p.length);
            System.arraycopy(g, 0, pgl, p.length, g.length);
            System.arraycopy(l, 0, pgl, p.length+g.length, l.length);

したがって、基本的には、P、G、および L パラメータの値をバイト配列「pgl」に連結し、BC の PEMWriter クラスを使用してファイルに保存しています。しかし、openssl 経由で使用しようとすると、次のエラーが発生します。

/etc/openvpn/easy-rsa/keys/dh1024.pem から DH パラメーターを読み込めません: エラー:0D07207B:asn1 エンコード ルーチン:ASN1_get_object:ヘッダーが長すぎます: エラー:0D068066:asn1 エンコード ルーチン:ASN1_CHECK_TLEN:オブジェクト ヘッダーが正しくありません: エラー: 0D07803A:asn1 エンコード ルーチン:ASN1_ITEM_EX_D2I:ネストされた asn1 エラー:エラー:0906700D:PEM ルーチン:PEM_ASN1_read_bio:ASN1 lib

....これにより、DHパラメーターを間違ってエンコードしていると思われますが、これをエンコードする正しい方法がどこにも見つかりません。誰でもこれで私を助けることができますか?私は何日も城壁に頭をぶつけてきましたが、役に立ちません....助けてください:(

4

2 に答える 2

3

ありがとうGregS、あなたのソリューションは機能しますが、最終的にはBCの標準JavaとPemWriterを使用して解決しましたが、このアプローチではジェネレータG = 2を設定することはできませんが、opensslとJavaの両方で動作しますが、とにかく私の最初の目的でした:)

import java.io.FileWriter;
import java.io.IOException;
import java.security.AlgorithmParameterGenerator;
import java.security.AlgorithmParameters;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;
import org.bouncycastle.util.io.pem.PemObject;
import org.bouncycastle.util.io.pem.PemWriter;

public class DHCredentials {

    public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchProviderException, IOException 
        {
        DHCredentials dhc = new DHCredentials();
        System.out.println("This may take a long time ...");

        dhc.saveDHParams("C:\\xxxDH.txt", dhc.genDHParams());

        System.out.println("Done");
    }

    public byte[] genDHParams() throws IOException
    {
        AlgorithmParameterGenerator paramGen = null;
        try 
        {
            paramGen = AlgorithmParameterGenerator.getInstance("DH");
            paramGen.init(1024, new SecureRandom());
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        AlgorithmParameters params = paramGen.generateParameters();
        return params.getEncoded();
    }

    public void saveDHParams(String filePath, byte[] DEREncodedDHParams)
    {
        PemWriter pemWrt;

        try {
            pemWrt = new PemWriter(new FileWriter(filePath));
            pemWrt.writeObject(new PemObject("DH PARAMETERS", DEREncodedDHParams));
            pemWrt.flush();
            pemWrt.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
于 2011-05-07T14:01:02.403 に答える