public void OffChainDecryptMessageTest() { var message = Hash.Generate().ToHex(); var secrets = SecretSharingHelper.EncodeSecret(message, MinimumCount, MinersCount); var encryptedValues = new Dictionary <string, byte[]>(); var decryptedValues = new Dictionary <string, byte[]>(); var ownerKeyPair = InitialMinersKeyPairs[0]; var othersKeyPairs = InitialMinersKeyPairs.Skip(1).ToList(); var decryptResult = ""; var initial = 0; foreach (var keyPair in othersKeyPairs) { var encryptedMessage = CryptoHelpers.EncryptMessage(ownerKeyPair.PrivateKey, keyPair.PublicKey, Encoding.UTF8.GetBytes(secrets[initial++])); encryptedValues.Add(keyPair.PublicKey.ToHex(), encryptedMessage); } // Check encrypted values. encryptedValues.Count.ShouldBe(MinersCount - 1); // Others try to recover. foreach (var keyPair in othersKeyPairs) { var cipherMessage = encryptedValues[keyPair.PublicKey.ToHex()]; var decryptMessage = CryptoHelpers.DecryptMessage(ownerKeyPair.PublicKey, keyPair.PrivateKey, cipherMessage); decryptedValues.Add(keyPair.PublicKey.ToHex(), decryptMessage); if (decryptedValues.Count >= MinimumCount) { decryptResult = SecretSharingHelper.DecodeSecret( decryptedValues.Values.Select(v => Encoding.UTF8.GetString(v)).ToList(), Enumerable.Range(1, MinimumCount).ToList(), MinimumCount); break; } } decryptResult.ShouldBe(message); }