IPSEC实验报告.docx
- 文档编号:9447574
- 上传时间:2023-05-19
- 格式:DOCX
- 页数:36
- 大小:78.80KB
IPSEC实验报告.docx
《IPSEC实验报告.docx》由会员分享,可在线阅读,更多相关《IPSEC实验报告.docx(36页珍藏版)》请在冰点文库上搜索。
IPSEC实验报告
《IPSEC协议实验》
实验报告
姓名:
刘相
学号:
P1*******
学校:
华北计算技术研究所
1.1实验目的
通过IPSEC协议实验,使学生加深对IPSEC协议的认识,同时对IPSEC协议实现的工
作模式、AH协议和ESP协议有一个初步的认识,通过这个实验,同学们也可以增进对于网
络安全协议的理解。
1.2实验要求
1)传输模式报文处理(AH协议)
2)隧道模式报文处理(ESP协议)
3)混合模式报文处理(AH协议+ESP协议)
4)3des加密算法实现(ESP协议)
1.3实验内容
1)传输模式报文处理(AH协议);
根据系统提供的已经建立安全联盟的信息,对于接收到的报文和发送的报文,在IPSEC
传输模式的工作状态下,根据AH协议使用系统提供的认证算法对报文进行相应的处理。
2)隧道模式报文处理(ESP协议);
根据系统提供的已经建立安全联盟的信息,对于接收到的报文和需要发送的报文,在
IPSEC隧道模式的工作状态下,根据ESP协议使用系统提供的认证和加密算法对报文进行
相应的处理。
3)混合模式报文处理(AH协议+ESP协议);
根据系统提供的已经建立安全联盟的信息,对于接收到的报文和需要发送的报文,在
IPSEC混合模式的工作状态下,根据AH协议和ESP协议使用系统提供的认证和加密算法
对报文进行相应的处理。
4)3DES加密算法实现(ESP协议);
根据系统提供的已经建立安全联盟的信息,对于接收到的报文和需要发送的报文,在
IPSEC传输模式的工作状态下,根据ESP协议通过使用自行实现的3des加密算法对报文进
行相应的处理。
1.4实验内容介绍
1.4.1IPSEC协议介绍
1.4.1.1协议简述
IPsec(InternetProtocolSecurity)即Intenet安全协议,是IETF提供Internet安全通信的一系列规范,它提供私有信息通过公用网的安全保障。
IPSec适用于目前的版本IPv4和下一代IPv6。
由于IPSec在TCP/IP协议的核心层——IP层实现,因此可以有效地保护各种上层协议,并为各种安全服务提供一个统一的平台。
IPSec也是被下一代Internet所采用的网络安全协议。
IPSec协议是现在VPN开发中使用的最广泛的一种协议,它有可能在将来成为IPVPN的标准。
IPsec使用两个不同的协议——AH和ESP来确保通信的认证、完整性和机密性。
它既可以保护整个IP数据报也可以只保护上层协议。
适当的模式称为:
隧道模式和传送模式。
在隧道模式下,IP数据报被IPsec协议完全加密成新的数据报;在传送模式下,仅仅是有效
负荷被IPsec协议将IPsec头插入IP头和上层协议头之间来搬运。
为保护IP数据报的完整性,IPsec协议使用了“散列信息认证代码”(HMAC:
hashmessageauthenticationcodes)。
为了得到这个“散列信息认证代码”,IPsec使用了像MD5和SHA这样的散列算法根据一个密钥和数据报的内容来生成一个“散列”。
这个“散列信息认证代码”包含在IPsec协议头并且数据包接受者可以检查“散列信息认证代码”(当然前提是可以访问密钥)。
为了保证数据报的机密性,IPsec协议使用对称加密算法。
IPsec标准需要NULL和DES执行者。
如今经常使用像3DES、AES和Blowfish这样更加强的算法。
为了避免拒绝服务攻击(DoS:
denialofserviceattacks),IPsec协议使用了一个滑动窗口,每个数据包被分配到一个序号,并且只接受在不在窗口中的或新的数据包。
旧的数据包立即丢弃。
这可以避免重复攻击,即:
攻击者记录原始的数据并稍后再次重发。
本实验的设计中没有加入抗重播服务。
通信的双方为了能够加密和解密IPsec数据包,他们需要一种方法来保存通信的密钥、
算法和IP地址等有关信息。
所有的这些用来保护IP数据报的参数保存在一个“安全联盟”
(SA:
securityassociation)中。
“安全联盟”依次保存在一个“安全联盟”数据库(SAD:
securityassociationdatabase)中。
每个“安全联盟”定义了以下参数:
1)结果IPsec头中的源IP地址和目标IP地址。
这是IPsec双方保护数据包IP地址
2)IPsec协议(AH还是ESP)。
3)IPsec协议用的加密算法和密钥。
4)IPsec协议用的认证算法和密钥。
5)安全参数索引(SPI)。
这是一个32位的数据,用来识别“安全联盟”(SA)。
6)IPsec模式(隧道模式或者传输模式)。
因为“安全联盟”定义了源IP地址和目标IP地址,在一个全双工IPsec通信中,它只能保护一个方向的通信。
如果想保护双方的通信,IPsec需要两个单向的“安全联盟”。
“安全联盟”仅仅声明IPsec支持保护通信。
需要定义另外的信息来声明什么时候通信需要保护。
这些信息保存在“安全策略”(SP:
securitypolicy)中,“安全策略”又依次保存在“安全策略库”(SPD:
securitypolicydatabase)中。
一个“安全策略”通常声明下列参数:
1)被保护的数据包的源地址和目标地址。
在传输模式下,这同SA的地址相同。
在隧道模式下,他们可能不一样。
2)被保护的协议或端口。
一些IPsec执行者不允许定义被保护的协议,这种
情况下将保护所有涉及到的IP地址之间的通信。
3)用来保护数据包的“安全联盟”
1.4.1.2AH协议、ESP协议及3DES加密算法介绍
IPsec协议包括两个协议:
认证头协议(AH:
AuthenticationHeader)和封装安全负载协议(ESP:
EncapsulatedSecurityPayload)。
两者都独立于IP协议。
认证头协议使用IP协议的51,封装安全负载协议使用IP协议50。
1.AH协议
认证头协议保护IP双数据报的的完整性。
为了达到这一点,认证头协议计算了一个“散
列信息认证代码”(HMAC)来保护完整性。
当计算一个“散列信息认证代码”时,认证头协
议基于它的密钥、有效负载和IP头的不可变的部分(如IP地址)。
然后它将认证头放到数
据包里。
认证头共长24个字节。
第一个字节是“下一个头”字段,这个字段指定了下边协议的
头。
在遂道模式下,一个完整的IP数据报被封装,因此这个字段的值是4。
在传送模式下,
当被封装的是TCP数据报时相应的值是6。
下一个字节指定了的有效负载的长度。
这个字段
下边是两个保留字节。
再下边两个字节指定了32位长的安全参数索引(SPI:
Security
ParameterIndex)。
安全参数索引指定了解安全负载封装使用的“安全联盟”。
32位长的
序号防止重复攻击。
最后96位保存了“散列信息认证代码”(HMAC)。
“散列信息认证代
码”保护了数据包的完整性,因为只有双方知道可以创建和检查“散列信息认证代码”的密
钥。
因为认证头协议保护了IP数据包括IP头的不可变的部分(如IP地址),认证头协议不允许网络地址转换(NAT:
NetworkAddressTranslation)。
网络地址转换将IP头的IP地址(通常是源IP地址)改为不同的IP地址,当改变后“散列信息认证代码”就不再有效了。
IPsec协议的“横越网络地址转换”(NAT-Traversal)扩展围绕这一限制实现了一条道路。
下图显示了认证头的结构。
ØNextHeader:
该字段长度为8位,指明在AH协议头后的有效载荷的协议类型。
ØPayloadlen:
该字段长度为8位,指明在AH协议头后的有效载荷的长度。
ØRESERVED:
该字段长度为16位,是预留位,默认值为全零。
ØSecurityParametersIndex:
该字段长度为32位,它与目的地址和AH认证协议唯一的标识一个安全连接。
ØSequenceNumberField:
该字段长度为32位,是一个累加的值,为这个安全连接提供了抗重播功能,初始化为0,第一个包的值为1。
ØAuthenticationData:
该字段为可变长度,但是必须是32的整数倍,用来存放报文完整性校验值。
2.ESP协议
安全负载封装协议既可以使用“散列信息认证代码”来确保数据包的完整性,又可以使
用加密算法保证机密性。
在加密数据包并计算出“散列信息认证代码”后,生成安全负载封
装头并加入数据包。
安全负载封装头的第一个双字字段指定了安全参数索引(SPI),这个“索引”指定了解安全负载封装数据包用到的“安全联盟”。
下一个双字字段保存序号。
序号被用来预防重复攻击。
第三个双字字段指定了加密程序使用的“初始向量”(IV:
InitializationVector)。
不使用“初始向量”对称加密算法可能被多次攻击。
“初始向量”可以确保两个相同的负载被加密成不同的负载。
IPsec使用密码块来进行加密处理。
因此,如果负载的长度不是声的整倍长时可能需要
填补。
这时需要增加填补长度。
下边的两个字节是填补长度。
“下一个头”字段指定了下一
个头。
“安全负载封装”头的最后96位长是“散列信息认证代码”,用来确保数据包的完
整性。
这个“散列信息认证代码”仅仅统计数据包的负载。
IP头不包括在计算之列。
SPI是一个任意的32位值,它与目的IP地址和安全协议(ESP)结合,唯一地标识这个数据报的SA。
ØSequenceNumber:
这个无符号的、32位字段包含一个单调递增的计数器值(序列号)。
ØPayloadData:
有效载荷数据是变长字段,它包含下一个头字段描述的数据。
ØPadding:
供加密使用的填充字段,字节数为(0-255)。
ØPadLength:
填充字段的长度。
ØNextHeader:
该字段为8位字节,表识有效载荷字段中数据的类型。
ØAuthenticationData:
验证字段用来存放ESP报文的完整性校验值,该字段可选,只有SA选择验证服务的时候,才包含验证数据字段。
3.3DES加密算法
3DES是DES加密算法的一种模式,它使用3条64位的密钥对数据进行三次加密。
数据加密标准(DES)是美国的一种由来已久的加密标准,它使用对称密钥加密法,并于1981
年被ANSI组织规范为ANSIX.3.92。
DES使用56位密钥和密码块的方法,而在密码块的方
法中,文本被分成64位大小的文本块然后再进行加密。
比起最初的DES,3DES更为安全。
3DES(即TripleDES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为
过渡的加密标准),是DES的一个更安全的变形。
它以DES为基本模块,通过组合分组方法设计出分组加密算法,其具体实现如下:
设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密表,这样,
加密过程为:
C=Ek3(Dk2(Ek1(P)))
解密过程为:
P=Dk1((EK2(Dk3(C)))
K1、K2、K3决定了算法的安全性,若三个密钥互不相同,本质上就相当于用一个长为
168位的密钥进行加密。
多年来,它在对付强力攻击时是比较安全的。
若数据对安全性要求
不那么高,K1可以等于K3。
在这种情况下,密钥的有效长度为112位。
(1)先使用密钥1通过des加密算法对明文1加密,得到密文1
(2)再用密钥2通过des解密算法对密文1解密,得到明文2(肯定不是原来的明文)
(3)最后再用密钥3对明文2用des加密算法加密,得到密文2。
注意:
本实验设计中的安全联盟只提供两个密钥,即在加密过程中密钥3用密钥1代替,
这样总共密钥就是128位了,并且在ESP协议使用3DES加密算法对报文加密时没有加入初
始化向量。
1.4.2需要实现的接口函数
1)收到ipsec报文事件处理函数
intstud_ipsec_input(char*pBuffer,unsignedintlen)
参数:
pBuffer:
指向当前接收报文的指针
len:
接收到的ipsec报文长度
返回值:
0:
成功解封装ipsec报文
1:
解封装过程出现错误
1.4.3数据结构以及宏定义
系统定义了安全策略头结构定义,如下:
typedefstructipsecSpdHeader
{
structipsecPolicySelector*spSelector;//指向当前接口安全策略数据库的头
指针
structipsecAssoc*spSA;//指向当前接口安全联盟数据库的头指针
}IPSEC_SPD_HEADER;
系统定义安全策略结构定义,如下:
typedefstructipsecPolicySelector
{
structipsecPolicySelector*next;//指向下一条安全策略条目
DWORDsrcAddr;//安全策略中数据流的源地址
DWORDdstAddr;//安全策略中数据流的目的地址
DWORDsrcPref;//安全策略中数据流源地址的前缀
DWORDdstPref;//安全策略中数据流目的地址的前缀
}IPSEC_POLICY_SELECTOR;
系统定义的安全联盟密钥结构定义,如下:
typedefstructipsecSaKey
{
BYTEkeyNum;/*thenumberofkeys*/
unsignedshortkeyBits;/*bitsofonekey*/
BYTEkey[1];/*keybits/8*/
}IPSEC_SA_KEY;
系统定义的安全联盟结构定义,如下:
typedefstructipsecAssoc
{
structipsecAssoc*next;//指向下一条安全联盟的指针
structipsecAssocSelectorselector;//安全联盟对应的数据流
DWORDsrcAddr;//当前安全联盟的起始地址
DWORDdstAddr;//安全联盟的目的地址
BYTEproto;//安全联盟所使用的协议(AH或者ESP)
BYTEmode;//安全联盟的工作模式(隧道模式或者传输模式)
DWORDspi;//安全联盟的索引号
BYTEalgAuth;//安全联盟所使用的认证算法名称
BYTEalgEncry;//安全联盟所使用的加密算法名称
structipsecSaKey*keyAuth;//安全认证密钥
structipsecSaKey*keyEncry;//安全联盟加密密钥1(DES加密算法的密钥,
3DES加密算法的密钥1)
structipsecSaKey*keyEncry2;//安全联盟加密密钥2(3DES加密算法的密钥2)
DWORDivLen;//安全联盟初始化向量长度(单位为字节)
BYTEiv[20];//安全联盟初始化向量
}IPSEC_ASSOC;
系统定义了安全联盟对应数据流的结构体如下:
typedefstructipsecAssocSelector
{
DWORDsrcAddr;//数据流源地址
DWORDdstAddr;//数据流目的地址
DWORDsrcPref;//数据流源地址前缀
DWORDdstPref;//数据流目的地址前缀
unsignedshortupperProto;//数据流上层协议号
}IPSEC_ASSOC_SELECTOR;
系统定义了加密算法结构如下:
typedefstructespAlgorithm
{
unsignedintivLen;//初始化向量长度(单位为字节)
constchar*name;//算法名称
/*加密算法函数指针*/
int(*encrypt)(unsignedchar*plainText,unsignedintplainLen,unsignedchar
*encryText,unsignedint*encryLen,char*pKeys,char*iv);
/*解密算法函数指针*/
int(*decrypt)(unsignedchar*pEncryText,unsignedintencryLen,unsignedchar
*pPlainText,unsignedint*pPlainLen,char*pKeys,char*iv);
/*填充函数指针*/
int(*padding)(unsignedchar*pOriginalText,unsignedintoriginalLen,unsignedchar
**pPaddingText,unsignedint*paddedLen,unsignedcharnxtHdr);
}ESP_ALGORITHM;
系统定义了认证算法结构如下:
typedefstructahAlgorithm
{
unsignedintdigestSize;//认证摘要数据长度(单位为比特)
unsignedintdataLen;//源数据长度(单位为比特)
constchar*name;//认证算法名称
void(*hashInit)(IKE_MD5_CTX*ctx_hash);/*initializecontext*/
void(*hashUpdate)(IKE_MD5_CTX*ctx_hash,constunsignedchar*input,unsigned
intlen);/*addinputtohash*/
void(*hashFinal)(unsignedchar*output,IKE_MD5_CTX*ctx_hash);/*finalize
hash*/
}AH_ALGORITHM;
系统定义了ESP协议结构如下:
typedefstructipsec_esp
{
unsignedintspi;/*安全索引号*/
unsignedintseq;/*序列号*/
}IPSEC_ESP;
系统定义了AH协议结构如下:
typedefstructipsec_ah
{
BYTEah_nxt;//下一头
BYTEah_len;//认证数据长度
unsignedshortah_reserved;//保留位
DWORDah_spi;//安全索引号
DWORDah_seq;//序列号
}IPSEC_AH;
系统定义了如下宏:
#defineIPSEC_AUTH_MD51//MD5认证算法
#defineIPSEC_ENCRY_DES1//DES加密算法
#defineIPSEC_ENCRY_3DES2//3DES加密算法
#defineIPSEC_MODE_TUNNEL1//隧道模式
#defineIPSEC_MODE_TRANSPORT2//传输模式
#defineIPSEC_PROTO_AH1//AH协议
#defineIPSEC_PROTO_ESP2//ESP协议
1.4.4系统提供的接口函数及全局变量
1)系统接收报文函数
voidipsec_Receive_process(char*pBuffer,intdwLen)
参数:
pBuffer:
指向当前解封装完毕报文的指针
len:
接收到解封装完毕报文长度
返回值:
无
说明:
学生在完成对IPSEC报文解封装后,将报文交给该函数进行处理。
2)系统发送报文函数
voidipsec_Send_process(char*pBuffer,intiLen)
参数:
pBuffer:
指向当前封装完毕报文的指针
len:
接收到解封装完毕报文长度
返回值:
无
说明:
学生在完成对普通报文的封装后,将报文交给该函数进行处理。
3)认证算法查找函数
AH_ALGORITHM*ahAlgorithmLookup(unsignedcharalgAuth)
参数:
algAuth:
认证算法名称
返回值:
存储有关认证算法信息的结构体指针
说明:
学生在从安全联盟中获得当前所使用的认证算法名称,通过该函数获得系统提供的认证
算法函数接口以及相关信息。
4)加密算法查找函数
ESP_ALGORITHM*espAlgorithmLookup(unsignedcharalgEncry)
参数:
algEncry:
加密算法名称
返回值:
存储有关加密算法信息的结构体指针
说明:
学生在从安全联盟中获得当前所使用的加密算法名称,通过该函数获得系统提供的加密
算法函数接口以及相关信息。
5)AH协议认证摘要计算函数
intah4CalculateICV(unsignedchar*pPacketCpy,unsignedshorttotalLen,
unsignedchar*pOutput,constAH_ALGORITHM*pAlg,
IPSEC_ASSOC*pSA)
参数:
pPacketCpy:
指向源报文拷贝的指针(请注意是源数据的拷贝,从IP报头开始)
totalLen:
源报文长度
pOutput:
指向存储计算出报文摘要信息的指针
pAlg:
认证算法结构体指针
pSA:
安全联盟指针
返回值:
失败:
-1
成功:
0
说明:
学生根据系统提供的这个函数来计算当前AH协议报文中的认证数据摘要。
6)ESP协议认证摘要计算函数
intespAuthCalculate(unsignedchar*pData,unsignedshortdataLen,
unsignedchar*pOutput,AH_ALGORITHM*pAlg,IPSEC_ASSOC*pSA)
参数:
pData:
指向源报文ESP报头的指针
dataLen:
需要计算认证摘要的报文长度
pOutput:
指向存储计算出的报文摘要信息的指针
pAlg:
认证算法结构体指针
pSA:
安全联盟指针
返回值:
失败:
-1
成功:
0
说明:
学生根据系统提供的这个函数来计算当前ESP协议报文中的认证数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- IPSEC 实验 报告