在tcp通讯中为了数据安全在某些情况下对数据进行加密传输是很有必要的,可惜的是MS并没有为Silverlight提供一些标准的加密功能实现.如果你想在Silverlight中使用RSA或DES这些标准的加密算法,那真的不好意思MS并没有提供...不过我们可以使用一些基于Silverlight开源实现的加密库,以下就是一个开源的RSA加密库http://scrypt.codeplex.com.

RSA是一种非对称加密算法,它提供数据加密和签名的功能.Rsa的加解密都用不同的密钥,所以即使你有加密的密钥也无法对加密的数据进行解密(相对解密成本).如果想破解加密数据那必须要把别一方的密钥破解,想分解RSA 2048位的密钥基本是不可能的事情.下面通过简单的例子来运RSA进行数据加密传输.

在编写代码之前先整理一下流程,假设我们需要加密提供给服务器的数据,那么我们必须向服务获取一个RSA的公钥,而密钥则保留在服务器端.客户端只需要采用公钥进行数据加密;服务器用私钥进行数据解密就OK了.

以下是制定简单的通讯协议

public class GetKey:Beetle.IMessage{public void Load(Beetle.BufferReader reader){}public void Save(Beetle.BufferWriter writer){}}public class GetKeyResponse:Beetle.IMessage{public string PublicKey;public void Load(Beetle.BufferReader reader){PublicKey = reader.ReadString();}public void Save(Beetle.BufferWriter writer){writer.Write(PublicKey);}}

分别是获取密钥请求和应答

服务器端只需要根据连接创建一个新的RSA 2048加密对象,并把密钥导出到XML中,注意导出的时候只导公钥部分就行了

private RSACryptoServiceProvider GetRsa(TcpChannel channel){string key = "_RSA";RSACryptoServiceProvider result = (RSACryptoServiceProvider)channel[key];if (result == null){result = new RSACryptoServiceProvider(2048);channel[key] = result;}return result;}public void GetKey(TcpChannel channel, GetKey e){GetKeyResponse response = new GetKeyResponse();response.PublicKey = GetRsa(channel).ToXmlString(false);channel.Send(response);Console.WriteLine("{0} Get PublicKey!", channel.EndPoint);}

Silverlight在接收到公钥数据只需要把他导入到对应的RSA对象中

public void Response(Beetle.TcpChannel channel, GetKeyResponse e){RSACrypto.FromXmlString(e.PublicKey);Dispatcher.BeginInvoke(() =>{txtStatus.Content = "获取公钥成功!";cmdRegister.IsEnabled = true;});}

导入之后就可以进行相应数据的加密工作

private void cmdRegister_Click(object sender, RoutedEventArgs e){try{Register register = new Register();register.UserName = RSACrypto.Encrypt(Encoding.UTF8.GetBytes(txtUserName.Text));register.PassWord = RSACrypto.Encrypt(Encoding.UTF8.GetBytes(txtPassWord.Text));Channel.Send(register);}catch (Exception e_){txtStatus.Content = e_.Message;}}

服务器接收数据后进行相关解密工作

public void Register(TcpChannel channel, Register e){Console.WriteLine("username:{0}", Smark.Core.Functions.ToString(e.UserName));Console.WriteLine("password:{0}", Smark.Core.Functions.ToString(e.PassWord));Console.WriteLine("username:{0}", Encoding.UTF8.GetString(GetRsa(channel).Decrypt(e.UserName,true)));Console.WriteLine("password:{0}", Encoding.UTF8.GetString(GetRsa(channel).Decrypt(e.PassWord, true)));}

解密数据对比

理解流程后使用RAS对通信数据加密是件很简单的事情,由于RSA加密数据效率不高,所以对于大量通讯数据一般不采用RSA来处理.这个时候可以采用对称加密来处理,但对称加密有个缺点就是加解密钥是一样的,为了保证密钥在传输的过程中不易被获取所以一般都会采用RSA对密钥进行加密.

下载完全代码

Rsa.rar (1.08 mb)

Silverlight使用RSA加密socket tcp通讯数据相关推荐

  1. Omorn - NJ301-1100 AND NX102-9000 - Socket - TCP 通讯

    目录 Omorn - NJ301-1100 AND NX102-9000 - Socket - TCP 通讯 测试案例IP 通讯验证 Omorn - NJ301-1100 AND NX102-9000 ...

  2. Simotion TCP 通讯数据发送方式

    由下图可知,西门子Simotion的TCP通讯为Profinet IO时,是通过IO进行通讯的.所以上位机应该同样以Datastream的方式进行收发数据. https://cache.industr ...

  3. 实现高性能稳定的socket tcp通讯经验分享

    其实在.net socket编写高性能稳定方面的资料真的比较少,一个实质性的测试数据结果对比就更少了.我们可以从http://msdn.microsoft.com/zh-cn/magazine/cc1 ...

  4. C# Socket tcp 发送数据大小问题

    TCP/IP是可靠性传输协议,它能保证数据能按顺序的方式到达目的地.看到以上描述在写TCP/IP应用的时候似乎就可以放心了,只要程序不出意外就数据输传就是正确.但最近在做一个文件传输工作的时候确得到的 ...

  5. 使用Beetle简单构建高性能Socket tcp应用

    beetle是基于c#编写的高性能Socket tcp组件,它基于SocketAsyncEventArgs的实现并提供了发送队列和接收队列的支持,可以根据情况灵活地设置1-N个发送队列和接收队列.除了 ...

  6. ios php rsa,RSA 加密 iOS

    在iOS端使用RSA加密的记录 一.需求: SDK开发,使用RSA加密和后台进行数据交互,后台是PHP 要求: 1.post请求,客户端放公钥,私钥放后台 2.发送数据:客户端的json数据-> ...

  7. 网络编程2_网络通讯协议, socket(tcp, udp)

    一. 网络通讯协议     互联网协议的功能: 定义计算机如何接入internet, 以及接入internet的计算机的通信标准     互联网协议按照功能的不同分为osi七层或tcp/ip五层    ...

  8. 【iOS】Socket/TCP 通信 发送 NSString 字符串格式数据

    Socket/TCP 原理这里就不阐述了,网上一搜一大堆,直接上关键代码. [注]iOS 目前有非常著名的第三方库 CocoaAsyncSocket 可以使用,但是我们项目当时做大数据上报要求直接发送 ...

  9. 零配置Socket TCP消息通讯服务容器EC

    EC全称是elastic communication,是基于c#实现的Socket网络通讯服务容器,支持windows .Net和mono.通过EC容器可以让开发人员在不了解Socket网络通讯知识和 ...

最新文章

  1. 照抄不翻车:抗住千万流量的大型分布式系统架构设计
  2. 通用类 RemoteUpload 远程上传从其他网站复制过来的图片
  3. Qt中打开excel文件
  4. 7.3 TensorFlow笔记(基础篇):加载数据之从队列中读取
  5. 如何选择一个合适的建站系统?
  6. 物联网常用的组网方式浅析
  7. 在cad如果用计算机,CAD如何使用快速计算器为中的变量区域功能
  8. VMware Perl SDK error “Server Version Unavailable .. line 545”
  9. sql服务器的响应时间,如何解决:[Sql Server]超时时间已到。在操作完成之前超时时间已过或服务器未响应。...
  10. pythonmt4通讯swot矩阵_SWOT矩阵分析法
  11. MIT Mini Cheetah 的驱动与结构原理解读以及对尺寸效应
  12. 微软系统授权 服务器虚拟化,微软远程桌面服务授权规则及建议
  13. 能骑能健身的折叠电动车,短途出行新利器,五轮健身电踏车D1 Pro体验
  14. 设计模式(二)(C++)
  15. 搜图、裁剪一步到位,有人用YOLOv5和CLIP做了一个找图神器,在线可试用
  16. 电热水器排污口镁棒掉入内胆怎么办?
  17. python动画简单_Python 使用 pygame 实现一个简单的动画
  18. html5图书租借系统,图书租赁管理系统
  19. xampp安装包(百度云)
  20. 支持IE和firefox多种浏览器的加入收藏夹js代码

热门文章

  1. RSAC 2021:厂商发布概述
  2. 警惕新型“二进制植入”漏洞,立即更新至 Npm 最新版本
  3. python基础学习--字符串和文件数据处理--附代码
  4. csharp:Convert Image to Base64 String and Base64 String to Image
  5. 一个问题引发的连环血案
  6. 手把手教你整合最优雅SSM框架
  7. C# 套接字编程:Scoket,我用Scoket做的C# Windows应用程序如下:
  8. ios 7.1.2 拍照声音
  9. 安装和部署企业程序库
  10. mysql中如何查询最近24小时、top n查询