java - 如何在Java中使用BouncyCaSTLe正确编码DH参数?

标签 java security bouncycastle cryptoapi

我正在尝试用Java以编程方式重现“openssl dhparam -out dh1024.pem 1024”命令的输出。代码片段如下:-

            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 使用它时,出现以下错误:-

Cannot load DH parameters from /etc/openvpn/easy-rsa/keys/dh1024.pem: error:0D07207B:asn1 encoding routines:ASN1_get_object:header too long: error:0D068066:asn1 encoding routines:ASN1_CHECK_TLEN:bad object header: error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error: error:0906700D:PEM routines:PEM_ASN1_read_bio:ASN1 lib

....这让我相信我错误地编码了 DH 参数,但我找不到任何正确的编码方法。有人能帮我吗?我已经把头撞到城堡墙上很多天了,但没有效果......请帮忙:(

最佳答案

这是一个例子。请注意,您不能在 generator.init() 中将确定性参数设置为 0,否则您将无法获得素数!我只是通过查看 BouncycaSTLe 源代码(例如查看 PEMWriter 类)就弄清楚了大部分代码。

import java.math.BigInteger;
import java.security.SecureRandom;

import org.bouncycastle.asn1.ASN1EncodableVector;
import org.bouncycastle.asn1.DERInteger;
import org.bouncycastle.asn1.DERSequence;
import org.bouncycastle.crypto.generators.DHParametersGenerator;
import org.bouncycastle.crypto.params.DHParameters;
import org.bouncycastle.util.encoders.Base64;

public class OpenSSLDHParamClone
{

    public static void main(String[] args) throws Exception
    {
        DHParametersGenerator generator = new DHParametersGenerator();
        generator.init(1024, 80, 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));
        ASN1EncodableVector seq = new ASN1EncodableVector();
        seq.add(new DERInteger(realParams.getP()));
        seq.add(new DERInteger(realParams.getG()));
        byte [] derEncoded = new DERSequence(seq).getDEREncoded();
        System.out.println("-----BEGIN DH PARAMETERS-----");
        String b64Encoded = new String(Base64.encode(derEncoded), "US-ASCII");
        while (b64Encoded.length() > 0) {
            int subStringLength = Math.min(64, b64Encoded.length());
            System.out.println(b64Encoded.substring(0, subStringLength));
            b64Encoded = b64Encoded.substring(subStringLength);
        }
        System.out.println("-----END DH PARAMETERS-----");
    }
}

关于java - 如何在Java中使用BouncyCaSTLe正确编码DH参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5802611/

相关文章:

Java 充气城堡 : Invalid point encoding 0x45

java - 包装和解包加密 key 失败 (javax.crypto)

java - 在 Java 中使用 Arrays.deepToString( Object[] arr ) 打印原语数组的元素

java - 限制输入最多只能打印 16 个位置的斐波那契数列?

javascript - 转义未加引号的属性

winforms - 加密将重新分发的 App.config 文件中的部分和/或设置

java - 复制 OpenSSL 命令以在 Java 中签署文件

java - 为 JGit 指定 SSH key

java - 按位运算,如何判断是0还是1?

linux - 在 Linux (CentOS6) 中显示攻击我的服务器的 IP 列表