public void AuthenticatedSymmetricAlgorithmVerifierTestNegativeAuthenticationEncryptStandardDecryptTest() { byte[] plaintext = Encoding.UTF8.GetBytes("Plaintext"); byte[] ciphertext = null; byte[] key = null; SymmetricEncryptionState encryptionState = null; using (AuthenticatedSymmetricAlgorithm encryptAes = new AuthenticatedAesCng().EnableLogging()) { key = encryptAes.Key; encryptAes.IV = new byte[] { 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; using (IAuthenticatedCryptoTransform encryptor = encryptAes.CreateAuthenticatedEncryptor()) using (MemoryStream ms = new MemoryStream()) using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) { cs.Write(plaintext, 0, plaintext.Length); cs.FlushFinalBlock(); ciphertext = ms.ToArray(); encryptionState = encryptAes.GetLastEncryptionState(); } } using (SymmetricAlgorithm decryptAes = new AesCng().EnableDecryptionVerification(encryptionState)) { decryptAes.Key = key; using (MemoryStream ms = new MemoryStream()) using (CryptoStream cs = new CryptoStream(ms, decryptAes.CreateDecryptor(), CryptoStreamMode.Write)) { cs.Write(ciphertext, 0, ciphertext.Length); cs.FlushFinalBlock(); } } Assert.Fail("Decryption should have failed."); }
/// <summary> /// Utility to encapsulate round-tripping ciphertext /// </summary> private static bool RoundTripHelper(Type encryptionAlgorithm, Action <SymmetricAlgorithm> encryptionSetup, Type decryptionAlgorithm, Action <SymmetricAlgorithm> decryptionSetup) { // Encryption parameters byte[] key = null; byte[] iv = null; CipherMode cipherMode = CipherMode.CBC; PaddingMode paddingMode = PaddingMode.None; // Round tripping data byte[] plainText = Encoding.UTF8.GetBytes("Secret round trip message"); byte[] cipherText = null; SymmetricEncryptionState encryptionState = null; SymmetricAlgorithm encryptionObject = null; try { // Setup the encryption algorithm encryptionObject = (SymmetricAlgorithm)Activator.CreateInstance(encryptionAlgorithm); encryptionSetup(encryptionObject); encryptionObject = encryptionObject.EnableLogging(); // Encrypt the data using (MemoryStream ms = new MemoryStream()) using (CryptoStream cs = new CryptoStream(ms, encryptionObject.CreateEncryptor(), CryptoStreamMode.Write)) { cs.Write(plainText, 0, plainText.Length); cs.FlushFinalBlock(); cipherText = ms.ToArray(); } // Save the encryption parameters key = encryptionObject.Key; iv = encryptionObject.IV; cipherMode = encryptionObject.Mode; paddingMode = encryptionObject.Padding; encryptionState = encryptionObject.GetLastEncryptionState(); } finally { if (encryptionObject != null) { (encryptionObject as IDisposable).Dispose(); } } byte[] roundTrip = null; // Now verify the data SymmetricAlgorithm decryptionObject = null; try { decryptionObject = (SymmetricAlgorithm)Activator.CreateInstance(decryptionAlgorithm); decryptionObject.Key = key; decryptionObject.IV = iv; decryptionObject.Mode = cipherMode; decryptionObject.Padding = paddingMode; decryptionSetup(decryptionObject); decryptionObject = decryptionObject.EnableDecryptionVerification(encryptionState); using (MemoryStream ms = new MemoryStream()) using (CryptoStream cs = new CryptoStream(ms, decryptionObject.CreateDecryptor(), CryptoStreamMode.Write)) { cs.Write(cipherText, 0, cipherText.Length); cs.FlushFinalBlock(); roundTrip = ms.ToArray(); } } finally { if (decryptionObject != null) { (decryptionObject as IDisposable).Dispose(); } } if (roundTrip.Length != plainText.Length) { return(false); } for (int i = 0; i < roundTrip.Length; ++i) { if (roundTrip[i] != plainText[i]) { return(false); } } return(true); }