Я пытаюсь выполнить обмен ключами Diff ie Hellman с параметром «en c» в «ECDH-ES + A256KW». Я не специалист по криптографии, поэтому я с трудом читал RFC, и поэтому без особых разъяснений. Я использую c# с Portable.BouncyCastle. Я пришел к следующему:
var generator = (ECKeyPairGenerator) GeneratorUtilities.GetKeyPairGenerator("ECDH");
generator.Init(new ECKeyGenerationParameters(domainParameters, new SecureRandom()));
AsymmetricCipherKeyPair acsKeyPair = generator.GenerateKeyPair();
IBasicAgreement keyAgreement = AgreementUtilities.GetBasicAgreement("ECDH");
keyAgreement.Init(acsKeyPair.Private);
Org.BouncyCastle.Math.BigInteger sharedSecret = keyAgreement.CalculateAgreement(remotePublicKey);
byte[] sharedSecretBytes = sharedSecret.ToByteArray();
IDigest digest = new Sha256Digest();
byte[] symmetricKey = new byte[digest.GetDigestSize()];
digest.BlockUpdate(sharedSecretBytes, 0, sharedSecretBytes.Length);
digest.DoFinal(symmetricKey, 0);
Кажется, я делаю что-то не так, потому что, когда другая часть отправляет мне JWE ("alg": "dir", "en c": "A128CB C -HS256 ") с зашифрованным сообщением, которое не удается расшифровать из-за HMA C, когда я использую свой симметричный ключ, поэтому я полагаю, что обмен ключами выполняется неправильно. Любая помощь / подсказка будет принята с благодарностью.