将 BouncyCastle DSAPrivateKeyParameters 转换为 System.Security.Cryptography.DSAParameters

Convert BouncyCastle DSAPrivateKeyParameters to System.Security.Cryptography.DSAParameters

我正在尝试使用 Bouncy Castle 生成一个新的自签名 X509 证书(X509Certificate2 的实例)使用私钥。我用谷歌搜索了一些 RSA 示例,并根据这些示例创建了这段代码。我使用 Bouncy Castle 生成证书,然后尝试将其转换为 X509Certificate2,但我不知道如何将 Bouncy Castle DSA 私钥 (DSAPrivateKeyParameters) 转换为 System.Security.Cryptography.DSAParameters

var keypairgen = new DsaKeyPairGenerator();
DsaParametersGenerator paramgen = new DsaParametersGenerator();

paramgen.Init(1024, 100, new SecureRandom());
DsaKeyGenerationParameters param = new DsaKeyGenerationParameters(new SecureRandom(), paramgen.GenerateParameters());

keypairgen.Init(param);
var keypair = keypairgen.GenerateKeyPair();
var gen = new X509V3CertificateGenerator();

var CN = new X509Name("CN=" + "TEST");
var SN = BigInteger.ProbablePrime(120, new Random());

gen.SetSerialNumber(SN);
gen.SetSubjectDN(CN);
gen.SetIssuerDN(CN);
gen.SetNotAfter(DateTime.MaxValue);
gen.SetNotBefore(DateTime.Now.Subtract(new TimeSpan(7, 0, 0, 0)));
gen.SetSignatureAlgorithm("sha1WithDSA");
gen.SetPublicKey(keypair.Public);

var newCert = gen.Generate(keypair.Private);

certificateDSA = new X509Certificate2(DotNetUtilities.ToX509Certificate((Org.BouncyCastle.X509.X509Certificate)newCert));

certificateDSA.PrivateKey = ToDotNetKey(keypair.Private); //!!!! this line !!!!

有问题的是最后一行。我应该如何实现这个ToDotNetKey()?我认为这将是一些简单的属性映射,但事实并非如此。例如,在 DSAParameters 中有一个名为 J(或 Y)的 属性,它不在 Bouncy Castle 参数中,所以我不知道应该输入什么值里面。

请帮忙。

最后我自己解决了它作为另一个问题的副作用。从不同的方向开始:我在 .NET 中生成密钥对,然后使用 DotNetUtilities 将其转换为 Bouncy Castle。

最终的工作代码在这里,希望对您有所帮助: