我知道这里有类似的问题,但我仍然没有找到一个明确的答案。是否有可能在不使用弹跳城堡的情况下,使用给定的连接功能推导出会话密钥。NET库?似乎有一些差异,因为我两边没有得到相同的会话密钥(第二部分:嵌入式实现)。
这就是我目前正在尝试的方式(TempPubKeySCC是我收到的原始未压缩格式的pubkey,ECDHtemPublicKey将发送给另一方):
byte[] blobMagic = new byte[4] { 0x45, 0x43, 0x4B, 0x31 };
byte[] eccBlob = new byte[8 + 64];
byte[] lengthData = new byte[4] { 0x20, 0x0, 0x0, 0x0 };
Buffer.BlockCopy(blobMagic, 0, eccBlob, 0, 4);
Buffer.BlockCopy(lengthData, 0, eccBlob, 4, 4);
Buffer.BlockCopy(TempPubKeySCC, 1, eccBlob, 8, 64);
CngKey PubKeyBySCC = CngKey.Import(eccBlob, CngKeyBlobFormat.EccPublicBlob);
byte[] SharedSecret;
byte[] ECDHtempPublicKey = new byte[65];
using (ECDiffieHellmanCng TempECDH = new ECDiffieHellmanCng(ECCurve.NamedCurves.nistP256))
{
byte[] secpre = new byte[4] { 0x00, 0x00, 0x00, 0x01 };
byte[] secpost = new byte[3] { 0x01, 0x55, 0x56 };
TempECDH.HashAlgorithm = CngAlgorithm.Sha256;
TempECDH.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash;
TempECDH.SecretPrepend = secpre;
TempECDH.SecretAppend = secpost;
ECDHtempPublicKey[0] = 0x04;
Buffer.BlockCopy(TempECDH.PublicKey.ToByteArray(), 8, ECDHtempPublicKey, 1, 64);
SharedSecret = TempECDH.DeriveKeyMaterial(PubKeyBySCC);
}
那么我的问题是?有什么问题吗?还是我需要在bouncyCastle上投入一些时间?secp256r1
非常感谢=)
问候Matze
BTW:我的测试环境只有一个问题…代码正在做它应该做的事情,我重新检查了bouncyCastle。:)
对于那些谁也在寻找这样的东西…
问候Matze