网络安全(2)-数据加解密

之前讲了身份认证,身份认证可以让我们确认收到的数据来自正确的发送者。但是传送的数据在经过中间节点的时候(或者在无线信道下并不需要经过中间节点,只要能够收到信号)可能会被偷听者收到,我们并不能阻止数据包被偷听者获取,因为数据包在在网线上或无线信道上传输,任何人都有可能通过信号接收设备获取传输的模拟信号,从而进一步解析得到以太网帧(或其他链路层协议帧)、IP报文、UDP/TCP报文、应用层数据.... 
    我们能做的就是让偷听者即使获取了我们传输的数据,也无法知道我们传的到底是什么,即对数据进行加密。

数据加解密

数据加解密算法分为两类:对称性加解密和非对称性加解密,前者如AES,DES,后者如RSA。

对称性加解密

对称性加解密的加密和解密相同的密钥,且能通过加密算法推导出解密算法,或者通过解密算法推导出加密算法。这种做法加解密速度快,适合于对大量数据进行加解密,但密钥管理困难(防止偷听者获取密钥和加解密算法)。 
    比如一个简单的对称性加解密可以为:加密时将数据每个字节都加3,解密时将每个字节都减3.3就可以视为一个密钥,加减操作视为加解密算法。 
    对称性加解密不安全,原因在于A和B之间要通过对称性加解密算法来进行加解密,他们就必须使用相同的算法以及密钥,而算法和密钥的协商也是需要传输数据包进行协商,协商的数据包被偷听者获取之后,偷听者就获取了加解密算法和密钥,从而在收到A或者B的数据之后可以对数据进行解密,当然也可以用加密算法加密自己的数据传给A或者B。

非对称性加解密

非对称性加解密需要两个密钥,公钥和私钥,使用公钥加密的数据只能用私钥解密,使用私钥加密的数据只能用公钥解密。 
    A若想和B通信,A可以先生成一个公钥和私钥,然后将公钥发送给B,B通过公钥加密数据,然后发送给A,A通过私钥解密获得数据;而如果中间有C偷窥了B发送的数据,但是C没有A的私钥无法解密。同样,B生成一对公钥和私钥,公钥发送给A,A用公钥加密数据发送给B,B收到数据后用私钥解密,中间数据被C窃取,C也无法解密。 
    非对称性加解密相比于对称性加解密安全,因为密钥非对称,公钥随便公开,只要私钥不在网络上传输,别人即使获得公钥,窃取了加密后的数据,也无法解密。但是,非对称加解密的算法复杂度较高,对于实时性的数据加密压力较大。所以一般使用的数据加解密方法是,使用非对称性加解密方法传输对称性加解密算法的密钥,传输数据时,用对称性加解密方法加解密。 
    常见的非对称性加密算法如RSA算法,RSA是三个人共同提出的,所以以三个人的姓氏首字母命名。它是基于大数的因式分解的数学难题而提出的,对一个大数进行因式分解,其复杂度相当高。 
RSA加密算法的原理见:RSA算法原理1RSA算法原理2

SSH 加密原理

SSH安全协议是一种非对称加密和对称加密算法的结合。 
1、首先服务端会通过非对称加密,产生一个公钥和一个私钥 
2、在客户端发起请求时,服务端将公钥暴露给客户端,这个公钥可以被任意暴露 
3、客户端在获取公钥之后,会先产生一个由256位随机数字组成的会话密钥,称为口令 
4、客户端通过公钥将这个口令加密,发送给服务器端 
5、服务器端通过私钥进行解密,获取到通讯口令 
6、之后客户端和服务端的信息传递,都使用这个口令进行对称的加密

密钥交换算法

如果要进行对称性加解密,通信双方需要使用相同的加解密算法和密钥,那么双方如何协商他们使用的密钥呢?一种方式是双方使用RSA等非对称性加密算法进行密钥的交换,还有一些其他的密钥交换算法,比如DH密钥交换算法: 
    DH密钥交换算法是基于计算离散对数的难度(对于RSA算法是基于大数的因式分解的难度).

离散对数的概念: 
原根:如果a是素数p的一个原根,那么数值: 
a mod p,a^2 mod p,…,a^(p-1) mod p 
是各不相同的整数,且以某种排列方式组成了从1到p-1的所有整数。 
离散对数:如果对于一个整数b和素数p的一个原根a,可以找到一个唯一的指数 i,使得: 
b =(a的i次方) mod p 其中0 ≦ i ≦ p-1 
那么指数i称为b的以a为基数的模p的离散对数。 
Diffie-Hellman 算法的有效性依赖于计算离散对数的难度,其含义是:当已知大素数p和它的一个原根a后,对给定的 b,要计算 i ,被认为是很困难的,而给定 i 计算b 却相对容易。 
Diffie-Hellman算法: 
假如用户A和用户B希望交换一个密钥。 
取素数p和整数a,a是p的一个原根,公开a和p。 
A选择随机数XA< p, 并计算 YA=a^XA mod p。 
B选择随机数XB< p,并计算 YB=a^XB mod p。 
每一方都将X保密而将Y公开让另一方得到。 
A计算密钥的方式是:K=(YB) ^XA mod p 
B计算密钥的方式是:K=(YA) ^XB mod p 
证明: 
(YB)^ XA mod p = (a^XB mod p)^ XA mod p 
= (a^XB)^ XA mod p = (a^XA) ^XB mod p (<-- 密钥即为 a^(XA*XB) mod p) 
=(a^XA mod p)^ XB mod p= (YA) ^XB mod p 
由于XA和XB是保密的,而第三方只有p、a、YB、YA可以利用,只有通过取离散对数来确定密钥,但对于大的素数p,计算离散对数是十分困难的。

+

时间: 2024-08-14 02:42:57

网络安全(2)-数据加解密的相关文章

数据加解密原理及私有CA的搭建以及撤销

简单罗列基础命令,只分享我的想法! 一.数据加/解密原理说明 客户端双方在互联网上通信,为了保证信息的安全,有了SSL协议,就是在TCP/IP模型传输层之上应用层之下,叫做安全的套接字层.目的就是为了把应用层的数据进行加密传递给客户端,而在Linux上实现这个协议或这个功能的软件就是OpenSSL. 原理其实就是,双方客户端的SSL层进行协商应用哪种加/解密的方式,ok,如果双方SSL达成一致,上层应用协议又通过SSL进行加密的话,那么双方在互联网上传输的数据就是加密的,这个加密之后的数据到达客

shiro框架学习-6-Shiro内置的Filter过滤器及数据加解密

1.  shiro的核心过滤器定义在枚举类DefaultFilter 中,一共有11个 ,配置哪个路径对应哪个拦截器进行处理 // // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // package org.apache.shiro.web.filter.mgt; import java.util.LinkedHashMap; import ja

php利用自定义key,对数据加解密的方法

客户端和服务端通信时,有个场景很常见,通过一个id作为url参数来回传递.假设现在业务上只有这个id标识,那么需要稍微安全一点的通信,对这个id进行加密传输,到服务端再进行解密.这里需要一个服务端进行保密的key,利用这个key进行加密和解密. 加解密的方法如下:$str是需要加解密的字符串,$key是自己定义的一个key // 加密 function encryptStr($str, $key){ $block = mcrypt_get_block_size('des', 'ecb'); $p

unity3d 数据加/解密

unity3D项目中的c#脚本加解密方法. 1.加密 1 /// <summary> 2 3 /// 内容加密 4 5 /// </summary> 6 7 /// <param name="ContentInfo">要加密内容</param> 8 9 /// <param name="strkey">key值</param> 10 11 /// <returns></retu

Java中使用OpenSSL生成的RSA公私钥进行数据加解密

RSA是什么:RSA公钥加密算法是1977年由Ron Rivest.Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的.RSA取名来自开发他们三者的名字.RSA是目前最有影响力的公钥加密算法,它能够 抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准.目前该加密方式广泛用于网上银行.数字签名等场合.RSA算法基于一个十分简单的 数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥. OpenSSL是什

使用RAS+AES对接口数据加解密

在实际开发中,会遇到两个系统之间传输数据,为了对传输的数据进行保护,需要发送方对接口数据进行加密,接收方对数据解密. 对数据加密,采用RSA+AES双重加密,是数据更加安全. 使用前提: 如果客户端本身存在安全问题,则无法保证数据的安全,如浏览器端JS变量存储了即将传输的用户密码,这个变量被其他非信任脚本或其他方式获取到了, 会导致数据泄露,这种问题并不是加密传输所能处理的.加密传输能保障数据,有一个前提,那就是对于本地动态生成的变量,就认为是安全的,是认为第三方无法获取的. 客户端加密过程主要

Android数据库安全解决方案,使用SQLCipher进行加解密

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952409 我们都知道,Android系统内置了SQLite数据库,并且提供了一整套的API用于对数据库进行增删改查操作.数据库存储是我们经常会使用到的一种存储方式,相信大多数朋友对它的使用方法都已经比较熟悉了吧.在Android中,我们既可以使用原生的SQL语句来对数据进行操作,也可以使用Android API提供的CRUD方法来对数据库进行操作,两种方式各有特点,选择使用哪

互联网服务器的实现过程需要考虑哪些安全问题 &amp; 加解密及哈希知识点

http://www.cnblogs.com/charlesblc/p/6341265.html 其中的一篇. 参考 https://zhuanlan.zhihu.com/p/20336461?refer=auxten 网络编程(四):互联网中TCP Socket服务器的实现过程需要考虑哪些安全问题? 在Internet环境下,安全问题我主要分为如下几类: 信息传输过程中被黑客窃取 服务器自身的安全 服务端数据的安全 首先,如果能用https,就尽量用https,能用nginx等常见服务器,就用

【转】使用SQLCipher进行加解密

我们都知道,Android系统内置了SQLite数据库,并且提供了一整套的API用于对数据库进行增删改查操作.数据库存储是我们经常会使用到的一种存储方式,相信大多数朋友对它的使用方法都已经比较熟悉了吧.在Android中,我们既可以使用原生的SQL语句来对数据进行操作,也可以使用Android API提供的CRUD方法来对数据库进行操作,两种方式各有特点,选择使用哪一种就全凭个人喜好了. 不过,使用SQLite来存储数据却存在着一个问题.因为大多数的Android手机都是Root过的,而Root