我正在处理一个与Firefox的新Push API集成的项目,该API正在作为W3C标准开发中。
其中一部分是加密数据。服务器将接收Diffie Hellman P256 Curve(使用
当转换为.NET base64时,其示例为
System.Security.Cryptography.CryptographicException: 请求的操作不受支持。 我究竟理解错误了什么(或者更悲观地说,Windows/.NET中哪些内容没有正确实现(或者根本没有实现))? 作为替代方案,如果有人能解释如何将此 Node JS库 移植到.NET,那也可以(我认为这有点困难)。 更新 我需要继续处理问题的其余部分,并且不能因为加密而停滞不前,因此我使用了一个Node.JS包装器,以允许在.NET端进行进一步开发。节点代码仅生成本地公共密钥和共享密钥,并将这些值返回给我。我仍然需要在没有Node包装器的情况下使其工作。 由于这个测试,我可以确认代码的其余部分(未在此处包括)有效,因此问题肯定出现在上面的代码中(以及我的无法在指定HashAlgorithm为
其中一部分是加密数据。服务器将接收Diffie Hellman P256 Curve(使用
var key = subscription.getKey('p256dh');
在JS中生成)。当转换为.NET base64时,其示例为
但是我遇到了生成派生材料的问题。BOAiqZO6ucAzDlZKKhF1aLjNpU8+R2Pfsz4bQzNpV145D+agNxvLqyu5Q2tLalK2w31RpoDHE8Sipo0m2jiX4WA=
var key1 = Convert.FromBase64String("<stringFromAbove>").ToList() // You can criticize my .toList inefficiencies later
// .NET doesn't like the key without these prefixes. See here
// https://dev59.com/uWAf5IYBdhLWcg3w0VUf
// I know the bytes don't match that post, but that is because the key type is different between their example and mine.
var keyType = new byte[] { 0x45, 0x43, 0x4B, 0x31 };
var keyLength = new byte[] { 0x20, 0x00, 0x00, 0x00 };
key1.RemoveAt(0);
key1 = keyType.Concat(keyLength).Concat(key1).ToList();
ECDiffieHellmanCng a = new ECDiffieHellmanCng();
a.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash;
// If I set this as CngAlgorithm.Sha256 it works, but that's not what Firefox gives me.
a.HashAlgorithm = CngAlgorithm.ECDiffieHellmanP256;
a.KeySize = 256; // It complains if I don't add this since keys are different lengths.
// Now time to actually import the key
CngKey k = CngKey.Import(key1.ToArray(), CngKeyBlobFormat.EccPublicBlob); // Works successfully
byte[] derivedMaterial = a.DeriveKeyMaterial(k); // Exception Here
System.Security.Cryptography.CryptographicException: 请求的操作不受支持。 我究竟理解错误了什么(或者更悲观地说,Windows/.NET中哪些内容没有正确实现(或者根本没有实现))? 作为替代方案,如果有人能解释如何将此 Node JS库 移植到.NET,那也可以(我认为这有点困难)。 更新 我需要继续处理问题的其余部分,并且不能因为加密而停滞不前,因此我使用了一个Node.JS包装器,以允许在.NET端进行进一步开发。节点代码仅生成本地公共密钥和共享密钥,并将这些值返回给我。我仍然需要在没有Node包装器的情况下使其工作。 由于这个测试,我可以确认代码的其余部分(未在此处包括)有效,因此问题肯定出现在上面的代码中(以及我的无法在指定HashAlgorithm为
CngAlgorithm.ECDiffieHellmanP256
时生成派生密钥材料的能力)。