zoukankan      html  css  js  c++  java
  • C#原生加密方法: System.Security.Cryptography.CryptoStream DataSet加密解密

    采用16位密钥形式加密,把数据 dataset或文本转换为二进制流,然后进行加密解密。代码如下:

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Security.Cryptography;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace CryptoHelperLib
    {
        public class CryptoHelper
        {
    
            // 对称加密算法提供器
            private ICryptoTransform encryptor;     // 加密器对象
            private ICryptoTransform decryptor;     // 解密器对象
            //public string key = "ABCDEFGHIJKLMNOP";//长度16
            //public static byte[] DESKey = new byte[] { 11, 23, 93, 102, 72, 41, 18, 12 };
            //public static byte[] DESIV = new byte[] { 75, 158, 46, 97, 78, 57, 17, 36 };
            private const int BufferSize = 1024;
            public CryptoHelper(string algorithmName, string key)
            {
                SymmetricAlgorithm provider = SymmetricAlgorithm.Create(algorithmName);
                provider.Key = Encoding.UTF8.GetBytes(key);
    
                provider.IV = new byte[] { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
    
                encryptor = provider.CreateEncryptor();
                decryptor = provider.CreateDecryptor();
            }
    
            public CryptoHelper(string key) : this("TripleDES", key) { }
    
    
            public MemoryStream EncryptMemoryStream(MemoryStream itemStream)
            {
                // 创建空的密文流
                MemoryStream encryptedStream = new MemoryStream();
    
                CryptoStream cryptoStream =
                    new CryptoStream(encryptedStream, encryptor, CryptoStreamMode.Write);
    
                // 将明文流写入到buffer中
                // 将buffer中的数据写入到cryptoStream中
                int bytesRead = 0;
                byte[] buffer = new byte[BufferSize];
                itemStream.Position = 0;
                do
                {
                    bytesRead = itemStream.Read(buffer, 0, BufferSize);
                    cryptoStream.Write(buffer, 0, bytesRead);
                } while (bytesRead > 0);
    
                cryptoStream.FlushFinalBlock();
                byte[] buffer2 = encryptedStream.ToArray();
                string encryptedText = Convert.ToBase64String(buffer2);
                return encryptedStream;
            }
            public Stream EncryptByte(byte[] data)
            {
                MemoryStream clearStream = new MemoryStream(data);
                clearStream.Position = 0;
                // 创建空的密文流
                MemoryStream encryptedStream = new MemoryStream();
    
                CryptoStream cryptoStream =
                    new CryptoStream(encryptedStream, encryptor, CryptoStreamMode.Write);
    
                // 将明文流写入到buffer中
                // 将buffer中的数据写入到cryptoStream中
                int bytesRead = 0;
                byte[] buffer = new byte[BufferSize];
                do
                {
                    bytesRead = clearStream.Read(buffer, 0, BufferSize);
                    cryptoStream.Write(buffer, 0, bytesRead);
                } while (bytesRead > 0);
                cryptoStream.FlushFinalBlock();
                // 获取加密后的文本
                byte[] buffer2 = encryptedStream.ToArray();
                string encryptedText = Convert.ToBase64String(buffer2);
                return encryptedStream;
            }
    
    
            // 加密算法
            public string EncryptText(string clearText)
            {
                // 创建明文流
                byte[] clearBuffer = Encoding.UTF8.GetBytes(clearText);
                MemoryStream clearStream = new MemoryStream(clearBuffer);
    
                // 创建空的密文流
                MemoryStream encryptedStream = new MemoryStream();
    
                CryptoStream cryptoStream =
                    new CryptoStream(encryptedStream, encryptor, CryptoStreamMode.Write);
    
                // 将明文流写入到buffer中
                // 将buffer中的数据写入到cryptoStream中
                int bytesRead = 0;
                byte[] buffer = new byte[BufferSize];
                do
                {
                    bytesRead = clearStream.Read(buffer, 0, BufferSize);
                    cryptoStream.Write(buffer, 0, bytesRead);
                } while (bytesRead > 0);
    
                cryptoStream.FlushFinalBlock();
    
                // 获取加密后的文本
                buffer = encryptedStream.ToArray();
                string encryptedText = Convert.ToBase64String(buffer);
                return encryptedText;
            }
    
    
            public MemoryStream DecryptMemoryStream(MemoryStream encryptedStream)
            {
                MemoryStream clearStream = new MemoryStream();
                CryptoStream cryptoStream =
                    new CryptoStream(encryptedStream, decryptor, CryptoStreamMode.Read);
    
                int bytesRead = 0;
                byte[] buffer = new byte[BufferSize];
    
                do
                {
                    bytesRead = cryptoStream.Read(buffer, 0, BufferSize);
                    clearStream.Write(buffer, 0, bytesRead);
                } while (bytesRead > 0);
    
                buffer = clearStream.GetBuffer();
                MemoryStream clearStreamResult = new MemoryStream(buffer);
                return clearStreamResult;
            }
    
    
            //
            // 解密算法, http://www.51testing.com/html/67/n-220867-4.html
            // 解密算法
            public string DecryptText(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
                {
                    bytesRead = cryptoStream.Read(buffer, 0, BufferSize);
                    clearStream.Write(buffer, 0, bytesRead);
                } while (bytesRead > 0);
    
                buffer = clearStream.GetBuffer();
                string clearText =
                    Encoding.UTF8.GetString(buffer, 0, (int)clearStream.Length);
    
                return clearText;
            }
    
            public static string Encrypt(string clearText, string key)
            {
                CryptoHelper helper = new CryptoHelper(key);
                return helper.EncryptText(clearText);
            }
    
            public static string Decrypt(string encryptedText, string key)
            {
                CryptoHelper helper = new CryptoHelper(key);
                return helper.DecryptText(encryptedText);
            }
        }
    }
    View Code

    调用示例:

        // string key="ABCDEFGHIJKLMNOP"; //16位字符串
    
            public byte[] DataSetToBytes(DataSet ds)
            {
                DESCryptoServiceProvider objDES = new DESCryptoServiceProvider();
                MemoryStream dataStream = new MemoryStream();
                MemoryStream dataStream2 = new MemoryStream();
                ds.WriteXml(dataStream, XmlWriteMode.WriteSchema);
                
                CryptoHelperLib.CryptoHelper cryhelper = new CryptoHelperLib.CryptoHelper(key);
                dataStream2= cryhelper.EncryptMemoryStream(dataStream);
                byte[] buf = dataStream2.ToArray();
    
                return buf;
            }
    
            public DataSet DataSetFromBytes(byte[] buf)
            {
    
                MemoryStream dataStream = new MemoryStream(buf);
                MemoryStream dataStream2 = new MemoryStream();
                CryptoHelperLib.CryptoHelper cryhelper = new CryptoHelperLib.CryptoHelper(key);
                dataStream2 = cryhelper.DecryptMemoryStream(dataStream);
                dataStream2.Position = 0;
                DataSet ds = new DataSet();
                ds.ReadXml(dataStream2);
                return ds;
            }
  • 相关阅读:
    HDU 5441 离线处理 + 并查集
    [转载]HDU 3478 判断奇环
    POJ 1637 混合图的欧拉回路判定
    [转载] 一些图论、网络流入门题总结、汇总
    UVA 820 --- POJ 1273 最大流
    [转载 ]POJ 1273 最大流模板
    POJ 3041 -- 二分图匹配
    2014西安现场赛F题 UVALA 7040
    UVA 12549
    割点、桥(一点点更新)
  • 原文地址:https://www.cnblogs.com/guo2001china/p/5363049.html
Copyright © 2011-2022 走看看