ESP傳輸模式拆解包流程

一、????? ESP簡介

? ? ? ?ESP,封裝安全載荷協議(Encapsulating SecurityPayloads),是一種Ipsec協議,用于對IP協議在傳輸過程中進行數據完整性度量、來源認證、加密以及防回放攻擊。可以單獨使用,也可以和AH一起使用。在ESP頭部之前的IPV4、IPV6或者拓展頭部,應該在Protocol(IPV4)或者Next Header(IPV6、拓展頭部)部分中包含50,表示引入了ESP協議。

?

二、????? ESP傳輸模式數據包結構

ESP的數據包結構如下:


ESP頭部:

(1) 安全參數索引SPI(32位):用來確定唯一的安全聯盟

(2) 序列號SequenceNumber(32位):用于保護接收端免受重復操作攻擊


ESP尾部:

(1) 填充Padding:字段長范圍為0-255,用于將明文擴充到需要加密的長度,同時隱藏載荷數據的真實長度。

(2) 填充長度PadLength(8位):表示填充的字節數

(3) 下一頭部NextHeader (8位):標志下一頭部的類型(被加密的數據類型)。


ESP驗證尾部:

(1)???鑒別數據Integrity Check Value-ICV(變長):在ESP數據包其他字段基礎上計算出的完整性校驗值。

?

? ? ? ?對數據的完整性驗證需要計算SPI、序列號、載荷數據以及ESP尾部。

? ? ? ?對數據的保密性驗證需要計算載荷數據以及ESP尾部。

?

三、????? ESP傳輸模式裝拆包流程

? ? ? ESP有兩種模式:隧道模式和傳輸模式。隧道模式將發送的整個數據報文作為一個數據整體來處理,在整段數據前加上新的IP進行傳輸,不修改原報文。

對于傳輸模式而言,需要拆解報文,對原報文的數據部分進行處理,加上ESP頭部后,再裝上原報文的IP部分。

? ? ? 對IPV4報文的處理過程示意圖如下:


?

? ? ?對IPV6報文的處理過程示意圖如下:


裝包過程(以IPV4協議為例):

1、? 將原IP報文的IP頭和數據報文部分分離,在數據報文部分的尾部添加ESP尾部。ESP尾部包含:選擇的加密算法需要對明文進行填充的數據Padding、填充長度Padding Length、下一頭部Next Header標注被加密的數據報文類型。

????

2、? 對第一步得到的整體信息(原數據報文和ESP尾部)進行加密。具體的加密算法以及密鑰由SA給出。


3、對第二步得到的已經加密的信息添加ESP頭部(SPI和序列號),組裝成Enchilada。


4、對第三步得到的Enchilada做摘要,得到完整性度量結果(ICV),附加在Enchilada尾部


5、在第四步得到的數據前加上原IP頭,將原IP頭中的Protocol中的值改成50,代表ESP



更清晰的轉換對比圖如下(以IPV4\TCP為例):



拆包過程:

1、數據接收方收到數據后,看到協議類型為50,知道這是一個ESP協議,查看ESP頭,通過SPI決定數據對應的SA.
2、計算Enchilada部分的ICV,與數據包尾部的ESP ICV進行比較,確定數據的完整性。
3、檢查Seq序列號,決定是否需要該數據信息。
4、根據SA提供的加密算法和密鑰,解密被加密的Enchilada數據,得到原數據報文和ESP尾部
5、根據ESP尾部的填充長度信息,找出填充字段的長度,刪去后得到原數據報文。
6、根據原IP頭的目的地址進行轉發。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384992.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384992.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384992.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

結構體成員內存對齊

#include<stdio.h> struct A {int A; };int main() {struct A a;printf("%d\n",sizeof(a));return 0; } 運行結果&#xff1a;4 #include<stdio.h> struct A {int a;int b&#xff1b; };int main() {struct A a;printf("%d\n",sizeof(a))…

C庫函數-fgets()

函數聲明&#xff1a;char *fgets(char *str,int n,FILE *stream) 函數介紹&#xff1a;從指定的stream流中讀取一行&#xff0c;并把它存儲在str所指向的字符串中。當讀取到&#xff08;n-1&#xff09;個字符時&#xff0c;獲取讀取到換行符時&#xff0c;或者到達文件末尾時…

linux內核netfilter模塊分析之:HOOKs點的注冊及調用

1: 為什么要寫這個東西?最近在找工作,之前netfilter 這一塊的代碼也認真地研究過&#xff0c;應該每個人都是這樣的你懂 不一定你能很準確的表達出來。 故一定要化些時間把這相關的東西總結一下。 0&#xff1a;相關文檔linux 下 nf_conntrack_tuple 跟蹤記錄 其中可以根據內…

指定結構體元素的位字段

struct B {char a:4; //a這個成員值占了4bitchar b:2;char c:2; } 占了1個字節 struct B {int a:4; //a這個成員值占了4bitchar b:2;char c:2; } 占了8個字節 控制LED燈的結構體&#xff1a; struct E {char a1:1;char a2:1;char a3:1;char a4:1;char a5:1;char a6:1;char a7:1…

網絡抓包工具 wireshark 入門教程

Wireshark&#xff08;前稱Ethereal&#xff09;是一個網絡數據包分析軟件。網絡數據包分析軟件的功能是截取網絡數據包&#xff0c;并盡可能顯示出最為詳細的網絡數據包數據。Wireshark使用WinPCAP作為接口&#xff0c;直接與網卡進行數據報文交換。網絡管理員使用Wireshark來…

結構體中指針

結構體中帶有指針的情況 #include<stdio.h>struct man {char *name;int age; };int main() {struct man m {"tom",20};printf("name %s, age %d\n",m.name,m.age);return 0; } 運行結果&#xff1a; exbotubuntu:~/wangqinghe/C/20190714$ gcc st…

python使用opencv提取視頻中的每一幀、最后一幀,并存儲成圖片

提取視頻每一幀存儲圖片 最近在搞視頻檢測問題&#xff0c;在用到將視頻分幀保存為圖片時&#xff0c;圖片可以保存&#xff0c;但是會出現(-215:Assertion failed) !_img.empty() in function cv::imwrite問題而不能正常運行&#xff0c;在檢查代碼、檢查路徑等措施均無果后&…

結構體參數

結構體作為函數參數&#xff1a; #include<stdio.h> #include<stdlib.h> #include<string.h>struct student {char name[10];int age; };void print_student(struct student s) {printf("name %s,age %d\n",s.name,s.age); } void set_studen…

線程間通信之eventfd

線程間通信之eventfd man手冊中的解釋&#xff1a; eventfd()創建了一個“eventfd對象”&#xff0c; 通過它能夠實現用戶態程序間(我覺得這里主要指線程而非進程)的等待/通知機制&#xff0c;以及內核態向用戶態通知的機制&#xff08;未考證&#xff09;。 此對象包含了一個…

【linux 開發】定時器使用setitimer

setitimer Linux 為每一個進程提供了 3 個 setitimer 間隔計時器&#xff1a; ITIMER_REAL&#xff1a;減少實際時間&#xff0c;到期的時候發出 SIGALRM 信號。ITIMER_VIRTUAL&#xff1a;減少有效時間 (進程執行的時間)&#xff0c;產生 SIGVTALRM 信號。ITIMER_PROF&#…

文件操作(寫)

/*** file.c ***/ #include<stdio.h>int main() {//用寫的方式打開一個文件 //w的意思是文件如果不存在&#xff0c;就建立一個文件&#xff0c;如果文件存在就覆蓋FILE *p fopen("/home/exbot/wangqinghe/C/20190716/file1.txt","w");fputs(&qu…

定時器timerfd

1.為什么要加入此定時器接口 linux2.6.25版本新增了timerfd這個供用戶程序使用的定時接口&#xff0c;這個接口基于文件描述符&#xff0c;當超時事件發生時&#xff0c;該文件描述符就變為可讀。我首次接觸這個新特性是在muduo網絡庫的定時器里看到的&#xff0c;那么新增一個…

文件操作(讀)

讀一行&#xff1a; #include<stdio.h> #include<string.h> #include<stdlib.h> const int maxn 10; int main() {char s[1024] {0};FILE *p fopen("/home/exbot/wangqinghe/C/20190716/file.txt","r");//第一個參數是一個內存地址&…

timerfd與epoll

linux timerfd系列函數總結 網上關于timerfd的文章很多&#xff0c;在這兒歸納總結一下方便以后使用&#xff0c;順便貼出一個timerfd配合epoll使用的簡單例子 一、timerfd系列函數 timerfd是Linux為用戶程序提供的一個定時器接口。這個接口基于文件描述符&#xff0c;通過文…

文件操作(解密加密)

文件加密&#xff1a; #include<stdio.h> #include<string.h> #include<stdlib.h>void code(char *s) {while(*s){(*s);s;} }int main() {char s[1024] {0};FILE *p fopen("/home/exbot/wangqinghe/C/20190716/file.txt","r");FILE *p…

linux僵尸進程產生的原因以及如何避免產生僵尸進程defunct

給進程設置僵尸狀態的目的是維護子進程的信息&#xff0c;以便父進程在以后某個時間獲取。這些信息包括子進程的進程ID、終止狀態以及資源利用信息(CPU時間&#xff0c;內存使用量等等)。如果一個進程終止&#xff0c;而該進程有子進程處于僵尸狀態&#xff0c;那么它的所有僵尸…

linux下僵尸進程(Defunct進程)的產生與避免

在測試基于 DirectFBGstreamer 的視頻聯播系統的一個 Demo 的時候&#xff0c;其中大量使用 system 調用的語句&#xff0c;例如在 menu 代碼中的 system("./play") &#xff0c;而且多次執行&#xff0c;這種情況下&#xff0c;在 ps -ef 列表中出現了大量的 defunc…

文件操作函數

fopen()函數參數&#xff1a; r 只讀的方式打開文件。 打開成功返回文件指針&#xff0c; 打開失敗返回NULL r 以讀寫方式打開文件。 文件必須存在 rb 以二進制模式讀寫文件&#xff0c;文件必須存在 rw 讀寫一個二進制文件&#xff0c;允許讀和寫 w 打開只寫文件&…

讀過的最好的epoll講解

首先我們來定義流的概念&#xff0c;一個流可以是文件&#xff0c;socket&#xff0c;pipe等等可以進行I/O操作的內核對象。 不管是文件&#xff0c;還是套接字&#xff0c;還是管道&#xff0c;我們都可以把他們看作流。 之后我們來討論I/O的操作&#xff0c;通過read&#xf…

文件操作函數(讀寫)

文件文本排序&#xff1a; 數組冒泡&#xff1a; #include<stdio.h>void swap(int *a,int *b) {int temp *a;*a *b;*b temp; }void bubble(int *p,int n) {int i;int j;for(i 0; i < n; i){for(j 1; j < n - i; j){if(p[j - 1] > p[j]){swap(&p[j-1],&…