tcp/ip网络通讯安全是一个广受关注的话题,现在也有一些基于tcp/ip加密技术标准如SSL,TLS等。但很多时候编写一些简单的网络通讯把这标准加密应用添加进来乎一下子把程序变得复杂了,而实现自己的加密算法那就更加不可取;其实通过一些现有的加密的技术应用完全可以实现即简单又安全的网络通讯程序。首先保证网络通讯安全有两个方面,第一保证连接的有效性,其二就是保证内容即使被人拦截也难以从内容得到相关信息。

连接有效性

平常写网络程序在允许一个连接接入操作的时候,我们一般要对它进行一个有效性验证,如提供用户名密码或签名。

签名:

通过用户提供一分数据和数据相关签名信息,对方进行一个有效性验证。那这个数据和签名数据怎么做呢,其实现有加密技术中已经有一种描述提供了这种解决方案那就是RSA(非对称加密)。可以通过 RSA 的持有privatekey和publickey方进行一个数据签名,对方通过publickey进行一个验证.如果publickey和privatekey是配对的情况,那持有publickey就能验证成功,否则就会验证失败。在连接进行操作前可以通过这种方式进行处理,签名有效允许连接操作,无效的话可以直接把连接关闭。

下面介绍通过c#如何实现这种签名:

1
2
3
4
5
6
RasCrypto pri = new RasCrypto();
RasCrypto pub = new RasCrypto();
pub.PublicKey = pri.PublicKey;
string name = "henry";
string singdata = pri.Sign(name);
Console.WriteLine(pub.Verify(name, singdata));

RasCrypto是通过封装的类,源代码可以通过https://smarkdata.svn.codeplex.com/svn/Smark/Smark.Core/Smark.Core/RasCrypto.cs获取;在实际使用中最好是根据不同签名有不同的密对,这样即使某签名的密对被盗也不会影响其他用户的安全。

用户名密码:

基于用户名和密码验证是一种很常见的方式,但有个问题就是如何保证用户名和密码在通讯过程即使被截取了也难以得到用户名和密码呢?其实通过 RSA 也能够很好地解决这一问题。 RSA 提供public key加密而private key解密的方式,可以把public key提供给请求方就行了,private key保存在服务端;这样就可以保证加密的东西只有服务端才有解密,即使加密信息被其他人拦截也难以获取原有信息。

下面介绍通过c#使用ras进行加解密

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
RasCrypto server = new RasCrypto();
RasCrypto client = new RasCrypto();
client.PublicKey = server.PublicKey;
string name = "henry";
string pwd = "123456";
string ename = client.Encrypt(name);
string epwd = client.Encrypt(pwd);
string dname = server.Decrypt(ename);
string dpwd = server.Decrypt(epwd);
Console.WriteLine("name:{0}", name);
Console.WriteLine("pwd:{0}", pwd);
Console.WriteLine("-----------------------------------------------------------");
Console.WriteLine("ename:{0}", ename);
Console.WriteLine("epwd:{0}", epwd);
Console.WriteLine("-----------------------------------------------------------");
Console.WriteLine("dname:{0}", dname);
Console.WriteLine("dpwd:{0}", dpwd);
Console.WriteLine("-----------------------------------------------------------");

为了应用更安全,针对不同的连接生成不同的RSA密对,这样就能保证每个连接的各自安全性.

信息加密

前面提到的 RSA 可以进行数据加解密,其安全性也非常可靠;但有个缺点就是RSA对数据比多的时候加密比较慢,有些 RSA 加密的实现还有数据长度的限制。所以在很多情况下就要选择别的加密方式,这里介绍DES(对称加密)。不过对称加密有个缺点就是密对双方都必须一样,这样就会导致一个问题就从某一方获取密对就能对数据加密和解密工作。所以对称加的密对保护就显示非常重要的,这个工作可以交给 RSA 来做。

以下是c#运用 RSA +DES的加解密方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
RasCrypto server = new RasCrypto();
 RasCrypto client = new RasCrypto();
 client.PublicKey = server.PublicKey;
 DESCrypto serverdes = new DESCrypto();
 DESCrypto clientdes = new DESCrypto();
 //获取没加密的key,iv
 DESCrypto.DESInfo info = clientdes.KeyInfo;
 Console.WriteLine("KEY: "+Smark.Core.Functions.ToString(info.Key));
 Console.WriteLine("IV: "+Smark.Core.Functions.ToString(info.IV));
 Console.WriteLine("");
 //设置相应的RSA信息
 serverdes.PrivateRas = server;
 clientdes.PublicRas = client;
 //获取了设置RSA信息的key,iv
 info = clientdes.KeyInfo;
 Console.WriteLine("KEY: " + Smark.Core.Functions.ToString(info.Key));
 Console.WriteLine("IV: " + Smark.Core.Functions.ToString(info.IV));
 //数据加密
 serverdes.KeyInfo = info;
 string value = "henryfan@msn.com", evalue = null, dvalue = null;
 evalue = serverdes.Encrypt(value);
 dvalue = clientdes.Decrypt(evalue);
 Console.WriteLine("VALUE: " + value);
 Console.WriteLine("EVALUE: " + evalue);
 Console.WriteLine("DVALUE: " + dvalue);
 Console.WriteLine("");
 evalue = clientdes.Encrypt(value);
 dvalue = serverdes.Decrypt(evalue);
 Console.WriteLine("VALUE: " + value);
 Console.WriteLine("EVALUE: " + evalue);
 Console.WriteLine("DVALUE: " + dvalue);
 Console.WriteLine("");
 Console.Read();

通过RSA和DES就能够简单地实现可靠的网络通讯安全,不过有些朋友喜欢构建自己的加密方法,在这里并不见意这样做;因为自己构建的加密方法的可靠性并没有得到验证,并不像现有的加密方法经过长时候实践和大量的应用总结出来。

相关资料:

DES http://zh.wikipedia.org/wiki/%E8%B3%87%E6%96%99%E5%8A%A0%E5%AF%86%E6%A8%99%E6%BA%96

RSA http://zh.wikipedia.org/wiki/RSA%E5%8A%A0%E5%AF%86%E6%BC%94%E7%AE%97%E6%B3%95

c#组件设计交流群:47164588 
c# socket :136485198 微博http://weibo.com/ikende

tcp/ip网络通讯安全加密方法的更多相关文章

  1. tcp/ip (网络通讯协议)

    介绍 TCP: 传输控制协议, IP: 网际协议, TCP/IP: 供已连接互联网的计算机之间进行通信的通信协议 在tcp/ip内部 , 包含一系列处理数据通信的协议: tcp.udp.icmp.dh ...

  2. JAVA TCP/IP网络通讯编程(二)

    一个实例通过client端和server端通讯 客户端通过TCP/IP传输资源文件,比如图片,文字,音频,视频等..... 服务端接受到文件存入本地磁盘,返回接受到:“收到来自于"+s.ge ...

  3. JAVA TCP/IP网络通讯编程(一)

    一个实例通过client端和server端通讯 客户端发送:“我是客户端,请多关照” 服务端回复:“收到来自于"+s.getInetAddress().getHostName()+" ...

  4. (转) HTTP & HTTPS网络协议重点总结(基于SSL/TLS的握手、TCP/IP协议基础、加密学)

    HTTP & HTTPS网络协议重点总结(基于SSL/TLS的握手.TCP/IP协议基础.加密学) 原文:http://blog.csdn.net/itermeng/article/detai ...

  5. tcp/ip网络里的客户端和服务器端 信息交流 与 安全

    ISP(Internet Service Provider) 互联网服务提供商, 即向广大用户综合提供互联网接入业务.信息业务.和增值业务的电信运营商. 通过wireshark学习tcp/ip. 用w ...

  6. TCP/IP网络协议

    OSI七层模型 OSI采用了分层的结构化技术,共分七层,物理层.数据链路层.网络层.传输层.会话层.表示层.应用层. TCP/IP模型 OSI模型比较复杂且学术化,所以我们实际使用的TCP/IP模型, ...

  7. 对TCP/IP网络协议的深入浅出归纳

    前段时间做了一个开发,涉及到网络编程,开发过程比较顺利,但任务完成后始终觉得有一些疑惑.主要是因为对网络协议不太熟悉,对一些概念也没弄清楚.后来 我花了一些时间去了解这些网络协议,现在对TCP/IP网 ...

  8. 浅谈TCP/IP网络编程中socket的行为

    我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: 1. TCP/IP协议(如连接的建立和终止.重传和确认.滑动窗口和拥塞控制等等) 2. Socket I/O系统 ...

  9. 转:对TCP/IP网络协议的深入浅出归纳

    转自:http://blog.jobbole.com/74795/ 前段时间做了一个开发,涉及到网络编程,开发过程比较顺利,但任务完成后始终觉得有一些疑惑.主要是因为对网络协议不太熟悉,对一些概念也没 ...

随机推荐

  1. 【Kubernetes】kube-dns 持续重启

    kuberbetes部署和启动正常,但是kube-dns持续重启 使用命令 kubectl get pods --all-namespaces 得到结果 从图中可以看出kube-dns-c7d8589 ...

  2. Epic Moments

    网络流序号要考虑超级源和超级汇 SAP要记得即使还原当前弧 二分图匹配中v.w要取局部变量 RMQ时记得开大数组 树链剖分记得结点要变为线段树中的下标

  3. [luoguP2801] 教主的魔法(二分 + 分块)

    传送门 以为对于这类问题线段树都能解决,分块比线段树菜,结果培训完才知道线段树是一种特殊的分块方法,有的分块的题线段树不能做,看来分块还是有必要学的. 对于这个题,先分块,然后另开一个数组对于每个块内 ...

  4. JS变量写到HTML页面中并修改变量值(前台处理数据序号问题)

    有时候我们在前台需要对序号进行处理,我们需要将JS变量写到页面中进行显示. 第一种方式:后台处理 第二种方式:JS中定义全局变量,然后进行显示,可以书写一个JS函数对不同的需要进行不同的替换,也就可以 ...

  5. Educational Codeforces Round 37 (Rated for Div. 2) G

    G. List Of Integers time limit per test 5 seconds memory limit per test 256 megabytes input standard ...

  6. [Bzoj4521][Cqoi2016]手机号码(数位dp)

    4521: [Cqoi2016]手机号码 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 870  Solved: 505[Submit][Status ...

  7. Antivius for Linux

    http://www.clamav.net/   https://www.avast.com/zh-cn/linux-server-antivirus   http://www.f-prot.com/ ...

  8. 选带傅里叶变换(zoom-fft)

    选带傅里叶变换的原理大家能够看书.大致的步骤为 移频 (将选带的中心频率移动到零频) 数字低通滤波器  (防止频率混叠) 又一次採样  (将採样的数据再次间隔採样,间隔的数据取决于分析的带宽,就是放大 ...

  9. 【OpenCV新手教程之十四】OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26977557 作者:毛星云(浅墨) ...

  10. ym——优化你的Java代码(新)

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! 1.面向对象的3要素. 2.面向对象开发的6大原则. 1.单一职责原则 应该有且仅有一 ...