.Net 加密解密组件工具类 System.Security.Cryptography.Algorith

        在.NET Framework出现之前,如果我们需要进行加密的话,我们只有各种较底层的技术可以选择,如Microsoft Crypto API、Crypto++、Openssl等等,其用法相当复杂。而在 .NET Framework中,这些复杂内容(原来独立的API和SDK)已经被封装合并在一个.NET框架类中,这对于程序开发人员非常有利。它将CryptoAPI改编进.NET的System.Security.Cryptography命名空间,使其包含这些与加密、签名相关的类。利用这些类,我们就可以很方便地使用各种广泛使用的算法,包括RSA, DSA, Rijndael,** SHA和其他Hash算法**等等。,使密码服务摆脱了SDK平台的神秘性,变成了简单的.NET名字空间的使用。

System.Security.Cryptography.Algorith

加密算法主要分为:对称加密算法、非对称加密算法和散列算法(哈希算法)

1.对称密钥密码算法:

对称密钥密码算法所用的加密密钥和解密密钥通常是相同的,即使不同也可以很容易地由其中的任意一个推导出另一个。在此算法中,对密钥的保密性在这类应用中的重中之重!加、解密双方所用的密钥都要保守秘密。由于计算速度快,对称加密算法被广泛应用于大量数据,如文件的加密过程中。
对称加密要注意的地方主要就是块加密模式(这个也不是对称独有的,在非对称中也存在模式概念)!
使用分组密码算法数字签名常用的加密标准有:DES,Tripl-DES,RC2,RC4,CAST等。

2.非对称加密算法
非对称密钥密码算法又称公共钥匙加密算法,意指加解密的密钥是不一样的,使用到两个密钥:公开密钥和私有密钥,数据加密一个,数据解密一个!即如果用公开密钥对数据进行加密,只有用对应的私有密钥才能进行解密;如果用私有密钥对数据进行加密,则只有用对应的公开密钥才能解密。加密方式的安全性要比对称的安全些,但安全不是绝对的!这种算法最主要运用场景就是数字签名!像RSA/DSA!
使用公钥密码算法进行数字签名通用的加密标准有: RSA,DSA等。

3.加密哈希算法(散列算法)
哈希算法也称作散列算法或报文摘要(digital digest)。哈希算法将任意长度数据转化为固定长度字符序列。简单点就是一种变换,使变换后的数据在一定小概率情况下代表变换前数据的“标签”,这个标签就是散列,变换就是散列算法,往往这些算法是公开的、不可逆的!因为算法公开的,为了防止大家谁都可以对源数据进行散列,所以出现增加一个KEY的变形散列算法(HMAC算法)。哈希结果是始终维一的。任意二个序列的哈希结果是不同的。哈希结果亦称为数字指纹(Finger Print),它有固定的长度,且相同的明文摘要必定一致。这样这串摘要使可成为验证明文是否是"真身"的"指纹"了。
散列主要用在对数据有效性的验证方面。例如,BT就是用SHA1验证收到数据块是否有效的,Email服务器的登录就有一中名为HMACMD5的验证模式!

特点:

  • 算法公开,散列的算法是公开的,也就是说谁都可以通过算法进行输入散列化。
  • 信息指纹,对相同的输入信息进行散列,得到的结果是一致的(这也是信息指纹的由来)。
  • 不可逆 (将一个已经被散列的输出无法通过计算还原原本的输入)。tag:但是现在也有网上通过大数据收集已有的散列,进行库存储,可以通过查库得到原本的输入。
  • 定长,对不同长度的输入信息进行散列,得到的输出永远是定长的(128个二进制位,32个十六进制字符)。

作用:

  • 对于用户敏感信息的保密.(比如用户密码)   
    tag:把一些不方便明文展示的用户隐私信息通过散列进行密文隐藏,这样被窃取后不会导致隐私泄露。
  • 搜索引擎
    tag:在搜索引擎中,搜索引擎会进行猜词搜索,就是取搜索词汇中的关键字进行hash匹配,如果匹配结果一致,就显示相应的搜索结果。
  • 版权维护
    tag:将正版的文件进行hash存储作为正版标识。当有用户进行文件上传时,检测文件的hash值与库中的hash进行匹配,如果不一致,则是侵权行为。
  • 数字签名
    tag:这在支付领域中用的相当频繁,由于通常网络数据并不小,直接对数据进行RSA加密,这是相当吃性能的行为,那么通常我们就将数据进行hash散列,得到固定的输出数据,再进行加密,这一部分被加密的hash散列数据就是数据的数字签名。通常我们将这个签名信息对原始数据的hash进行匹配识别,以防止数据被篡改。

哈希算法数字签字通用的加密标准有: SHA-1,MD5等。

使用方法:

1.Nuget中引用 System.Security.Cryptography.Algorith

.Net 加密解密组件工具类 System.Security.Cryptography.Algorith_第1张图片

2.新建工具类Securityhelper

 public class SecurityHelper
 {
        #region md5加密

        /// 
        /// MD5 16位加密,不可逆
        /// 
        ///  
        public static string MD5Encrypt16Bit(string password)
        {
            MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
            string str = BitConverter.ToString(md5.ComputeHash(Encoding.UTF8.GetBytes(password)), 4, 8);
            str = str.Replace("-", "");
            return str;
        }

        /// 
        ///  MD5 32位加密,不可逆
        /// 
        ///  
        public static string MD5Encrypt32Bit(string password)
        {
            string pwd = "";
            System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
            byte[] str = md5.ComputeHash(Encoding.UTF8.GetBytes(password));
            for (int i = 0; i < str.Length; i++) // 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得
                pwd = pwd + str[i].ToString("X"); // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符 
            return pwd;
        }

        /// 
        ///  MD5 64位加密,不可逆
        /// 
        ///  
        public static string MD5Encrypt64Bit(string password)
        {
            System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
            byte[] str = md5.ComputeHash(Encoding.UTF8.GetBytes(password));
            return Convert.ToBase64String(str);
        }

        #endregion

        #region

        /// 
        /// SHA-1
        /// 
        ///  
        public static string SHA_1(string str)
        {
            System.Security.Cryptography.SHA1CryptoServiceProvider SHA1CSP =
                new System.Security.Cryptography.SHA1CryptoServiceProvider();
            byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(str);
            byte[] bytHash = SHA1CSP.ComputeHash(bytValue);
            SHA1CSP.Clear();
            string hashstr = "", tempstr = "";
            for (int counter = 0; counter < bytHash.Length; counter++)
            {
                long i = bytHash[counter] / 16;
                if (i > 9)
                    tempstr = ((char)(i - 10 + 0x41)).ToString();
                else
                    tempstr = ((char)(i + 0x30)).ToString();
                i = bytHash[counter] % 16;
                if (i > 9)
                    tempstr += ((char)(i - 10 + 0x41)).ToString();
                else
                    tempstr += ((char)(i + 0x30)).ToString();
                hashstr += tempstr;
            }

            return hashstr;
        }

        /// 
        /// SHA-256
        /// 
        ///  
        public static string SHA_256(string str)
        {
            System.Security.Cryptography.SHA256CryptoServiceProvider SHA256CSP =
                new System.Security.Cryptography.SHA256CryptoServiceProvider();
            byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(str);
            byte[] bytHash = SHA256CSP.ComputeHash(bytValue);
            SHA256CSP.Clear();
            string hashstr = "", tempstr = "";
            for (int counter = 0; counter < bytHash.Length; counter++)
            {
                long i = bytHash[counter] / 16;
                if (i > 9)
                    tempstr = ((char)(i - 10 + 0x41)).ToString();
                else
                    tempstr = ((char)(i + 0x30)).ToString();
                i = bytHash[counter] % 16;
                if (i > 9)
                    tempstr += ((char)(i - 10 + 0x41)).ToString();
                else
                    tempstr += ((char)(i + 0x30)).ToString();
                hashstr += tempstr;
            }

            return hashstr;
        }

        /// 
        /// SHA-384
        /// 
        ///  
        public static string SHA_384(string str)
        {
            System.Security.Cryptography.SHA384CryptoServiceProvider SHA384CSP =
                new System.Security.Cryptography.SHA384CryptoServiceProvider();
            byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(str);
            byte[] bytHash = SHA384CSP.ComputeHash(bytValue);
            SHA384CSP.Clear();
            string hashstr = "", tempstr = "";
            for (int counter = 0; counter < bytHash.Length; counter++)
            {
                long i = bytHash[counter] / 16;
                if (i > 9)
                    tempstr = ((char)(i - 10 + 0x41)).ToString();
                else
                    tempstr = ((char)(i + 0x30)).ToString();
                i = bytHash[counter] % 16;
                if (i > 9)
                    tempstr += ((char)(i - 10 + 0x41)).ToString();
                else
                    tempstr += ((char)(i + 0x30)).ToString();
                hashstr += tempstr;
            }

            return hashstr;
        }

        /// 
        /// SHA-512
        /// 
        ///  
        public static string SHA_512(string str)
        {
            System.Security.Cryptography.SHA512CryptoServiceProvider SHA512CSP =
                new System.Security.Cryptography.SHA512CryptoServiceProvider();
            byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(str);
            byte[] bytHash = SHA512CSP.ComputeHash(bytValue);
            SHA512CSP.Clear();
            string hashstr = "", tempstr = "";
            for (int counter = 0; counter < bytHash.Length; counter++)
            {
                long i = bytHash[counter] / 16;
                if (i > 9)
                    tempstr = ((char)(i - 10 + 0x41)).ToString();
                else
                    tempstr = ((char)(i + 0x30)).ToString();
                i = bytHash[counter] % 16;
                if (i > 9)
                    tempstr += ((char)(i - 10 + 0x41)).ToString();
                else
                    tempstr += ((char)(i + 0x30)).ToString();
                hashstr += tempstr;
            }

            return hashstr;
        }

        #endregion
 }

3.调用代码:

class Program
{
        static void Main(string[] args)
        {
            var context = "123456789";
            var aa=DBB.Authorize.New.Common.SecurityHelper.MD5Encrypt32Bit(context);
            Console.WriteLine(aa);
            aa =DBB.Authorize.New.Common.SecurityHelper.MD5Encrypt64Bit(context);
            Console.WriteLine(aa);
            aa = DBB.Authorize.New.Common.SecurityHelper.SHA_1(context);
            Console.WriteLine(aa);
            Console.ReadLine();
        }
}

4.输出日志:

大家好,我是MiniFat,感谢各位小伙伴点赞、收藏和评论,文章持续更新,我们下期再见!

 参考链接:

.net中C#命名空间System.Security.Cryptography简记_天富儿的博客-CSDN博客_system.security.cryptography

官方介绍链接

System.Security.Cryptography 命名空间 | Microsoft Docs

你可能感兴趣的:(.net,microsoft,c#,算法,加密解密)