Esempio n. 1
0
 public Stream EncryptStream(Stream sPlainText, byte[] pbKey, byte[] pbIV)
 {
     return(StandardAesEngine.CreateStream(sPlainText, true, pbKey, pbIV));
 }
Esempio n. 2
0
 public Stream DecryptStream(Stream sEncrypted, byte[] pbKey, byte[] pbIV)
 {
     return(StandardAesEngine.CreateStream(sEncrypted, false, pbKey, pbIV));
 }
Esempio n. 3
0
        private static Stream CreateStream(Stream s, bool bEncrypt, byte[] pbKey, byte[] pbIV)
        {
            StandardAesEngine.ValidateArguments(s, bEncrypt, pbKey, pbIV);

            byte[] pbLocalIV = new byte[16];
            Array.Copy(pbIV, pbLocalIV, 16);

            byte[] pbLocalKey = new byte[32];
            Array.Copy(pbKey, pbLocalKey, 32);

#if KeePass2PCL
            var provider = WinRTCrypto.SymmetricKeyAlgorithmProvider.
                           OpenAlgorithm(SymmetricAlgorithm.AesCbcPkcs7);
            var key = provider.CreateSymmetricKey(pbLocalKey);
            if (bEncrypt)
            {
                var encryptor = WinRTCrypto.CryptographicEngine.CreateEncryptor(
                    key, pbLocalIV);
                return(new CryptoStream(s, encryptor, CryptoStreamMode.Write));
            }
            else
            {
                var decryptor = WinRTCrypto.CryptographicEngine.CreateDecryptor(
                    key, pbLocalIV);
                return(new CryptoStream(s, decryptor, CryptoStreamMode.Read));
            }
#else
#if !KeePassRT
            RijndaelManaged r = new RijndaelManaged();
            if (r.BlockSize != 128)            // AES block size
            {
                Debug.Assert(false);
                r.BlockSize = 128;
            }

            r.IV      = pbLocalIV;
            r.KeySize = 256;
            r.Key     = pbLocalKey;
            r.Mode    = m_rCipherMode;
            r.Padding = m_rCipherPadding;

            ICryptoTransform iTransform = (bEncrypt ? r.CreateEncryptor() : r.CreateDecryptor());
            Debug.Assert(iTransform != null);
            if (iTransform == null)
            {
                throw new SecurityException("Unable to create Rijndael transform!");
            }

            return(new CryptoStream(s, iTransform, bEncrypt ? CryptoStreamMode.Write :
                                    CryptoStreamMode.Read));
#else
            AesEngine                 aes = new AesEngine();
            CbcBlockCipher            cbc = new CbcBlockCipher(aes);
            PaddedBufferedBlockCipher bc  = new PaddedBufferedBlockCipher(cbc,
                                                                          new Pkcs7Padding());
            KeyParameter     kp    = new KeyParameter(pbLocalKey);
            ParametersWithIV prmIV = new ParametersWithIV(kp, pbLocalIV);
            bc.Init(bEncrypt, prmIV);

            IBufferedCipher cpRead  = (bEncrypt ? null : bc);
            IBufferedCipher cpWrite = (bEncrypt ? bc : null);
            return(new CipherStream(s, cpRead, cpWrite));
#endif
#endif
        }