编程语言
首页 > 编程语言> > c# – .NET ECDiffieHellmanCng和BouncyCastle Core兼容协议

c# – .NET ECDiffieHellmanCng和BouncyCastle Core兼容协议

作者:互联网

我必须与第三方签订Diffie Hellman协议,该协议以.NET ECDiffieHellmanCng XmlString格式传递公钥.我无法改变他们的代码.
他们发送的内容如下:

<ECDHKeyValue xmlns="http://www.w3.org/2001/04/xmldsig-more#">
  <DomainParameters>
    <NamedCurve URN="urn:oid:1.3.132.0.35" />
  </DomainParameters>
  <PublicKey>
    <X Value="11" xsi:type="PrimeFieldElemType" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
    <Y Value="17" xsi:type="PrimeFieldElemType" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
  </PublicKey>
</ECDHKeyValue>

他们使用典型的.NET Framework代码生成它,如下所示:

using (ECDiffieHellmanCng dhKey = new ECDiffieHellmanCng())
{
    dhKey.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash;
    dhKey.HashAlgorithm = CngAlgorithm.Sha256;

    Console.WriteLine(dhKey.PublicKey.ToXmlString());
}

他们希望以相同的格式接收我的公钥.
他们使用我的公钥这样:

ECDiffieHellmanCngPublicKey pbkey = ECDiffieHellmanCngPublicKey.FromXmlString(xmlHere);

我在.NET核心2.1中工作.不幸的是,ECDiffieHellmanCng类等目前尚未在.NET核心中实现.
我认为我可以使用BouncyCastle for .NET Core包:https://www.nuget.org/packages/BouncyCastle.NetCore/
我认为这两者都实现了相同的标准,并且它们是兼容的.

我知道如何与充气城堡完全达成协议,但是我不清楚如何从.NET ECDiffieHellmanCng中出现的xml中的X和Y值开始,以及如何确保使用兼容参数.
我也不清楚如何从我生成的弹性城堡公钥中获取X和Y值以发回给他们.
对.net api的充气城堡与java api不完全相同并且文档有限,这没有任何帮助.

更新1:
在阅读下面的一些评论之后,确实ECDiffieHellmanCng在.NET Core中部分实现了.大多数逻辑工作,但只有ToXmlString和FromXmlString不起作用.没关系,我可以解决这个问题.
但是我现在遇到了另一个问题.另一方使用的曲线是oid:1.3.132.0.35.
但是,当我尝试在.NET核心中使用它时,即使使用如下基本示例:

    using (ECDiffieHellman dhBob = ECDiffieHellman.Create(ECCurve.CreateFromValue("1.3.132.0.35")))
    {
        using (ECDiffieHellman dhAlice = ECDiffieHellman.Create(ECCurve.CreateFromValue("1.3.132.0.35")))
        {
            byte[] b = dhAlice.DeriveKeyMaterial(dhBob.PublicKey);

            byte[] b2 = dhBob.DeriveKeyMaterial(dhAlice.PublicKey);

            Console.WriteLine(b.SequenceEqual(b2));
        }
    }

然后我收到这个错误:

Unhandled Exception: System.PlatformNotSupportedException: The specified curve 'ECDSA_P521' or its parameters are not valid for this platform. ---> Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: The parameter is incorrect
   at System.Security.Cryptography.CngKeyLite.SetProperty(SafeNCryptHandle ncryptHandle, String propertyName, Byte[] value)
   at System.Security.Cryptography.CngKeyLite.SetCurveName(SafeNCryptHandle keyHandle, String curveName)
   at System.Security.Cryptography.CngKeyLite.GenerateNewExportableKey(String algorithm, String curveName)
   at System.Security.Cryptography.ECCngKey.GenerateKey(ECCurve curve)
   --- End of inner exception stack trace ---
   at System.Security.Cryptography.ECCngKey.GenerateKey(ECCurve curve)
   at System.Security.Cryptography.ECDiffieHellman.Create(ECCurve curve)
   at TestCore.Program.Main(String[] args) 

我不清楚错误消息.这条曲线真的不受支持吗?或者参数有问题,但究竟是什么?
如果不支持曲线会让我感到惊讶,因为支持nistP521曲线并且根据我在网上发现的IBM文档它们是相同的:https://www.ibm.com/support/knowledgecenter/en/linuxonibm/com.ibm.linux.z.wskc.doc/wskc_r_ecckt.html

解决方法:

看起来使用ECDH处理这些OID只会出现等效问题(它将其转换为Windows ECDSA名称而不是Windows ECDH名称).你可以用类似的东西解决它

private static ECCurve GetCurveByOid(string oidValue)
{
    switch (oidValue)
    {
        case "1.2.840.10045.3.1.7":
            return ECCurve.NamedCurves.nistP256;
        case "1.3.132.0.34":
            return ECCurve.NamedCurves.nistP384;
        case "1.3.132.0.35":
            return ECCurve.NamedCurves.nistP521;
    }

    return ECCurve.CreateFromValue(oidValue);
}

标签:c,net,net-core,bouncycastle,diffie-hellman
来源: https://codeday.me/bug/20190710/1424849.html