zoukankan      html  css  js  c++  java
  • Asp.net,C# 加密解密字符串

    首先在web.config | app.config 文件下增加如下代码:

    <?xml version="1.0"?>
      <configuration>
        <appSettings>
          <add key="IV" value="SuFjcEmp/TE="/>
          <add key="Key" value="KIPSToILGp6fl+3gXJvMsN4IajizYBBT"/>
        </appSettings>
      </configuration>

    IV:加密算法的初始向量。

    Key:加密算法的密钥。

    接着新建类CryptoHelper,作为加密帮助类。

    首先要从配置文件中得到IV 和Key。所以基本代码如下:

    public class CryptoHelper
            {
                //private readonly string IV = "SuFjcEmp/TE=";
                private readonly string IV = string.Empty;
                //private readonly string Key = "KIPSToILGp6fl+3gXJvMsN4IajizYBBT";
                private readonly string Key = string.Empty;
    
                /// <summary>
                ///构造函数
                /// </summary>
                public CryptoHelper()
                {
                    IV = ConfigurationManager.AppSettings["IV"];
                    Key = ConfigurationManager.AppSettings["Key"];
                }
            }

    注意添加System.Configuration.dll程序集引用。

    在获得了IV 和Key 之后,需要获取提供加密服务的Service 类。

    在这里,使用的是System.Security.Cryptography; 命名空间下的TripleDESCryptoServiceProvider类。

    获取TripleDESCryptoServiceProvider 的方法如下:

    /// <summary>
            /// 获取加密服务类
            /// </summary>
            /// <returns></returns>
            private TripleDESCryptoServiceProvider GetCryptoProvider()
            {
                TripleDESCryptoServiceProvider provider = new TripleDESCryptoServiceProvider();
    
                provider.IV = Convert.FromBase64String(IV);
                provider.Key = Convert.FromBase64String(Key);
    
                return provider;
            }

    TripleDESCryptoServiceProvider 两个有用的方法

    CreateEncryptor:创建对称加密器对象ICryptoTransform.

    CreateDecryptor:创建对称解密器对象ICryptoTransform

    加密器对象和解密器对象可以被CryptoStream对象使用。来对流进行加密和解密。

    cryptoStream 的构造函数如下:

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

    使用transform 对象对stream 进行转换。

    完整的加密字符串代码如下:

    /// <summary>
            /// 获取加密后的字符串
            /// </summary>
            /// <param name="inputValue">输入值.</param>
            /// <returns></returns>
            public string GetEncryptedValue(string inputValue)
            {
                TripleDESCryptoServiceProvider provider = this.GetCryptoProvider();
    
                // 创建内存流来保存加密后的流
                MemoryStream mStream = new MemoryStream();
    
                // 创建加密转换流
                CryptoStream cStream = new CryptoStream(mStream,
                provider.CreateEncryptor(), CryptoStreamMode.Write);
    
                // 使用UTF8编码获取输入字符串的字节。
                byte[] toEncrypt = new UTF8Encoding().GetBytes(inputValue);
    
                // 将字节写到转换流里面去。
                cStream.Write(toEncrypt, 0, toEncrypt.Length);
                cStream.FlushFinalBlock();
    
                // 在调用转换流的FlushFinalBlock方法后,内部就会进行转换了,此时mStream就是加密后的流了。
                byte[] ret = mStream.ToArray();
    
                // Close the streams.
                cStream.Close();
                mStream.Close();
    
                //将加密后的字节进行64编码。
                return Convert.ToBase64String(ret);
            }

    解密方法也类似:

    /// <summary>
            /// 获取解密后的值
            /// </summary>
            /// <param name="inputValue">经过加密后的字符串.</param>
            /// <returns></returns>
            public string GetDecryptedValue(string inputValue)
            {
                TripleDESCryptoServiceProvider provider = this.GetCryptoProvider();
    
                byte[] inputEquivalent = Convert.FromBase64String(inputValue);
    
                // 创建内存流保存解密后的数据
                MemoryStream msDecrypt = new MemoryStream();
    
                // 创建转换流。
                CryptoStream csDecrypt = new CryptoStream(msDecrypt,
                                                            provider.CreateDecryptor(),
                                                            CryptoStreamMode.Write);
    
                csDecrypt.Write(inputEquivalent, 0, inputEquivalent.Length);
    
                csDecrypt.FlushFinalBlock();
                csDecrypt.Close();
    
                //获取字符串。
                return new UTF8Encoding().GetString(msDecrypt.ToArray());
            }

    完整的CryptoHelper代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Security.Cryptography;
    using System.IO;
    using System.Configuration;
    
    namespace WindowsFormsApplication1
    {
        public class CryptoHelper
        {
            //private readonly string IV = "SuFjcEmp/TE=";
            private readonly string IV = string.Empty;
            //private readonly string Key = "KIPSToILGp6fl+3gXJvMsN4IajizYBBT";
            private readonly string Key = string.Empty;
    
            public CryptoHelper()
            {
                IV = ConfigurationManager.AppSettings["IV"];
                Key = ConfigurationManager.AppSettings["Key"];
            }
    
            /// <summary>
            /// 获取加密后的字符串
            /// </summary>
            /// <param name="inputValue">输入值.</param>
            /// <returns></returns>
            public string GetEncryptedValue(string inputValue)
            {
                TripleDESCryptoServiceProvider provider = this.GetCryptoProvider();
    
                // 创建内存流来保存加密后的流
                MemoryStream mStream = new MemoryStream();
    
                // 创建加密转换流
                CryptoStream cStream = new CryptoStream(mStream,
    
                provider.CreateEncryptor(), CryptoStreamMode.Write);
                // 使用UTF8编码获取输入字符串的字节。
                byte[] toEncrypt = new UTF8Encoding().GetBytes(inputValue);
    
                // 将字节写到转换流里面去。
                cStream.Write(toEncrypt, 0, toEncrypt.Length);
                cStream.FlushFinalBlock();
    
                // 在调用转换流的FlushFinalBlock方法后,内部就会进行转换了,此时mStream就是加密后的流了。
                byte[] ret = mStream.ToArray();
    
                // Close the streams.
                cStream.Close();
                mStream.Close();
    
                //将加密后的字节进行64编码。
                return Convert.ToBase64String(ret);
            }
    
            /// <summary>
            /// 获取加密服务类
            /// </summary>
            /// <returns></returns>
            private TripleDESCryptoServiceProvider GetCryptoProvider()
            {
                TripleDESCryptoServiceProvider provider = new TripleDESCryptoServiceProvider();
    
                provider.IV = Convert.FromBase64String(IV);
                provider.Key = Convert.FromBase64String(Key);
    
                return provider;
    
            }
    
            /// <summary>
            /// 获取解密后的值
            /// </summary>
            /// <param name="inputValue">经过加密后的字符串.</param>
            /// <returns></returns>
            public string GetDecryptedValue(string inputValue)
            {
                TripleDESCryptoServiceProvider provider = this.GetCryptoProvider();
                byte[] inputEquivalent = Convert.FromBase64String(inputValue);
    
                // 创建内存流保存解密后的数据
                MemoryStream msDecrypt = new MemoryStream();
    
                // 创建转换流。
                CryptoStream csDecrypt = new CryptoStream(msDecrypt,
                provider.CreateDecryptor(),
                CryptoStreamMode.Write);
    
                csDecrypt.Write(inputEquivalent, 0, inputEquivalent.Length);
                csDecrypt.FlushFinalBlock();
    
                csDecrypt.Close();
    
                //获取字符串。
                return new UTF8Encoding().GetString(msDecrypt.ToArray());
            }
        }
    }

    使用例子:

    image

    原文地址:http://blogs.msdn.com/b/nikhiln/archive/2008/05/18/net-2-0-symmetric-encryption-code-sample.aspx

    作者:LoveJenny     
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    分类: C#
  • 相关阅读:
    java Class.getResource和ClassLoader.getResource
    Ext Grid控件的配置与方法
    BLANK_IMAGE_URL
    js中变量和jsp中java代码中变量互相访问解决方案
    PL/SQL
    滴滴2021后端开发岗笔试:
    顺丰科技2021研发岗笔试:贪心算法应用
    2021顺丰科技研发笔试: 深度优先算法的应用
    动态规划算法轻松解决01背包,完全背包,多重背包问题
    寻找二叉树的最近公共祖先
  • 原文地址:https://www.cnblogs.com/dajiang02/p/2081139.html
Copyright © 2011-2022 走看看