Ejemplo n.º 1
0
        public bool Encrypt(string src, string des, string pass, int et, int padMode, int ciMode)
        {
            SymmetricAlgorithm EncryptionType;

            if (et == 0)
            {
                EncryptionType = new RijndaelManaged();
            }
            else
            {
                EncryptionType = new TripleDESCryptoServiceProvider();
            }

            //set padding mode
            EncryptionType.Padding = padMode == 0 ? PaddingMode.PKCS7 : PaddingMode.ISO10126;
            //set mode of operation
            EncryptionType.Mode = ciMode == 0 ? CipherMode.CBC : CipherMode.CFB;
            //generate random Initial Vector
            EncryptionType.GenerateIV();

            Tool t   = new Tool();
            var  key = Encoding.ASCII.GetBytes(t.Expand(pass, EncryptionType.KeySize / 8));

            EncryptionType.Key = key;

            ICryptoTransform transform = EncryptionType.CreateEncryptor();

            //prepare header
            byte[] LenKey          = new byte[4];
            byte[] LenIV           = new byte[4];
            byte[] mPadMode        = new byte[4];
            byte[] mEncryptionType = new byte[4];
            byte[] mModeOperation  = new byte[4];

            LenKey          = BitConverter.GetBytes(EncryptionType.KeySize);
            LenIV           = BitConverter.GetBytes(EncryptionType.IV.Length);
            mPadMode        = BitConverter.GetBytes(padMode);
            mEncryptionType = BitConverter.GetBytes(et);
            mModeOperation  = BitConverter.GetBytes(ciMode);


            //write encrypted data to file
            using (FileStream outFs = new FileStream(des, FileMode.Create))
            {
                outFs.Write(mEncryptionType, 0, 4);
                outFs.Write(mModeOperation, 0, 4);
                outFs.Write(mPadMode, 0, 4);
                outFs.Write(LenKey, 0, 4);
                outFs.Write(LenIV, 0, 4);
                outFs.Write(EncryptionType.IV, 0, EncryptionType.IV.Length);

                using (CryptoStream outStreamEncrypted = new CryptoStream(outFs, transform, CryptoStreamMode.Write))
                {
                    int    blockSizeBytes = EncryptionType.BlockSize / 8;
                    byte[] data           = new byte[blockSizeBytes];
                    int    bytesRead      = 0;
                    int    count          = 0;
                    int    offset         = 0;
                    using (FileStream inFs = new FileStream(src, FileMode.Open))
                    {
                        do
                        {
                            count   = inFs.Read(data, 0, blockSizeBytes);
                            offset += count;
                            outStreamEncrypted.Write(data, 0, count);
                            bytesRead += blockSizeBytes;
                        }while (count > 0);
                        inFs.Close();
                    }
                    outStreamEncrypted.FlushFinalBlock();
                    outStreamEncrypted.Close();
                }
                outFs.Close();
            }


            return(true);
        }