예제 #1
0
        public string Decrypt(JweConfig config)
        {
            byte[] unwrappedKey = RsaEncryption.UnwrapSecretKey(config, Base64Utils.URLDecode(EncryptedKey), "SHA-256");
            if (unwrappedKey == null)
            {
                throw new EncryptionException(String.Format("Failed to unwrap key {0}", EncryptedKey));
            }

            string encryptionMethod = Header.Enc;

            byte[] plaintext;
            if (A256GCM.Equals(encryptionMethod))
            {
                plaintext = AesGcm.Decrypt(unwrappedKey, this);
            }
            else if (A128CBC_HS256.Equals(encryptionMethod))
            {
                plaintext = AesCbc.Decrypt(unwrappedKey, this);
            }
            else
            {
                throw new EncryptionException(String.Format("Encryption method {0} is not supported", encryptionMethod));
            }
            return(Encoding.UTF8.GetString(plaintext));
        }
예제 #2
0
        public void Decrypt_NullIV_ThrowsArgumentNullException()
        {
            CbcResult encryptionResult;

            using (var provider1 = new AesCbc())
            {
                encryptionResult = provider1.Encrypt("Hello world");
            }

            using var provider2 = new AesCbc();
            Assert.That(() => provider2.Decrypt(encryptionResult.Cipher, encryptionResult.Key, null), Throws.ArgumentNullException);
        }
예제 #3
0
        public void Decrypt_KeyIsNot32Bytes_ThrowsArgumentException()
        {
            CbcResult encryptionResult;

            using (var provider1 = new AesCbc())
            {
                encryptionResult = provider1.Encrypt("Hello world");
            }

            using var provider2 = new AesCbc();
            Assert.That(() => provider2.Decrypt(encryptionResult.Cipher, new byte[16], encryptionResult.IV), Throws.ArgumentException);
        }
예제 #4
0
        public void Decrypt_CipherLengthNotDivisibleBy16_ThrowsArgumentException()
        {
            CbcResult encryptionResult;

            using (var provider1 = new AesCbc())
            {
                encryptionResult = provider1.Encrypt("Hello world");
            }

            using var provider2 = new AesCbc();
            Assert.That(() => provider2.Decrypt(new byte[new Random().Next(1, 16)], encryptionResult.Key, encryptionResult.IV), Throws.ArgumentException);
        }
예제 #5
0
        public void TestChallenge10()
        {
            var keyStr = "YELLOW SUBMARINE";
            var key    = System.Text.Encoding.ASCII.GetBytes(keyStr);
            var iv     = new HexString("0000000000000000");
            var data   = Convert.FromBase64String(Set2Data.Challenge10Input);

            var decrypted = AesCbc.Decrypt(key, iv.Bytes.ToArray(), data);
            var actual    = System.Text.Encoding.ASCII.GetString(decrypted);

            Assert.AreEqual(Set2Data.Challenge10Solution, actual);
        }
예제 #6
0
        public void TestDecrypt()
        {
            var key      = new HexString("0102030405060708090A0B0C0D0E0F10");
            var iv       = new HexString("1112131415161718191A1B1C1D1E1F20");
            var data     = new HexString("C29B1B0E628232FA5A8F77F88546DF259D8B8B4E73B5D21D9BA1EDB557CAE0A67CA855B59DC1F423A2540EC15377EF70B7750F310C8E40AE68A52E57D478BB60");
            var expected = "Hello World, let's try something longer than just one block.";

            var decrypted = AesCbc.Decrypt(key.Bytes.ToArray(), iv.Bytes.ToArray(),
                                           data.Bytes.ToArray());
            var actual = System.Text.Encoding.ASCII.GetString(decrypted);

            Assert.AreEqual(expected, actual);
        }
예제 #7
0
        public void TestDecryptOneBlock()
        {
            var key      = new HexString("0102030405060708090A0B0C0D0E0F10");
            var iv       = new HexString("1112131415161718191A1B1C1D1E1F20");
            var data     = new HexString("E0A209AC01C9052681925942E0E5EA53");
            var expected = "Hello World";

            var decrypted = AesCbc.Decrypt(key.Bytes.ToArray(), iv.Bytes.ToArray(),
                                           data.Bytes.ToArray());
            var actual = System.Text.Encoding.ASCII.GetString(decrypted);

            Assert.AreEqual(expected, actual);
        }
예제 #8
0
        public void Decrypt_PlainTextStringEncrypted_ResultMatchesPlaintext(string plainText)
        {
            CbcResult encryptionResult;

            using (var provider1 = new AesCbc())
            {
                encryptionResult = provider1.Encrypt(plainText);
            }

            using var provider2 = new AesCbc();
            var plainTextResult = provider2.Decrypt(encryptionResult.Cipher, encryptionResult.Key, encryptionResult.IV);

            Assert.That(plainTextResult, Is.EqualTo(plainText));
        }