<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      WCF 進階: 對稱加密傳輸

        大家使用WCF的時候,會不會覺得使用SSL通道傳輸太麻煩,使用明文傳輸又覺得不安全呢? 特別是當傳遞的消息中帶有比較敏感,機密的身份信息的時候更是如此呢?我們在上文實現了壓縮編碼傳輸,詳見WCF進階:將編碼后的字節流壓縮傳輸,本文照葫蘆畫瓢,實現一個可能大家更為需要的功能,將數據對稱加密后傳輸,好處就是加密速度嗷嗷快,使用起來嗷嗷方便。

        工作原理和壓縮傳輸一致所以本文不做贅述,詳細的實現機理會單開一篇詳細去談,本文重點看看實現代碼和實現效果。要實現對稱機密傳輸的功能,我們主要要實現的有如下幾個類:CryptEncodingBindingElement,CryptEncoderFactory,CryptEncoder,DESCryption,前面三項都是WCF擴展所必須的,后面是工具類,主要是用于DES加解密和生成密鑰和IV。

      CryptEncodingBindingElement

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Xml;
      using System.ServiceModel.Channels;
      
      namespace RobinLib
      {
          public class CryptEncodingBindingElement: MessageEncodingBindingElement
          { 
              private XmlDictionaryReaderQuotas readerQuotas;
              private MessageEncodingBindingElement innerMessageEncodingBindingElement;
              string key;
              string iv; 
              public MessageEncodingBindingElement InnerMessageEncodingBindingElement
              {
                  get
                  {
                      return innerMessageEncodingBindingElement;
                  }
              }
      
              public string Key
              {
                  get
                  {
                      return key;
                  }
              }
              public string IV
              {
                  get
                  {
                      return iv;
                  }
              }
      
              public CryptEncodingBindingElement(MessageEncodingBindingElement innerMessageEncodingBindingElement, string key,string iv)
              {
                  this.readerQuotas = new XmlDictionaryReaderQuotas();
                  this.key = key;
                  this.iv = iv;
                  this.innerMessageEncodingBindingElement = innerMessageEncodingBindingElement;
              }
      
              public override IChannelFactory<TChannel> BuildChannelFactory<TChannel>(BindingContext context)
              {
                  context.BindingParameters.Add(this);
                  return context.BuildInnerChannelFactory<TChannel>();
              }
              public override IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context)
              {
                  context.BindingParameters.Add(this);
                  return context.BuildInnerChannelListener<TChannel>();
              }
              public override bool CanBuildChannelFactory<TChannel>(BindingContext context)
              {
                  context.BindingParameters.Add(this);
                  return context.CanBuildInnerChannelFactory<TChannel>();
              }
              public override bool CanBuildChannelListener<TChannel>(BindingContext context)
              {
                  context.BindingParameters.Add(this);
                  return context.CanBuildInnerChannelListener<TChannel>();
              }
              public override MessageEncoderFactory CreateMessageEncoderFactory()
              {
                  return new CryptEncoderFactory(innerMessageEncodingBindingElement,key,iv);
              }
              public override T GetProperty<T>(BindingContext context)  
              {
                  if (typeof(T) == typeof(XmlDictionaryReaderQuotas))
                  {
                      return this.readerQuotas as T;
                  }
                  return base.GetProperty<T>(context);
      
              }
              public override MessageVersion MessageVersion
              {
                  get
                  {
                      return innerMessageEncodingBindingElement.MessageVersion;
                  }
                  set
                  {
                      innerMessageEncodingBindingElement.MessageVersion = value;
                  }
              }
              
              public override BindingElement Clone()
              {
                  return new CryptEncodingBindingElement(innerMessageEncodingBindingElement,key,iv);
              } 
          }
      }

      CryptEncoderFactory

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.ServiceModel.Channels;
      
      namespace RobinLib
      {
          public class CryptEncoderFactory : MessageEncoderFactory
          {
              private MessageEncodingBindingElement innerMessageEncodingBindingElement;
              CryptEncoder messageEncoder;
              string key;
              string iv; 
              public CryptEncoderFactory(MessageEncodingBindingElement innerMessageEncodingBindingElement, string key,string iv)
              {
                  this.innerMessageEncodingBindingElement = innerMessageEncodingBindingElement;
                  this.key = key;
                  this.iv = iv;
                  messageEncoder = new CryptEncoder(this,key, iv);
              }
              public override MessageEncoder CreateSessionEncoder()
              {
                  return base.CreateSessionEncoder();
              }
              public override MessageEncoder Encoder
              {
                  get { return messageEncoder; }
              }
              public override MessageVersion MessageVersion
              {
                  get { return innerMessageEncodingBindingElement.MessageVersion; }
              }
              public MessageEncodingBindingElement InnerMessageEncodingBindingElement
              {
                  get
                  {
                      return innerMessageEncodingBindingElement;
                  }
              }
          }
      }

      CryptEncoder

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.ServiceModel.Channels;
      using System.IO;
      
      namespace RobinLib
      {
          public class CryptEncoder : MessageEncoder
          {
              CryptEncoderFactory factory;
              MessageEncoder innserEncoder;
              string key;
              string iv;
              public CryptEncoder(CryptEncoderFactory encoderFactory,string key,string iv)
              {
                  factory = encoderFactory;
                  this.key = key;
                  this.iv = iv;
                  innserEncoder = factory.InnerMessageEncodingBindingElement.CreateMessageEncoderFactory().Encoder;
              }
              public override string ContentType
              {
                  get { return innserEncoder.ContentType; }
              }
              public override string MediaType
              {
                  get { return innserEncoder.MediaType; }
              }
              public override MessageVersion MessageVersion
              {
                  get { return innserEncoder.MessageVersion; }
              }
              public override bool IsContentTypeSupported(string contentType)
              {
                  return innserEncoder.IsContentTypeSupported(contentType);
              }
              public override T GetProperty<T>()
              {
                  return innserEncoder.GetProperty<T>();
              }
              public override Message ReadMessage(ArraySegment<byte> buffer, BufferManager bufferManager, string contentType)
              {
                  ArraySegment<byte> bytes = new DESCryption(key,iv).Decrypt(buffer);
                  int totalLength = bytes.Count;
                  byte[] totalBytes = bufferManager.TakeBuffer(totalLength);
                  Array.Copy(bytes.Array, 0, totalBytes, 0, bytes.Count);
                  ArraySegment<byte> byteArray = new ArraySegment<byte>(totalBytes, 0, bytes.Count);
                  bufferManager.ReturnBuffer(byteArray.Array); 
                  Message msg = innserEncoder.ReadMessage(byteArray, bufferManager, contentType);
                  return msg;
      
              }
              public override Message ReadMessage(System.IO.Stream stream, int maxSizeOfHeaders, string contentType)
              {
                  //讀取消息的時候,二進制流為加密的,需要解壓
                  Stream ms = new DESCryption(key,iv).Decrypt(stream); 
                  Message msg = innserEncoder.ReadMessage(ms, maxSizeOfHeaders, contentType);
                  return msg;
              }
              public override ArraySegment<byte> WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset)
              { 
                  ArraySegment<byte> bytes = innserEncoder.WriteMessage(message, maxMessageSize, bufferManager);
                  ArraySegment<byte> buffer = new DESCryption(key,iv).Encrypt(bytes);
                  int totalLength = buffer.Count + messageOffset;
                  byte[] totalBytes = bufferManager.TakeBuffer(totalLength);
                  Array.Copy(buffer.Array, 0, totalBytes, messageOffset, buffer.Count);
                  ArraySegment<byte> byteArray = new ArraySegment<byte>(totalBytes, messageOffset, buffer.Count);
                  Console.WriteLine(",原來字節流大小:"+bytes.Count+",壓縮后字節流大小:"+byteArray.Count);
                  return byteArray;
              }
              public override void WriteMessage(Message message, System.IO.Stream stream)
              {
                  System.IO.MemoryStream ms = new System.IO.MemoryStream();
                  innserEncoder.WriteMessage(message, ms);
                  stream = new DESCryption(key,iv).Encrypt(ms);
              }
          }
      }

      DESCryption

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Security.Cryptography;
      using System.IO;
      
      namespace RobinLib
      {
          public class DESCryption : IDisposable
          {
              DESCryptoServiceProvider des;
              Encoding encoding = new UnicodeEncoding();
              public DESCryption()
              {
      
              }
              public DESCryption(string key, string iv)
              {
                  des = new DESCryptoServiceProvider();
                  des.Key = Convert.FromBase64String(key);
                  des.IV = Convert.FromBase64String(iv);
              }
              public void Dispose()
              {
                  des.Clear();
              }
              public void GenerateKey(out string key, out string iv)
              {
                  key = "";
                  iv = "";
                  using (DESCryptoServiceProvider des_o = new DESCryptoServiceProvider())
                  {
                      des_o.GenerateIV();
                      des_o.GenerateKey();
                      iv = Convert.ToBase64String(des_o.IV);
                      key = Convert.ToBase64String(des_o.Key);
                  }
              }
              #region ========加密========
              /// <summary> 
              /// 加密數據 
              /// </summary> 
              /// <param name="Text"></param> 
              /// <param name="sKey"></param> 
              /// <returns></returns> 
              public string Encrypt(string Text)
              {
                  MemoryStream ms = new MemoryStream();
                  CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
                  StreamWriter sw = new StreamWriter(cs);
                  sw.Write(Text);
                  sw.Close();
                  cs.Close();
                  byte[] buffer = ms.ToArray();
                  ms.Close();
                  return Convert.ToBase64String(buffer);
              }
      
              public ArraySegment<byte> Encrypt(ArraySegment<byte> buffers)
              { 
                  MemoryStream ms = new MemoryStream();
                  CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
                  cs.Write(buffers.Array, 0, buffers.Count); 
                  cs.Close();
                  byte[] buffer = ms.ToArray();
                  ms.Close(); 
                  ArraySegment<byte> bytes = new ArraySegment<byte>(buffer); 
                  return bytes;
              }
      
              public Stream Encrypt(Stream stream)
              {
                  MemoryStream ms = new MemoryStream(); 
                  CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
                  byte[] buffer = new byte[stream.Length];
                  stream.Read(buffer, 0, buffer.Length);
                  cs.Write(buffer, 0, buffer.Length);
                  cs.Close(); 
                  return ms;
              }
      
              #endregion
      
              #region ========解密========
              /// <summary> 
              /// 解密數據 
              /// </summary> 
              /// <param name="Text"></param> 
              /// <param name="sKey"></param> 
              /// <returns></returns> 
              public string Decrypt(string Text)
              {
                  byte[] inputByteArray = Convert.FromBase64String(Text);
                  System.IO.MemoryStream ms = new System.IO.MemoryStream(inputByteArray);
                  CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Read);
                  StreamReader sr = new StreamReader(cs);
                  string val = sr.ReadLine();
                  cs.Close();
                  ms.Close();
                  des.Clear();
                  return val;
              }
              public ArraySegment<byte> Decrypt(ArraySegment<byte> buffers)
              {
                  MemoryStream ms = new MemoryStream();
                  ms.Write(buffers.Array, 0, buffers.Count);
                  ms.Seek(0, SeekOrigin.Begin);
                  CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Read);
                  byte[] buffer = RetrieveBytesFromStream(cs, 1024);
                  ms.Close();
                  ArraySegment<byte> bytes = new ArraySegment<byte>(buffer);
                  return bytes;
              }
              public Stream Decrypt(Stream stream)
              {
                  stream.Seek(0, SeekOrigin.Begin);
                  MemoryStream ms = new MemoryStream();
                  Stream compressStream = new CryptoStream(stream, des.CreateDecryptor(), CryptoStreamMode.Read);
                  byte[] newByteArray = RetrieveBytesFromStream(compressStream, 1);
                  compressStream.Close();
                  return new MemoryStream(newByteArray);
              }
              public static byte[] RetrieveBytesFromStream(Stream stream, int bytesblock)
              {
      
                  List<byte> lst = new List<byte>();
                  byte[] data = new byte[1024];
                  int totalCount = 0;
                  while (true)
                  {
                      int bytesRead = stream.Read(data, 0, data.Length);
                      if (bytesRead == 0)
                      {
                          break;
                      }
                      byte[] buffers = new byte[bytesRead];
                      Array.Copy(data, buffers, bytesRead);
                      lst.AddRange(buffers);
                      totalCount += bytesRead;
                  }
                  return lst.ToArray();
              }
              #endregion
      
              #region IDisposable 成員
      
              void IDisposable.Dispose()
              {
                  if (des != null)
                  {
                      des.Clear();
                  }
              }
      
              #endregion
          }
      }

      宿主

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.ServiceModel;
      using Robin_Wcf_CustomMessageEncoder_SvcLib;
      using System.ServiceModel.Channels;
      using RobinLib;
      
      namespace Robin_Wcf_CustomMessageEncoder_Host
      {
          class Program
          {
              static void Main(string[] args)
              {
                  //服務地址
                  Uri baseAddress = new Uri("http://127.0.0.1:8081/Robin_Wcf_Formatter");
                  ServiceHost host = new ServiceHost(typeof(Service1), new Uri[] { baseAddress });
                  //服務綁定
                  ICollection<BindingElement> bindingElements = new List<BindingElement>();
                  HttpTransportBindingElement httpBindingElement = new HttpTransportBindingElement();
                  string key = "JggkieIw7JM=";
                  string iv = "XdTkT85fZ0U=";
                  CryptEncodingBindingElement textBindingElement = new CryptEncodingBindingElement(new BinaryMessageEncodingBindingElement(), key,iv);
                  bindingElements.Add(textBindingElement);
                  bindingElements.Add(httpBindingElement);
                  CustomBinding bind = new CustomBinding(bindingElements);  
                  host.AddServiceEndpoint(typeof(IService1), bind, "");
                  if (host.Description.Behaviors.Find<System.ServiceModel.Description.ServiceMetadataBehavior>() == null)
                  {
                      System.ServiceModel.Description.ServiceMetadataBehavior svcMetaBehavior = new System.ServiceModel.Description.ServiceMetadataBehavior();
                      svcMetaBehavior.HttpGetEnabled = true;
                      svcMetaBehavior.HttpGetUrl = new Uri("http://127.0.0.1:8001/Mex");
                      host.Description.Behaviors.Add(svcMetaBehavior);
                  }
                  host.Opened += new EventHandler(delegate(object obj, EventArgs e)
                  {
                      Console.WriteLine("服務已經啟動!");
                  }); 
                  host.Open();
                  Console.Read();
              }
          }
      }

      客戶端

       

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using RobinLib;
      using System.ServiceModel.Channels;
      using Robin_Wcf_CustomMessageEncoder_ClientApp.ServiceReference1;
      
      namespace Robin_Wcf_CustomMessageEncoder_ClientApp
      {
          class Program
          {
              static void Main(string[] args)
              {
                  System.Threading.Thread.Sleep(5300);
                  ICollection<BindingElement> bindingElements = new List<BindingElement>();
                  HttpTransportBindingElement httpBindingElement = new HttpTransportBindingElement();
                  string key = "JggkieIw7JM=";
                  string iv = "XdTkT85fZ0U=";
                  CryptEncodingBindingElement textBindingElement = new CryptEncodingBindingElement(new BinaryMessageEncodingBindingElement(), key, iv);
                  bindingElements.Add(textBindingElement);
                  bindingElements.Add(httpBindingElement); 
                  CustomBinding bind = new CustomBinding(bindingElements);  
                  ServiceReference1.IService1 svc = new ServiceReference1.Service1Client(bind, new System.ServiceModel.EndpointAddress("http://127.0.0.1:8081/Robin_Wcf_Formatter"));
                  string pres = svc.GetData(10);
                  Console.WriteLine(pres);
                  CompositeType ct = svc.GetDataUsingDataContract(new CompositeType());
                  System.IO.MemoryStream ms = new System.IO.MemoryStream();
                  for (int i = 0; i < 1000000; i++)
                  {
                      byte[] buffer = BitConverter.GetBytes(i);
                      ms.Write(buffer, 0, buffer.Length);
                  }
                  System.IO.Stream stream = svc.GetStream(ms);
                  Console.Read();
              }
          }
      }

      運行效果圖:

      image

      image

       

      生成key和iv的方法為:

      public void GenerateKey(out string key, out string iv)
      {
          key = "";
          iv = "";
          using (DESCryptoServiceProvider des_o = new DESCryptoServiceProvider())
          {
              des_o.GenerateIV();
              des_o.GenerateKey();
              iv = Convert.ToBase64String(des_o.IV);
              key = Convert.ToBase64String(des_o.Key);
          }
      }

      項目文檔:點擊這里下載

      posted @ 2010-04-13 20:18  Robin Zhang  閱讀(9338)  評論(17)    收藏  舉報
      主站蜘蛛池模板: 老太脱裤子让老头玩xxxxx| 亚洲爆乳精品无码一区二区| 精品国产综合成人亚洲区| 久久亚洲中文字幕伊人久久大| 国产一区二区三区的视频| 精品午夜福利在线视在亚洲 | 国产精成人品日日拍夜夜免费| 麻豆国产va免费精品高清在线| 元码人妻精品一区二区三区9| 思思99热精品在线| 成人精品一区二区三区在线观看| 亚洲av一区二区在线看| 亚洲男人第一无码av网站| 国产精品无码av不卡| 亚洲精品尤物av在线网站| 人妻丝袜无码专区视频网站| 国产在线国偷精品免费看| 久久久久人妻一区二区三区| 国产欧洲欧洲久美女久久| 四虎国产精品永久在线下载| 国产精品成人中文字幕| 色偷偷女人的天堂亚洲网| 国产精品爱久久久久久久| 久久亚洲精品11p| 久久久亚洲精品无码| 亚洲精品综合一区二区在线| 日本福利一区二区精品| 国产又色又刺激高潮视频| 内射一区二区三区四区| 五月天天天综合精品无码| 人妻教师痴汉电车波多野结衣| 合作市| 国产又爽又黄的激情视频| 精品国产午夜福利在线观看| 插插无码视频大全不卡网站| 国产精品中文一区二区| 国产精品综合一区二区三区 | 国产精品午夜福利91| 国产成人亚洲日韩欧美| 免费人成视频在线播放| 中文字幕亚洲男人的天堂|