C# 加密总结 一些常见的加密方法

一 散列数据 代码如下:

private static string CalculateSHA512Hash(string input)
        {
            byte[] inputBytes = Encoding.UTF8.GetBytes(input);
            SHA512Managed sha512 = new SHA512Managed();
            byte[] outputBytes = sha512.ComputeHash(inputBytes);
            return Convert.ToBase64String(outputBytes);
        }

原始散列对于彩虹表来说也存在漏洞,在彩虹表中,表内的每一条记录都是一串明文对应一种加密算法生成的一串密文。加盐就是指在密码中加入一个盐,这样可以提高密码散列的安全性。修改后的代码如下:

private static string CalculateSHA512Hash(string input,string salt)
      {
          byte[] saltBytes = Convert.FromBase64String(salt);
          byte[] inputBytes = Encoding.UTF8.GetBytes(input);
          byte[] inputWithSaltBytes = new byte[saltBytes.Length + inputBytes.Length];
          Array.Copy(inputBytes, 0, inputWithSaltBytes, 0, inputBytes.Length);
          Array.Copy(saltBytes, 0, inputWithSaltBytes, inputBytes.Length, saltBytes.Length);
          SHA512Managed sha512 = new SHA512Managed();
          byte[] outputBytes = sha512.ComputeHash(inputWithSaltBytes);
          return Convert.ToBase64String(outputBytes);
      }
      private static string GetSalt(int minSaltSize, int maxSaltSize)
      {
          Random random = new Random();
          int saltSize = random.Next(minSaltSize, maxSaltSize);
          byte[] saltBytes = new byte[saltSize];
          RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
          rng.GetNonZeroBytes(saltBytes);
          return Convert.ToBase64String(saltBytes);
      }

二 对称加密

private static string Encrypt(string input, byte[] key, byte[] iv)
      {
          byte[] inputBytes = Encoding.UTF8.GetBytes(input);
          RijndaelManaged rijndael = new RijndaelManaged();
          ICryptoTransform transform = rijndael.CreateEncryptor(key, iv);
          byte[] encrytData = null;
          using (MemoryStream outputStream = new MemoryStream())
          {
              using (CryptoStream inputStream = new CryptoStream(outputStream, transform, CryptoStreamMode.Write))
              {
                  inputStream.Write(inputBytes, 0, inputBytes.Length);
                  inputStream.FlushFinalBlock();
                  encrytData = outputStream.ToArray();
              }
 
          }
          return Convert.ToBase64String(encrytData);
      }
      private static string Decrypt(string input, byte[] key, byte[] iv)
      {
          byte[] inputBytes=Convert.FromBase64String(input);
          RijndaelManaged rijndael = new RijndaelManaged();
          ICryptoTransform transform = rijndael.CreateDecryptor(key, iv);
          byte[] decryptByte;
          using (MemoryStream outputStream=new MemoryStream())
          {
              using (CryptoStream inputStream=new CryptoStream(outputStream,transform,CryptoStreamMode.Write))
              {
                  inputStream.Write(inputBytes, 0, inputBytes.Length);
                  inputStream.FlushFinalBlock();
                  decryptByte = outputStream.ToArray();
              }
          }
          return Encoding.UTF8.GetString(decryptByte);
      }
      private static void GetKeyAndIVFromPasswordAndSalt(string password, byte[] salt, SymmetricAlgorithm symmetricAlgorithm,
          ref byte[] key, ref byte[] iv)
      {
          Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, salt);
          key = rfc2898DeriveBytes.GetBytes(symmetricAlgorithm.KeySize / 8);
          iv = rfc2898DeriveBytes.GetBytes(symmetricAlgorithm.BlockSize / 8);
      }
      private static string GetSalt(int minSaltSize, int maxSaltSize)
      {
          Random random = new Random();
          int saltSize = random.Next(minSaltSize, maxSaltSize);
          byte[] saltBytes = new byte[saltSize];
          RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
          rng.GetNonZeroBytes(saltBytes);
          return Convert.ToBase64String(saltBytes);
      }

调用方式:
            byte[] salt = Convert.FromBase64String(GetSalt(9, 18));
            string password = "Password";
            byte[] key=new byte[0];
            byte[] iv = new byte[0];
            GetKeyAndIVFromPasswordAndSalt(password,salt, new RijndaelManaged(), ref key, ref iv);
            string input = "Wrox Press";
            string encrytText = Encrypt(input, key, iv);
            Console.WriteLine(encrytText);
            string decryptText=Decrypt(encrytText,key,iv);
            Console.WriteLine(decryptText);

只是简单的加密和解密数据是不够的,我们还需要确保数据不被改变,我们可以创建一个消息认证代码来生成一个加密的散列。

private static string GenerateMac(string input, byte[] key)
      {
          HMACSHA512 hmac = new HMACSHA512(key);
          byte[] data= hmac.ComputeHash(Convert.FromBase64String(input));
          return Convert.ToBase64String(data);
      }
      static bool IsMacValid(string input, byte[] key, string savedMac)
      {
          string recalculateMac = GenerateMac(input, key);
          return recalculateMac.Equals(savedMac);
      }

例如我们对数据库中LicenseNumber加密,那么我们就必须修改表结构,修改后如图:

非对称加密:

private static string Encrypt(string input, string publickey)
       {
           RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024);
           rsa.FromXmlString(publickey);
           byte[] encryptData = rsa.Encrypt(Encoding.UTF8.GetBytes(input), true);
           return Convert.ToBase64String(encryptData);
       }
       private static string Decrypt(string input, string privatekey)
       {
           RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024);
           rsa.FromXmlString(privatekey);
           byte[] dencryptData = rsa.Decrypt(Convert.FromBase64String(input), true);
           return Encoding.UTF8.GetString(dencryptData);
       }
       private static void GetkeyXml(out string publicKey, out string privateKey)
       {
           RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024);
           publicKey = rsa.ToXmlString(false);
           privateKey = rsa.ToXmlString(true);
       }

证书加密:

static byte[] SignData(byte[] clearText, X509Certificate2 signingCertificate)
      {
          ContentInfo contentInfo = new ContentInfo(clearText);
          CmsSigner signer = new CmsSigner(signingCertificate);
          SignedCms signedCms = new SignedCms(contentInfo);
          signedCms.ComputeSignature(signer);
          return signedCms.Encode();
      }
      static byte[] ValidateSignatureAndExtractContent(byte[] signedCmsAsBytes, ICollection<string> signingSubjects)
      {
          SignedCms signedCms = new SignedCms();
          signedCms.Decode(signedCmsAsBytes);
          signedCms.CheckSignature(true);
          foreach (SignerInfo signerInfo in signedCms.SignerInfos)
          {
              X509Certificate2 signingCertificate = signerInfo.Certificate;
              signingSubjects.Add(signingCertificate.Subject);
          }
          return signedCms.ContentInfo.Content;
      }
      static byte[] EncryptWithCertificate(byte[] clearText, X509Certificate2 certificate)
      {
          ContentInfo contentInfo = new ContentInfo(clearText);
          EnvelopedCms envelopedCms = new EnvelopedCms(contentInfo);
          CmsRecipient recipient = new CmsRecipient(certificate);
          envelopedCms.Encrypt(recipient);
          return envelopedCms.Encode();
      }
      static byte[] DecryptWithCertificate(byte[] cipherText)
      {
          EnvelopedCms envelopedCms = new EnvelopedCms();
          envelopedCms.Decode(cipherText);
          envelopedCms.Decrypt();
          return envelopedCms.ContentInfo.Content;
      }
      static X509Certificate2 LoadCertificateFromFile(string filename)
      {
          X509Certificate2 certificate = new X509Certificate2();
          certificate.Import(ReadBinaryFile(filename));
          return certificate;
      }
      static byte[] ReadBinaryFile(string filename)
      {
          FileStream f = new FileStream(filename, FileMode.Open, FileAccess.Read);
          int size = (int)f.Length;
          byte[] data = new byte[size];
          size = f.Read(data, 0, size);
          f.Close();
          return data;
      }
      private static X509Certificate2 GetCertificateBySubjectName(string subjectName)
      {
 
          X509Store myStore = new X509Store(StoreName.My, StoreLocation.LocalMachine);
              myStore.Open(OpenFlags.ReadOnly);
              X509Certificate2Collection certificateCollection = myStore.Certificates.Find(X509FindType.FindBySubjectName, subjectName, true);
              X509Certificate2 myCertificate = certificateCollection[0];
              if (myStore != null)
                  myStore.Close();
              return myCertificate;
      }

调用方式:

string input = "Wrox Press";
            byte[] clearTextAsBytes = Encoding.UTF8.GetBytes(input);
            X509Certificate2 serverPublicKeyCertificate = LoadCertificateFromFile("IISExpress.cer");
            X509Certificate2 signingCertificate = GetCertificateBySubjectName("test");
            byte[] signedClearText = SignData(clearTextAsBytes, signingCertificate);
            byte[] encryptedAndSignedData = EncryptWithCertificate(signedClearText, serverPublicKeyCertificate);

byte[] encodedUnencryptedCms = DecryptWithCertificate(encryptedAndSignedData);
            List<string> signingSubjects = new List<string>();
            byte[] receivedClearText = ValidateSignatureAndExtractContent(encodedUnencryptedCms, signingSubjects);
            string unecnryptedString = Encoding.UTF8.GetString(receivedClearText);
            Console.ReadLine();

我的计算机是win8,这里并没有用什么企业级证书,作为测试,我是用win8中IIS来创建自签名证书,然后用mmc来管理证书(http://softbbs.zol.com.cn/1/20_1370.html),所以以上的GetCertificateBySubjectName方法需要修改如下:

private static X509Certificate2 GetCertificateBySubjectName(string subjectName)
        {
            X509Store myStore = new X509Store(StoreName.My, StoreLocation.LocalMachine);
            myStore.Open(OpenFlags.ReadOnly);

X509Certificate2Collection certificateCollection = myStore.Certificates.Find(X509FindType.FindBySubjectName, subjectName, true);
            X509Certificate2 myCertificate;
            if (certificateCollection.Count > 0)
            {
                myCertificate = certificateCollection[0];
            }
            else
            {
                X509Certificate2[] array = new X509Certificate2[myStore.Certificates.Count];
                myStore.Certificates.CopyTo(array, 0);
                myCertificate = array.FirstOrDefault(x => x.FriendlyName.Equals(subjectName));
            }
            if (myStore != null)
                myStore.Close();
            return myCertificate;
        }

 
 
 
标签: C#

C# 加密总结 一些常见的加密方法的更多相关文章

  1. IOS常见的加密方法,常用的MD5和Base64

    iOS代码加密常用加密方式 iOS代码加密常用加密方式,常见的iOS代码加密常用加密方式算法包括MD5加密.AES加密.BASE64加密,三大算法iOS代码加密是如何进行加密的,且看下文 MD5 iO ...

  2. 常见的加密和解密算法—DES

    一.DES加密概述 DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并 ...

  3. 常见的加密和解密算法—MD5

    一.MD5加密概述 Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.该算法的文件号为RFC 13 ...

  4. python常见的加密方式

    1.前言 我们所说的加密方式都是对二进制编码的格式进行加密,对应到python中,则是我妈们的bytes. 所以当我们在Python中进行加密操作的时候,要确保我们的操作是bytes,否则就会报错. ...

  5. python爬虫之常见的加密方式

    前言 数据加密与解密通常是为了保证数据在传输过程中的安全性,自古以来就一直存在,古代主要应用在战争领域,战争中会有很多情报信息要传递,这些重要的信息都会经过加密,在发送到对应的人手上. 现代 ,在网络 ...

  6. android 对称加密,非对称加密 android 常见的加密

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha android 常见的加密 ======== 不可逆加密:md5,sha1 可逆的加密中 ...

  7. 常见的加密和解密算法—AES

    一.AES加密概述 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用 ...

  8. 常见的加密和解密算法—BASE64

    一.BASE64加密和解密概述 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,Base64编码可用于在HTTP环境下传递较长的标识信息.例如,在Java Persistence系 ...

  9. php使用N层加密eval gzinflate str_rot13 base64 破解方法汇总

    php使用N层加密eval gzinflate str_rot13 base64 破解方法汇总 来源:本站转载 作者:佚名 时间:2011-02-14 TAG: 我要投稿 PHP使用eval(gzin ...

随机推荐

  1. C# 获取磁盘容量

    原文:C# 获取磁盘容量 /// 获取指定驱动器的空间总大小(单位为B) /// </summary> /// <param name="str_HardDiskName& ...

  2. Asp.Net MVC4 + Oracle + EasyUI + Bootstrap

    Asp.Net MVC4 + Oracle + EasyUI + Bootstrap --操作数据和验证 本文链接:http://www.cnblogs.com/likeli/p/4234238.ht ...

  3. 【 D3.js 入门系列 --- 9.6 】 生产的包图

    我的个人博客是:www.ourd3js.com csdn博客为:blog.csdn.net/lzhlzz 转载请注明出处,谢谢. 打包图( Pack ).用于包括与被包括的关系,也表示各个对象的权重, ...

  4. Web Service单元测试工具实例介绍之SoapUI

    原文  Web Service单元测试工具实例介绍之SoapUI SoapUI是当前比较简单实用的开源Web Service测试工具,提供桌面应用程序和IDE插件程序两种使用方式.能够快速构建项目和组 ...

  5. HTML5学习资源

    http://www.silverlightchina.net/html/HTML_5/study/ 我们一起学:HTML5标签系列教程(一)-video标签 版权声明:本文博客原创文章.博客,未经同 ...

  6. EnterpriseLibrary 6.0(微软企业库6.0学习笔记) 之Data Access Block 配置和获取链接字符串

    EnterpriseLibrary 的特点是快速开发,融合了微软工程师多年的经验,现在在微软内部有专门的一个小组在完善EnterpriseLibray,最近的更新时间是April 2013. 相关链接 ...

  7. 什么是Solr搜索

    什么是Solr搜索 一.Solr综述   什么是Solr搜索 我们经常会用到搜索功能,所以也比较熟悉,这里就简单的介绍一下搜索的原理. 当然只是介绍solr的原理,并不是搜索引擎的原理,那会更复杂. ...

  8. 配置serv-u access数据库遇到的一些问题

    配置好access数据库后,需要建个web页面来供用户修改密码,但修改时,提示:odbc被占用无法打开. serv-u一直在保持打开access数据库.我们需要将数据库设置默认打开方式为共享,不锁定. ...

  9. async/task/await

    async/task/await三组合是.NET Framework 4.5带给.NET开发者的大礼,合理地使用它,可以提高应用程序的吞吐能力. 但是它的使用有点绕人,如果不正确使用,会带来意想不到的 ...

  10. python实现变参

    使用赋值表达式传递参数,可以颠倒参数列表的顺序.函数的参数提供默认参数 参数可以是变量,也可以是元祖.列表等内置的数据结构 在程序开发中,常常需要传递可变长度的参数.在函数的参数前使用标识符“*”可以 ...