详解ASP.NET中加密和解密的方法

散列运算

mscorlib.dll下的System.Security.Cryptography下:

  • 抽象类HashAlgorithm

    • 抽象类MD5

      • MD5CryptoServiceProvider
    • SHA1
      • SHA1CryptoServiceProvider密封类:调用Windows Crypto API
      • SHA1Managed普通类:用托管代码写的
    • SHA256
      • SHA256CryptoServiceProvider
      • SHA256Managed
    • SHA384
    • SHA512

对字节数组或流散列运算

    class Program
    {
        static void Main(string[] args)
        {
            string str = "Hello World";
            HashAlgorithm hashAlgorithm = HashAlgorithm.Create(HashAlgorithmType.SHA1);
            byte[] data = Encoding.Default.GetBytes(str);
            byte[] digest = hashAlgorithm.ComputeHash(data);
            foreach (byte b in digest)
            {
                Console.Write("{0:X}",b);
            }
            Console.ReadKey();
        }
    }

    public class HashAlgorithmType
    {
        public const string SHA1 = "SHA1";
        public const string SHA256 = "SHA256";
        public const string SHA384 = "SHA384";
        public const string SHA512 = "SHA512";
        public const string MD5 = "MD5";
    }

密匙散列运算

string key = "secret key";
byte[] data = Encoding.Default.GetBytes(key);
KeyedHashAlgorithm kha = new HMACSHA1();
byte[] digest = kha.ComputeHash(data);
foreach (byte b in digest)
{
    Console.Write("{0:x}",b);
}

对称加密和解密

  • SymmetricAlgorithm

    • DES

      • DESCryptoServiceProvider
    • TripleDES
      • TripleDESCryptoServiceProvider
    • Rijndael
      • RijindaelManaged
    • RC2
      • RC2CryptoServiceProvider

IV:Initialization vector初始化向量:

  • 为了解决加密字符串加密后仍然有重复部分,引入IV,加密字符串即使有重复,也会被打乱。
  • IV值可以随意指定,但长度固定,通常为64位byte类型
  • 密匙长度也是固定的,通常为128位或196位byte类型

使用Encoding类将字符串转换为byte[]:

  • 如果使用UTF8,会变长编码

加密解密方法:

  • 加密方法:CreateEncryptor(),返回ICryptoTransform接口类型
  • 解密方法:CreateDecryptor(),返回ICrtyptoTransform接口类型

明文流和加密流的转换:

    public CryptoStream(Stream stream, ICryptoTransform transform, CryptoStreamMode mode)

    class Program
    {
        static void Main(string[] args)
        {
            #region 对称加密和解密

            string key = "secret key";
            string str = "Hello World";

            //加密
            string encryptedText = SymmetricCryptoHelper.Encrypt(str, key);
            Console.WriteLine(encryptedText);

            //解密
            string clearText = SymmetricCryptoHelper.Decrypt(encryptedText, key);
            Console.WriteLine(clearText);

            Console.ReadKey();

            #endregion
        }
    }

    //对称加密帮助类
    public class SymmetricCryptoHelper
    {
        private ICryptoTransform encryptor;  //加密器对象
        private ICryptoTransform decryptor; //解密器对象
        private const int BufferSize = 1024;

        public SymmetricCryptoHelper(string algorithmName, byte[] key)
        {
            SymmetricAlgorithm provider = SymmetricAlgorithm.Create(algorithmName);
            provider.Key = key;
            provider.IV = new byte[] { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };

            encryptor = provider.CreateEncryptor();
            decryptor = provider.CreateDecryptor();
        }

        public SymmetricCryptoHelper(byte[] key) : this("TripleDES", key){}

        //加密算法
        public string Encrypt(string clearText)
        {
            //创建明文流
            byte[] clearBuffer = Encoding.UTF8.GetBytes(clearText);
            //byte[] clearBuffer = Encoding.Default.GetBytes(clearText);
            MemoryStream clearStream = new MemoryStream(clearBuffer);

            //创建空的密文流
            MemoryStream encryptedStream = new MemoryStream();

            //明文流和密文流转换流,准备写到密文流中
            CryptoStream cryptoStream = new CryptoStream(encryptedStream, encryptor, CryptoStreamMode.Write); 

            int bytesRead = 0;
            byte[] buffer = new byte[BufferSize];
            do
            {
                //读取明文流到buffer中
                bytesRead = clearStream.Read(buffer, 0, BufferSize);
                //通过CryptoStream将buffer中的明文流字节数组写到明文流中
                cryptoStream.Write(buffer, 0, bytesRead);
            } while (bytesRead > 0);

            cryptoStream.FlushFinalBlock();

            //获取加密后的字节数组
            buffer = encryptedStream.ToArray();

            //将加密后的字节数组转换成字符串
            string encryptedText = Convert.ToBase64String(buffer);
            return encryptedText;
        }

        //解密算法
        public string Decrypt(string encryptedText)
        {
            //把加密字符串转换为加密字节数组
            byte[] encryptedBuffer = Convert.FromBase64String(encryptedText);
            //创建密文流
            Stream encryptedStream = new MemoryStream(encryptedBuffer);

            //创建空的明文流
            MemoryStream clearStream = new MemoryStream();

            //创建明文流和密文流的转化流,读取密文流
            CryptoStream cryptoStream = new CryptoStream(encryptedStream, decryptor, CryptoStreamMode.Read);

            int bytesRead = 0;
            byte[] buffer = new byte[BufferSize];

            do
            {
                //通过CryptoStream读取密文流到Buffer
                bytesRead = cryptoStream.Read(buffer, 0, BufferSize);
                //把Buffer中的密文流写到明文流中
                clearStream.Write(buffer, 0, bytesRead);
            } while (bytesRead > 0);

            //将明文流转换成字节数组
            buffer = clearStream.GetBuffer();

            string clearText = Encoding.UTF8.GetString(buffer, 0, (int)clearStream.Length);
            //string clearText = Encoding.Default.GetString(buffer, 0, (int)clearStream.Length);
            return clearText;
        }

        //密匙加密
        public static string Encrypt(string clearText, string key)
        {
            byte[] keyData = new byte[16]; //TripleDES密匙固定长度为16个字节

            //把密匙字符串转换成字节数组
            byte[] sourceData = Encoding.Default.GetBytes(key);
            int copyBytes = 16;
            if (sourceData.Length < 16)
            {
                copyBytes = sourceData.Length;
            }

            //把密匙数组复制到keyData字节数组中
            Array.Copy(sourceData,keyData,copyBytes);

            SymmetricCryptoHelper helper = new SymmetricCryptoHelper(keyData);
            return helper.Encrypt(clearText);
        }

        //密匙解密
        public static string Decrypt(string encryptedText, string key)
        {
            byte[] keyData = new byte[16];
            byte[] sourceData = Encoding.Default.GetBytes(key);
            int copyBytes = 16;
            if (sourceData.Length < 16)
            {
                copyBytes = sourceData.Length;
            }
            Array.Copy(sourceData,keyData,copyBytes);

            SymmetricCryptoHelper helper = new SymmetricCryptoHelper(keyData);
            return helper.Decrypt(encryptedText);
        }
    }

非对称加密

  • AsymmetricAlgorithm

    • RSA

      • RSACryptoServiceProvider
    • DSA
      • DSACryptoServiceProvider:只能进行认证模式,即数字签名

对称加密中的密匙:

密匙为由开发者设定的字符串

非对称加密中的密匙:

  • 通常是自动生成,不同的算法有不同的密匙格式
  • 在创建RSACryptoServiceProvider实例时,会自动创建一个公/私密匙对。在实例上调用ToXmlString()方法获得。
RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
string publicPrivate = provider.ToXmlString(true);//获得公/私匙对
//string publicOnly = provider.ToXmlString(false); //只获得公匙
Console.Write(publicPrivate);
Console.ReadKey();

非对称加密帮助类

    //非对称加密帮助类
    public class RSACryptoHelper
    {
        //加密
        public static string Encrypt(string publicKeyXml, string plainText)
        {
            RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
            provider.FromXmlString(publicKeyXml); //使用公匙初始化对象
            byte[] plainData = Encoding.Default.GetBytes(plainText);
            byte[] encryptedData = provider.Encrypt(plainData, true);
            return Convert.ToBase64String(encryptedData);
        }

        //解密
        public static string Decrypt(string privateKeyXml, string encryptedText)
        {
            RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
            provider.FromXmlString(privateKeyXml);
            byte[] encryptedData = Convert.FromBase64String(encryptedText);
            byte[] plainData = provider.Decrypt(encryptedData, true);
            string plainText = Encoding.Default.GetString(plainData);
            return plainText;
        }
    }

数字签名

RSACryptoServiceProvider或DSACryptoServiceProvider
SignData()对摘要进行签名,并返回签名后的摘要。
VerifyData()得出本地摘要,并解密传递进来的原始摘要,对比返回bool类型结果。

数字签名帮助类

    public class RSACryptoHelper
    {
        public static string SignData(string plainText, string privateKeyXml)
        {
            RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
            provider.FromXmlString(privateKeyXml);

            byte[] plainData = Encoding.Default.GetBytes(plainText);
            //设置获取摘要的算法
            HashAlgorithm sha1 = HashAlgorithm.Create("SHA1");
            //获取签名过的摘要,是使用私匙加密过的摘要
            byte[] signedDigest = provider.SignData(plainData, sha1);
            return Convert.ToBase64String(signedDigest);
        }

        public static bool VerifyData(string plainText, string signature, string publicKeyXml)
        {
            RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
            provider.FromXmlString(publicKeyXml);

            byte[] plainData = Encoding.Default.GetBytes(plainText);
            byte[] signedDigest = Convert.FromBase64String(signature);

            HashAlgorithm sha1 = HashAlgorithm.Create("SHA1");
            bool isDataIntact = provider.VerifyData(plainData, sha1, signedDigest);
            return isDataIntact;
        }

        //使用SingnHash
        public static string SignData2(string plainText, string privateKeyXml)
        {
            RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
            provider.FromXmlString(privateKeyXml);
            byte[] plainData = Encoding.Default.GetBytes(plainText);

            //设置获取摘要的算法
            HashAlgorithm sha1 = HashAlgorithm.Create("SHA1");
            //获得原始摘要
            byte[] digestData = sha1.ComputeHash(plainData);
            //对元素摘要进行签名
            byte[] signedDigest = provider.SignHash(digestData, "SHA1");
            return Convert.ToBase64String(signedDigest);
        }

        //使用VerifyHash
        public static bool VerifyData2(string plainText, string signedDigest, string publicKeyXml)
        {
            RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
            provider.FromXmlString(publicKeyXml);

            byte[] plainData = Encoding.Default.GetBytes("SHA1");
            byte[] signedDigestData = Convert.FromBase64String(signedDigest);

            //获得本地摘要
            HashAlgorithm sha1 = HashAlgorithm.Create("SHA1");
            byte[] digest = sha1.ComputeHash(plainData);

            //解密签名
            bool isDataIntact = provider.VerifyHash(digest, "SHA1", signedDigestData);
            return isDataIntact;
        }
    }

到此这篇关于ASP.NET加密和解密的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • asp.net实现的DES加密解密操作示例

    本文实例讲述了asp.net实现的DES加密解密操作.分享给大家供大家参考,具体如下: //加密方法 private string encrypt(string strToEncrypt) { if (strToEncrypt == null || strToEncrypt == "") return strToEncrypt; DESCryptoServiceProvider des = new DESCryptoServiceProvider(); //把字符串放到byte数组中,

  • ASP.NET中DES加密与解密MD5加密帮助类的实现代码

    public class TrialHelper { //默认密钥向量 private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; /// <summary> /// DES加密字符串 /// </summary> /// <param name="encryptString">待加密的字符串</param> /// <param

  • asp.net 字符串加密解密技术

    复制代码 代码如下: using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using Syste

  • asp.net 对中文汉字的加密与解密代码

    复制代码 代码如下: protected void Page_Load(object sender, EventArgs e) { //加密算法 string username = "我是陈建勇"; //MD5加密 - 得到32位加密数据,数据不好解密.过于复杂. username =FormsAuthentication.HashPasswordForStoringInConfigFile(username, "MD5"); //SHA1加密 - 得到40位加密数

  • ASP.NET加密解密算法分享

    #region DES加密解密 /// <summary> /// DES加密 /// </summary> /// <param name="strSource">待加密字串</param> /// <param name="key">32位Key值</param> /// <returns>加密后的字符串</returns> public string DESEncr

  • asp.net实现的MD5加密和DES加解密算法类完整示例

    本文实例讲述了asp.net实现的MD5加密和DES加解密算法类.分享给大家供大家参考,具体如下: #region MD5算法 public string md5(string str, int code) { if (code == 32) //32位加密 { return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower(); } else /

  • Asp.net,C# 加密解密字符串的使用详解

    首先在web.config | app.config 文件下增加如下代码: 复制代码 代码如下: <?xml version="1.0"?>  <configuration>    <appSettings>      <add key="IV" value="SuFjcEmp/TE="/>      <add key="Key" value="KIPSToILG

  • asp.net的加密解密技巧

    对于加密和解密,我们都知道.下面主要介绍的是ASP.NET中的加密和解密. 一.数据加密/编码算法列表 常见用于保证安全的加密或编码算法如下: 1.常用密钥算法 密钥算法用来对敏感数据.摘要.签名等信息进行加密,常用的密钥算法包括: DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合: 3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高: RC2和 RC4:用变长密钥对大量数据进行加密,比 D

  • 详解ASP.NET中加密和解密的方法

    散列运算 mscorlib.dll下的System.Security.Cryptography下: 抽象类HashAlgorithm 抽象类MD5 MD5CryptoServiceProvider SHA1 SHA1CryptoServiceProvider密封类:调用Windows Crypto API SHA1Managed普通类:用托管代码写的 SHA256 SHA256CryptoServiceProvider SHA256Managed SHA384 SHA512 对字节数组或流散列运

  • 详解处理Java中的大对象的方法

    目录 String中的substring 集合大对象扩容 保持合适的对象粒度 Bitmap 把对象变小 数据的冷热分离 数据双写 写入 MQ 分发 使用 Binlog 同步 思维发散 小结 本文我们将讲解一下对于“大对象”的优化.这里的“大对象”,是一个泛化概念,它可能存放在 JVM 中,也可能正在网络上传输,也可能存在于数据库中. 那么为什么大对象会影响我们的应用性能呢? 第一,大对象占用的资源多,垃圾回收器要花一部分精力去对它进行回收: 第二,大对象在不同的设备之间交换,会耗费网络流量,以及

  • 详解ASP.NET中Identity的身份验证代码

    本篇内容主要讲述了实现基于微软账户的第三方身份验证.实现双因子身份验证. 验证码机制这3个内容. 实现基于微软账户的第三方身份验证 在微软提供的ASP.NET MVC模板代码中,默认添加了微软.Google.twitter以及Facebook的账户登录代码(虽然被注释了),另外针对国内的一些社交账户提供了相应的组件,所有组件都可以通过Nuget包管理器安装: 从上图中看到有优酷.微信.QQ.微博等组件,其中一些是微软提供的,一些是其它开发者提供的.而本文将使用微软账户为例来介绍如何实现一个第三方

  • 详解ASP.NET中Session的用法

    当用户在应用程序的页之间跳转时,存储在 Session 对象中的变量不会清除,而用户在应用程序中访问页面时,这些变量始终存在.当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象.当会话过期或被放弃后,服务器将终止该会话. 通过向客户程序发送唯一的 Cookie 可以管理服务器上的 Session 对象.当用户第一次请求 ASP 应用程序中的某个页面时,ASP 要检查 HTTP 头信息,查看是否有在报文中有名为 ASPSESSION

  • 详解Android App中创建ViewPager组件的方法

    现在很多app一打开就是一个ViewPager,然后可以用手指滑,每滑一次就换一张图,底下还会有圈圈表示说现在滑到第几章~ 通常这些图片都是放功能简介或是使用教学之类的,我的需求很简单,就是上面提到的那样而已. 有两种做法,一种是找现有套件,查了一堆资料每个都跟我推荐ViewPagerIndicator这套,我之前也看过这套,只是看起来需要有fragment再加上google play范例好像载不到了,所以只好自己实做一个. Viewpager的实作可参考Android ViewPager使用详

  • 详解Android App中ViewPager使用PagerAdapter的方法

    PageAdapter是一个抽象类,直接继承于Object,导入包android.support.v4.view.PagerAdapter即可使用. 要使用PagerAdapter, 首先要继承PagerAdapter类,至少覆盖以下方法: 在每次创建ViewPager或滑动过程中,以下四个方法都会被调用,而instantiateItem和destroyItem中的方法要自己去实现. public abstract int getCount(); 这个方法,是获取当前窗体界面数 public a

  • 详解ABP框架中Session功能的使用方法

    如果一个应用程序需要登录,则它必须知道当前用户执行了什么操作.因此ASP.NET在展示层提供了一套自己的SESSION会话对象,而ABP则提供了一个可以在任何地方 获取当前用户和租户的IAbpSession接口. 关于IAbpSession 需要获取会话信息则必须实现IAbpSession接口.虽然你可以用自己的方式去实现它(IAbpSession),但是它在module-zero项目中已经有了完整的实现. 注入Session IAbpSession通常是以属性注入的方式存在于需要它的类中,不需

  • 详解Nginx服务器中配置超时时间的方法

    一.啥时候用到 用来设置请求资源和服务器返回的时间,保证一个请求占用固定时间,超出后报504超时!这样可以保证一个请求占用过长时间. 二.主要参数 使用nginx服务器如果遇到timeou情况时可以如下设置参数,使用fastcgi: fastcgi_connect_timeout 75;  链接 fastcgi_read_timeout 600;   读取 fastcgi_send_timeout 600;   发请求 这两个选项.          fastcgi_read_timeout是指

  • 详解VMware 虚拟机中添加新硬盘的方法

    随着在虚拟机中存储的东西的逐渐的增加,虚拟机的硬盘也逐渐告急,因此急需拓展一块新的虚拟磁盘.以下便是在VMware 中添加新的虚拟磁盘的方法: 一.VMware新增磁盘的设置步骤 (建议:在设置虚拟的时候,不要运行虚拟机的系统,不然添加了新的虚拟磁盘则要重启虚拟机) 1.选择"VM"----"setting"并打开,将光标定位在hard Disk这一选项,然后点击下方的Add按钮 2.点击next,执行下一个步骤 3.根据提示,创建一个虚拟的磁盘,并点击下一步 4.

  • 详解android.mk中引用第三方库的方法

    一.集成第三方jar包: 1.在项目目录下创建目录libs(不创建也行,一会儿指向对应路径就好),将第三方的jar包放进去. 2.在Android.mk文件中进行配置: include $(CLEAR_VARS) LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := smartphotolib:../../libs/smartphotolib.jar #前面为自定义的名(umeng_message_push),起什么名都可以,":"后面的为jar包在项目下对应

随机推荐