.net利用MemoryStream加密字符串

来源:互联网 发布:类似picasa的软件 编辑:程序博客网 时间:2024/04/29 19:26
      在一个项目中需要将用户输入的字符串加密,不过在 System.Security.Cryptography 命名空间下所有用来加密解密的类全部都是对流进行操作的,没有对字符串直接操作的。于是我就到 System.IO 命名空间里找,看看有没有能利用的资源,结果发现了 MemoryStream 类。从这个类的名称来判断应该是对内存操作的流,或者用内存来模拟流。查了MSDN文档,果然可以利用这个类对字符串进行加密。以下是 DES 算法加密解密字符串的代码:

using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;

namespace MoneyStreamCryptoExample
{
    /// <summary>
    /// Class1 的摘要说明。
    /// </summary>
    class Class1
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            //初始化加密器生成器
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            des.GenerateKey();
            des.GenerateIV();

            //*************************
            //加密字符串
            //*************************
            string notEncryptStr = Console.ReadLine();
            //将字符串转换成字节
            byte [] byteNotEncrypt = Encoding.UTF8.GetBytes( notEncryptStr );

            //创建内存数据流
            MemoryStream encryptMs = new MemoryStream();

            //创建加密器
            CryptoStream encryptCs = new CryptoStream( encryptMs, des.CreateEncryptor(), CryptoStreamMode.Write );
            //将字节加密并写入内存
            encryptCs.Write( byteNotEncrypt, 0, byteNotEncrypt.Length );
            //将缓存中的数据写入内存
            encryptCs.FlushFinalBlock();
            //回到内存流开始的位置
            encryptMs.Seek( 0, SeekOrigin.Begin );

            //将加密后的数据读取出来
            byte [] byteEncrypt = new byte[1024];
            int i = encryptMs.Read( byteEncrypt, 0, 1024 );

            encryptCs.Close();

            //将加密后的字节转换为BASE64编码
            string secStr = Convert.ToBase64String( byteEncrypt, 0, i );

            Console.WriteLine( secStr );

            //*************************
            //解密字符串
            //*************************
            //将加密后的BASE64编码的字符串转换成字节
            byte [] byteNotDecrypt = Convert.FromBase64String( secStr );

            MemoryStream decryptMs = new MemoryStream( byteNotDecrypt );
            CryptoStream decryptCs = new CryptoStream( decryptMs, des.CreateDecryptor(), CryptoStreamMode.Read );

            //解密数据
            byte [] byteDecrypt = new byte[1024];
            i = decryptCs.Read( byteDecrypt, 0, 1024 );
            decryptCs.Close();

            //输出
            Console.WriteLine( Encoding.UTF8.GetString( byteDecrypt, 0, i ) );

            Console.ReadLine();
        }
    }
}