C# Encryption with AES256-CBC, SHA512 Hash, 10-L Salt

Cryptography
User avatar
hidden
Posts: 24
Joined: Wed Jan 17, 2018 9:09 pm

C# Encryption with AES256-CBC, SHA512 Hash, 10-L Salt

Postby hidden » Wed Aug 22, 2018 7:08 pm

Code: Select all

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Security.Cryptography;
using System.Runtime.InteropServices;

namespace DarkSoft.OS.SecurityModel
{
    public class FileSecurity
    {
        public void FileSecurtiy() {

        }

        protected byte[] retEncFReq(byte[] cont, byte[] pwd)
        {
            byte[] endResult = null;
            byte[] salt = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            using (MemoryStream ms = new MemoryStream())
            {
                using (RijndaelManaged alg = new RijndaelManaged())
                {
                    alg.KeySize = 256;
                    alg.BlockSize = 128;
                    var key = new Rfc2898DeriveBytes(pwd, salt, 1000);
                    alg.Key = key.GetBytes(alg.KeySize / 8);
                    alg.IV = key.GetBytes(alg.BlockSize / 8);
                    alg.Mode = CipherMode.CBC;
                    using (CryptoStream cs = new CryptoStream(ms, alg.CreateEncryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(cont, 0, cont.Length);
                        cs.Close();
                    }
                }
                endResult = ms.ToArray();
            }
            return endResult;
        }
        protected byte[] retDecFReq(byte[] cont, byte[] pwd)
        {
            byte[] endResult = null;
            byte[] salt = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            using (MemoryStream ms = new MemoryStream())
            {
                using (RijndaelManaged alg = new RijndaelManaged())
                {
                    alg.KeySize = 256;
                    alg.BlockSize = 128;
                    var key = new Rfc2898DeriveBytes(pwd, salt, 1000);
                    alg.Key = key.GetBytes(alg.KeySize / 8);
                    alg.IV = key.GetBytes(alg.BlockSize / 8);
                    alg.Mode = CipherMode.CBC;
                    using (CryptoStream cs = new CryptoStream(ms, alg.CreateDecryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(cont, 0, cont.Length);
                        cs.Close();
                    }
                }
                endResult = ms.ToArray();
            }
            return endResult;
        }
        public string retEncTReq(string cont, byte[] passWord)
        {
            byte[] cipherText = null;
            string cipHerText = null;
            byte[] salt = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            using (MemoryStream ms = new MemoryStream())
            {
                using (RijndaelManaged alg = new RijndaelManaged())
                {
                    alg.KeySize = 256;
                    alg.BlockSize = 128;
                    var key = new Rfc2898DeriveBytes(passWord, salt, 1000);
                    alg.Key = key.GetBytes(alg.KeySize / 8);
                    alg.IV = key.GetBytes(alg.BlockSize / 8);
                    alg.Mode = CipherMode.CBC;
                    using (MemoryStream msEncrypt = new MemoryStream())
                    {
                        using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, alg.CreateEncryptor(), CryptoStreamMode.Write))
                        {
                            using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                            {
                                swEncrypt.Write(cont);
                            }
                            cipherText = msEncrypt.ToArray();
                        }
                    }
                }
            }
            return Convert.ToBase64String(cipherText);
        }
        public string retDecTReq(byte[] cont, byte[] passWord)
        {
            byte[] cipherText = null;
            string cipHerText = null;
            byte[] salt = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            using (MemoryStream ms = new MemoryStream(cont))
            {
                using (RijndaelManaged alg = new RijndaelManaged())
                {
                    alg.KeySize = 256;
                    alg.BlockSize = 128;
                    var key = new Rfc2898DeriveBytes(passWord, salt, 1000);
                    alg.Key = key.GetBytes(alg.KeySize / 8);
                    alg.IV = key.GetBytes(alg.BlockSize / 8);
                    alg.Mode = CipherMode.CBC;
                    using (MemoryStream msDecrypt = new MemoryStream(cont))
                    {
                        using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, alg.CreateDecryptor(), CryptoStreamMode.Read))
                        {
                            using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                            {
                                cipHerText = srDecrypt.ReadToEnd();
                            }
                        }
                    }
                }
            }
            return cipHerText;
        }
        public string encText(string text, string password)
        {
            byte[] pwd = Encoding.UTF8.GetBytes(password);
            pwd = SHA512.Create().ComputeHash(pwd);
            string btsEncrypted = retEncTReq(text, pwd);
            return btsEncrypted;
        }
        public string decText(string text, string password)
        {
            byte[] cont = Convert.FromBase64String(text);
            byte[] pwd = Encoding.UTF8.GetBytes(password);
            pwd = SHA512.Create().ComputeHash(pwd);
            string btsEncrypted = retDecTReq(cont, pwd);
            return btsEncrypted;
        }
        public void decFile(string file, string password)
        {
            byte[] bytesToBeDecrypted = File.ReadAllBytes(file);
            byte[] passwordBytes = Encoding.UTF8.GetBytes(password);
            passwordBytes = SHA512.Create().ComputeHash(passwordBytes);

            byte[] bytesDecrypted = retDecFReq(bytesToBeDecrypted, passwordBytes);

            File.WriteAllBytes(file, bytesDecrypted);
            string extension = System.IO.Path.GetExtension(file);
            string result = file.Substring(0, file.Length - extension.Length);
            System.IO.File.Move(file, result);
        }
        public void encFile(string file, string password, string extension)
        {
            byte[] bytesToBeEncrypted = File.ReadAllBytes(file);
            byte[] passwordBytes = Encoding.UTF8.GetBytes(password);

            passwordBytes = SHA512.Create().ComputeHash(passwordBytes);

            byte[] bytesEncrypted = retEncFReq(bytesToBeEncrypted, passwordBytes);

            File.WriteAllBytes(file, bytesEncrypted);
            System.IO.File.Move(file, file + extension);
        }
        public string getFileChecksum(string filename)
        {
            using (SHA512Cng md5check = new SHA512Cng())
            {
                using (var stream = File.OpenRead(filename))
                {
                    ConvertType cngInfo = new ConvertType();
                    return cngInfo.byteArrayToString(md5check.ComputeHash(stream));
                }
            }
        }
        public bool isFileHashMatches(string filename, string hash)
        {
            string fileHash = getFileChecksum(filename);
            if (hash.Length == fileHash.Length && hash == fileHash)
            {
                return true;
            }
            else { return false; }
        }
        public string calculateHash_SHA512(string text)
        {
            byte[] tmp = Encoding.ASCII.GetBytes(text);
            using (SHA512Cng shaCalc = new SHA512Cng())
            {
                ConvertType cngInfo = new ConvertType();
                return cngInfo.byteArrayToString(shaCalc.ComputeHash(tmp));
            }
        }
        public bool isCalculateHashMatches(string origtext, string currentHash)
        {
            string origHash = calculateHash_SHA512(origtext);
            if (currentHash == origHash && currentHash.Length == origtext.Length)
            {
                return true;
            }
            else { return false; }
        }


    }
    public class ConvertType
    {
        public string byteArrayToString(byte[] array)
        {
            int i;
            StringBuilder sOutput = new StringBuilder(array.Length);
            for (i = 0; i < array.Length - 1; i++)
            {
                sOutput.Append(array[i].ToString("X2"));
            }
            return sOutput.ToString();
        }
        public string stringArrayToString(string[] arraystr)
        {
            StringBuilder result = new StringBuilder();
            foreach (string value in arraystr)
            {
                result.Append(value);
                result.Append(' ');
            }
            return result.ToString();
        }
    }
}

Return to “Cryptography”