C#加解密

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: MD5://Winform:public static string StringToMD5Hash(string inputString) { MD5CryptoSer...

MD5:

//Winform:
public static string StringToMD5Hash(string inputString)  
{  
    MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();  
    byte[] encryptedBytes = md5.ComputeHash(Encoding.ASCII.GetBytes(inputString));  
    StringBuilder sb = new StringBuilder();  
    for (int i = 0; i < encryptedBytes.Length; i++)  
    {  
        sb.AppendFormat("{0:x2}", encryptedBytes[i]);  

    }  
    return sb.ToString();  
} 

//Webform:
public static string md5(string pwd)
{  
    string md5pwd = FormsAuthentication.HashPasswordForStoringInConfigFile(pwd, "MD5");  
    return md5pwd;  
} 


Base64:

这种编码方式,我曾经在一个项目中用到过,当时的情况是将图片字节数组转化为Base64编码,当时在图片字节转base64编码这个帖子中进行了讨论。这里只给出C#中的实现。

关键代码如下:

DataRow dr = ds.Tables["temp_pic"].Rows[0];
byte[] buffer = (byte[])dr["imagedata1"];
//string base64Str = Convert.ToBase64String(bytes);
//byte[] buffer = Convert.FromBase64String(base64Str);
MemoryStream ms2 = new MemoryStream(buffer, 0, buffer.Length);
ms2.Seek(0, SeekOrigin.Begin);
Image image2 = Image.FromStream(ms2);
pictureBox1.Image = image2;

DES:

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string result = DESStr("guwei4037");
            Console.WriteLine("这是你的加密结果:{0}", result);//1tE8zvi9ouQJNb4FlxlKFQ==

            string src = FromDESStr(result);
            Console.WriteLine("这是我的解密结果:{0}", src);//guwei4037
        }

        /// <summary>
        /// DES加密
        /// </summary>
        /// <param name="src"></param>
        /// <returns></returns>
        public static string DESStr(string src)
        {
            string des = string.Empty;
            byte[] bysData = Encoding.UTF8.GetBytes(src);

            DESCryptoServiceProvider objDESCryptoServiceProvider = new DESCryptoServiceProvider();
            objDESCryptoServiceProvider.Key = Encoding.ASCII.GetBytes("12345678");//密钥
            objDESCryptoServiceProvider.Mode = CipherMode.ECB;
            objDESCryptoServiceProvider.Padding = PaddingMode.None;

            byte[] bysFixSizeData = new byte[(int)Math.Ceiling(bysData.Length / 8.0) * 8];
            Array.Copy(bysData, bysFixSizeData, bysData.Length);

            byte[] bysEncrypted = objDESCryptoServiceProvider.CreateEncryptor().TransformFinalBlock(bysFixSizeData, 0, bysFixSizeData.Length);//加密
            des = Convert.ToBase64String(bysEncrypted);//加密后的字符串
            if (des.Equals("")) des = "error";
            return des;
        }

        /// <summary>
        /// DES解密
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static string FromDESStr(string str)
        {
            string des = string.Empty;
            byte[] inputByteArray = Convert.FromBase64String(str);

            DESCryptoServiceProvider objDESCryptoServiceProvider = new DESCryptoServiceProvider();
            objDESCryptoServiceProvider.Key = Encoding.ASCII.GetBytes("12345678");//密钥
            objDESCryptoServiceProvider.Mode = CipherMode.ECB;
            objDESCryptoServiceProvider.Padding = PaddingMode.None;

            byte[] bysDEcrypted = objDESCryptoServiceProvider.CreateDecryptor().TransformFinalBlock(inputByteArray, 0, inputByteArray.Length);//解密
            byte[] bysFixSizeData = new byte[(int)Math.Ceiling(bysDEcrypted.Length / 8.0) * 8];
            Array.Copy(bysDEcrypted, bysFixSizeData, bysDEcrypted.Length);

            des = Encoding.UTF8.GetString(bysFixSizeData);//解密后的字符串
            if (des.Equals("")) des = "error";
            return des;
        }
    }
}

3DES:

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string dealString = DES3Encrypt("bindreport", "123456788765432112345678");
            Console.WriteLine("dealString is :{0}", dealString);//iTJd2yNItV6/d7v1sWnRBQ==

            string rawString = DES3Decrypt("iTJd2yNItV6/d7v1sWnRBQ==", "123456788765432112345678");
            Console.WriteLine("rawString is :{0}", rawString);//bindreport
        }

        /// <summary>
        /// 3DES加密
        /// </summary>
        /// <param name="data">要加密的数据</param>
        /// <param name="key">密钥</param>
        /// <returns>3DES加密结果</returns>
        public static string DES3Encrypt(string data, string key)
        {
            TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();

            DES.Key = ASCIIEncoding.ASCII.GetBytes(key);
            DES.Mode = CipherMode.ECB;
            DES.Padding = PaddingMode.PKCS7;

            ICryptoTransform DESEncrypt = DES.CreateEncryptor();

            byte[] Buffer = ASCIIEncoding.ASCII.GetBytes(data);
            return Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
        }

        /// <summary>
        /// 3DES解密
        /// </summary>
        /// <param name="data">要解密的数据</param>
        /// <param name="key">密钥</param>
        /// <returns>3DES解密结果</returns>
        public static string DES3Decrypt(string data, string key)
        {
            TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
            DES.Key = ASCIIEncoding.ASCII.GetBytes(key);
            DES.Mode = CipherMode.ECB;
            DES.Padding = System.Security.Cryptography.PaddingMode.PKCS7;

            ICryptoTransform DESDecrypt = DES.CreateDecryptor();
            byte[] Buffer = Convert.FromBase64String(data);
            return ASCIIEncoding.ASCII.GetString(DESDecrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
        }
    }
}

RSA:

namespace ConsoleApplication1
{
    class Program
    {
        static void Main()
        {
            //RSA加解密
            UnicodeEncoding ByteConverter = new UnicodeEncoding();
            byte[] dataToEncrypt = ByteConverter.GetBytes("guwei4037");
            using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
            {
                byte[] encryptedData = RSAEncrypt(dataToEncrypt, RSA.ExportParameters(false), false);
                byte[] decryptedData = RSADecrypt(encryptedData, RSA.ExportParameters(true), false);

                string encryptedString = Convert.ToBase64String(encryptedData);
                string decryptedString = ByteConverter.GetString(decryptedData);

                Console.WriteLine("加密后的结果为:{0}\r\n", encryptedString);
                Console.WriteLine("解密后的结果为:{0}\r\n", decryptedString);
            }

            //RAS数字签名
            RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider();
            RSAParameters Key = RSAalg.ExportParameters(true);
            byte[] signedData = HashAndSignBytes(dataToEncrypt, Key);

            if (VerifySignedHash(dataToEncrypt, signedData, Key))
            {
                Console.WriteLine("数据验证通过");
            }
        }

        /// <summary>
        /// RSA加密
        /// </summary>
        /// <param name="DataToEncrypt">要加密的数据</param>
        /// <param name="RSAKeyInfo">RSA密钥</param>
        /// <param name="DoOAEPPadding"></param>
        /// <returns></returns>
        static byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)
        {
            try
            {
                using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
                {
                    RSA.ImportParameters(RSAKeyInfo);
                    return RSA.Encrypt(DataToEncrypt, DoOAEPPadding);
                }
            }
            catch
            {
                return null;
            }
        }

        /// <summary>
        /// RSA解密
        /// </summary>
        /// <param name="DataToDecrypt">要解密的数据</param>
        /// <param name="RSAKeyInfo">RSA密钥</param>
        /// <param name="DoOAEPPadding"></param>
        /// <returns></returns>
        static byte[] RSADecrypt(byte[] DataToDecrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)
        {
            try
            {
                using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
                {
                    RSA.ImportParameters(RSAKeyInfo);
                    return RSA.Decrypt(DataToDecrypt, DoOAEPPadding);
                }
            }
            catch
            {
                return null;
            }
        }

        /// <summary>
        /// 进行数字签名
        /// </summary>
        /// <param name="DataToSign">要进行数字签名的数据</param>
        /// <param name="Key">RAS参数</param>
        /// <returns>数字签名结果</returns>
        static byte[] HashAndSignBytes(byte[] DataToSign, RSAParameters Key)
        {
            try
            {
                RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
                RSA.ImportParameters(Key);
                return RSA.SignData(DataToSign, new SHA1CryptoServiceProvider());
            }
            catch
            {
                return null;
            }
        }

        /// <summary>
        /// 验证数字签名
        /// </summary>
        /// <param name="DataToVerify">要进行验证的数据</param>
        /// <param name="SignedData">数字签名</param>
        /// <param name="Key">RAS参数</param>
        /// <returns>验证数字签名结果</returns>
        static bool VerifySignedHash(byte[] DataToVerify, byte[] SignedData, RSAParameters Key)
        {
            try
            {
                RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider();
                RSAalg.ImportParameters(Key);
                return RSAalg.VerifyData(DataToVerify, new SHA1CryptoServiceProvider(), SignedData);
            }
            catch
            {
                return false;
            }
        }
    }
}



目录
相关文章
|
7月前
|
算法 C# 数据安全/隐私保护
C# | AES加解密 - 快速上手
这个标准用来替代原先的DES(Data Encryption Standard),已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一 。 AES作为计算机领域最常见的通用加密算法之一,称之为对称加密算法中的一哥也丝毫不为过,其重要程度不言而喻。 本文将极尽详细的讲解C#实现AES加密和解密的全过程。
384 0
C# | AES加解密 - 快速上手
|
存储 安全 算法
C#加解密
C#加解密
161 0
|
安全 算法 C#
C# 中使用 RSA加解密算法
一、什么是RSA   RSA公开密钥密码体制。所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。      在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。
2307 0
|
7月前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
204 3
|
27天前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
32 3
|
3月前
|
API C#
C# 一分钟浅谈:文件系统编程
在软件开发中,文件系统操作至关重要。本文将带你快速掌握C#中文件系统编程的基础知识,涵盖基本概念、常见问题及解决方法。文章详细介绍了`System.IO`命名空间下的关键类库,并通过示例代码展示了路径处理、异常处理、并发访问等技巧,还提供了异步API和流压缩等高级技巧,帮助你写出更健壮的代码。
46 2