public void ToBuffer_ShouldBeReversible()
        {
            using (var randomnessProvider = RandomNumberGenerator.Create())
            {
                // Arrange.
                var processor       = new SymmetricStringProcessor(randomnessProvider);
                var plaintextObject = "䆟`ಮ䷆ʘ‣⦸⏹ⰄͶa✰ṁ亡Zᨖ0༂⽔9㗰";

                using (var target = SecureSymmetricKey.New())
                {
                    // Arrange.
                    var ciphertext = processor.Encrypt(plaintextObject, target);

                    // Act.
                    using (var buffer = target.ToBuffer())
                    {
                        using (var parityKey = SecureSymmetricKey.FromBuffer(buffer))
                        {
                            // Arrange.
                            var result = processor.Decrypt(ciphertext, parityKey);

                            // Assert.
                            result.Should().Be(plaintextObject);
                        }
                    }
                }
            }
        }
        private static void Encrypt_ShouldBeReversible_UsingCascadingSymmetricKey(CascadingSymmetricKey key)
        {
            using (var randomnessProvider = RandomNumberGenerator.Create())
            {
                // Arrange.
                var target          = new SymmetricStringProcessor(randomnessProvider);
                var plaintextObject = "䆟`ಮ䷆ʘ‣⦸⏹ⰄͶa✰ṁ亡Zᨖ0༂⽔9㗰";

                // Act.
                var ciphertextResult = target.Encrypt(plaintextObject, key);

                // Assert.
                ciphertextResult.Should().NotBeNullOrEmpty();
                ciphertextResult.Count(value => value == 0x00).Should().NotBe(ciphertextResult.Length);

                // Act.
                var plaintextResult = target.Decrypt(ciphertextResult, key);

                // Assert.
                plaintextResult.Should().NotBeNullOrEmpty();
                plaintextResult.Length.Should().Be(plaintextObject.Length);
                plaintextResult.Count(value => value == 0x00).Should().NotBe(plaintextResult.Length);

                for (var i = 0; i < plaintextResult.Length; i++)
                {
                    // Assert.
                    plaintextResult[i].Should().Be(plaintextObject[i]);
                }
            }
        }
        private static void Encrypt_ShouldBeReversible_UsingSecureSymmetricKey(SymmetricAlgorithmSpecification algorithm)
        {
            using (var randomnessProvider = RandomNumberGenerator.Create())
            {
                // Arrange.
                var target          = new SymmetricStringProcessor(randomnessProvider);
                var plaintextObject = "䆟`ಮ䷆ʘ‣⦸⏹ⰄͶa✰ṁ亡Zᨖ0༂⽔9㗰";

                using (var key = SecureSymmetricKey.New(algorithm))
                {
                    // Act.
                    var ciphertext = target.Encrypt(plaintextObject, key);

                    // Assert.
                    ciphertext.Should().NotBeNullOrEmpty();
                    ciphertext.Count(value => value == 0x00).Should().NotBe(ciphertext.Length);

                    // Act.
                    var plaintext = target.Decrypt(ciphertext, key);

                    // Assert.
                    plaintext.Should().NotBeNullOrEmpty();
                    plaintext.Should().Be(plaintextObject);
                }
            }
        }
        public void EncryptToBase64String_ShouldBeReversible()
        {
            using (var randomnessProvider = RandomNumberGenerator.Create())
            {
                // Arrange.
                var target          = new SymmetricStringProcessor(randomnessProvider);
                var algorithm       = SymmetricAlgorithmSpecification.Aes128Cbc;
                var plaintextObject = "aZ09`ಮ";

                using (var key = SecureSymmetricKey.New(algorithm))
                {
                    // Act.
                    var ciphertext = target.EncryptToBase64String(plaintextObject, key);

                    // Assert.
                    ciphertext.Should().NotBeNullOrEmpty();

                    // Act.
                    var result = target.DecryptFromBase64String(ciphertext, key);

                    // Assert.
                    result.Should().NotBeNullOrEmpty();
                    result.Should().Be(plaintextObject);
                }
            }
        }