当前位置: 首页 > news >正文

网络安全期末大论文

最近整理一下电脑,发现了这个论文,为了造福大学生,特意发了这个文章。我记得没有查重的,打印出来的。

《网络安全》

学生姓名     

学    号     

所属学院  信息科学与工程学院

专    业       软件工程      

班    级       软件21-2  

教    师       

《网络安全》课程论文

作者

摘 要: 随着信息技术的迅猛发展,网络安全问题日益凸显。本文旨在通过课程实践,深入探讨网络安全的相关知识,以期提升对网络安全的理解和应对能力。论文首先利用sniffer工具分析了IP头和TCP头的结构,进一步理解了网络通信的底层机制。其次,通过实现加解密程序,增强了在实际应用中保护数据安全的能力。此外,手工完成了RSA公钥密码体制算法加密运算,加深了对非对称加密的理解。最后,通过在Kali系统上探索网络工具,实际操作了各种黑客工具,对网络安全有了更直观的认识。在学习过程中,对网络安全整体视角有了更深入的理解,并结合国家安全和个人专业素质培养进行了思考。

关键词:网络安全;sniffer工具;加解密程序;RSA算法;Kali系统

1.前言

随着信息技术的飞速发展,网络已经渗透到社会生活的各个领域,成为人类生活、工作和交流的重要平台。然而,伴随而来的是日益严峻的网络安全问题。从个人隐私泄露、数据篡改到国家关键基础设施遭受攻击,网络安全事件频发,严重威胁着社会稳定与国家安全。因此,深入研究和掌握网络安全技术及其应用方法,培养具备网络安全防护能力的专业人才显得至关重要。

本篇论文以网络安全课程实践为依托,旨在通过实际操作和理论学习相结合的方式,全面剖析网络通信协议的安全机制,深度探索密码学在保障信息安全中的核心作用,并通过实战演练熟悉黑客工具以及安全防护策略。同时,结合国家安全和个人专业素质培养的角度,深化对网络安全的整体认识。

2.目的和意义

2目的和意义:

2.1目的:

(1) 理解并掌握网络协议(如IP和TCP)头部结构及其安全特性,利用sniffer工具进行抓包分析,直观呈现IP头和TCP三次握手过程。

(2)实现并验证多种加解密算法,特别是通过手工实现RSA公开秘钥密码体制,进一步理解非对称加密原理及其实战应用。

(3) 掌握Kali Linux等网络安全专业工具,通过对其中某一网络工具的实践使用,提高网络攻防技术的实际操作能力。

(4)结合理论知识与实践经验,提炼一到两个重要知识点,分享个人在网络安全课程学习中的心得体会。

(5) 从宏观角度审视网络安全的重要性,探讨其在国家安全和个人专业素质培养方面的深远意义。

2.2意义:

撰写这篇论文不仅有助于巩固和提升作者在网络通信安全、密码学以及网络安全实战技能等方面的知识与技能,更具有以下几方面的现实意义:

(1)提高对网络安全隐患的认识,促进科学有效的网络安全策略和措施的制定与实施;

(2)培养应对网络攻击的快速反应能力和防御技巧,增强维护国家安全的信息安全保障力量;

(3)激发更多人关注和投身网络安全行业,为我国乃至全球网络安全人才队伍输送具有扎实理论基础和丰富实践经验的专业人才;

(4)通过具体案例和实践经验,引导广大读者深刻理解网络安全对于个人隐私保护、企业运营安全和社会公共利益的重要性。

3.论文任务

本次课程大作业主要是对以下几点的认真落实:

3.1、利用sniffer工具,分析IP头的结构。(请附上截图)。

A主机:

B主机:

sniffer设置:

抓包后结果:

分析:

IP:Version = 4 header length = 20 bytes

指的是 IP 协议的版本号为 4,并且 IP 头部(header)的长度为 20 字节。

IP 协议是互联网协议(Internet Protocol)的简称,是用于在互联网上传输数据的一种协议。IP 协议的版本号决定了该协议的特性和功能。版本号 4 指的是 IPv4,是目前广泛使用的 IP 协议版本。

IP 头部(header)是 IP 数据报文的一部分,包含了用于路由和转发数据报的信息,如源地址、目的地址、生存时间(TTL)等。IP 头部的长度是固定的,为 20 字节,其中包含了必要的字段和填充。这意味着无论 IP 数据报的具体内容有多长或多短,IP 头部的长度始终为 20 字节。

IP: Type of service = 00

表示IP数据包的Type of Service(服务类型)字段的值为00。

在IP协议中,Type of Service字段用于表示数据包的服务质量(QoS)需求。这个字段包含了8位,其中前6位是Type of Service(ToS)字段,后2位是未使用位。

oS字段用于表示数据包的服务类型,包括:

路由优化(Router Optimization)

最小延迟(Minimize Delay)

最大吞吐量(Maximize Throughput)

最小成本(Minimize Cost)

通常服务(Normal Service)

设置为00,表示没有特定的服务质量要求,没有特定的服务类型或优先级要求。

IP: Total length= 46 bytes

表示IP数据包的总长度为46字节。

IP数据包的总长度是指IP头部和数据部分的总和。这个长度通常用于表示IP数据包的大小,以便在网络中进行传输和处理。IP数据包的总长度为46字节,这意味着该数据包包含一个完整的IP头部和一定长度的数据。

IP: Identification=17502表示这个特定的IP数据报或者其相关的分片具有标识符值为17502

在IP(Internet Protocol)数据报头中,Identification(标识符)字段是一个16位的字段,用于标识一个IP数据报。当发送的数据报长度超过了路径中任何网络设备的MTU(Maximum Transmission Unit,最大传输单元)时,该数据报必须被分片。每个分片的Identification字段都会设置成相同的值,以便接收方能够正确地重组这些分片。

IP: Flags = 4X

表示该IP数据包是一个不可分片的数据包,需要完整地发送。

IP数据包的Flags字段用于指示数据包的标志位,用于控制数据包的传输和路由。Flags字段包含3位,其中X位表示未使用的标志位,而4表示该数据包是一个“不可分片”的数据包。

“不可分片”的标志位意味着该数据包不能被分割成多个片段进行传输。如果一个数据包设置了不可分片的标志位,那么它必须完整地发送,不能被分割。这个标志位通常用于一些需要完整传输的数据包,如ICMP(Internet Control Message Protocol)或一些实时应用的数据包。

IP: Fragnent offset = 0 bytes

表示这是原始数据报的第一个分片,它包含了从数据报起始位置开始的数据。

Fragment Offset值为0字节,表示该数据包是原始数据流中的第一个片段。这个值有助于在接收端重新组装原始的IP数据包,将各个片段按正确的顺序组合起来。

IP: Time to live= 128 seconds/hops

表示该数据包在网络中最多可以经过128个路由器或网络设备,或者最多可以存活128秒。如果数据包在网络中经过的路由器或设备数超过这个限制,或者存活时间超过这个限制,数据包将被丢弃。

IP: Protocol     = 6   (TCP)

表示:"Protocol"字段是用来标识封装在IP数据报(IP Datagram)载荷中的上层协议类型。当这个字段的值为6时,它表示承载的数据部分是使用TCP(Transmission Control Protocol,传输控制协议)封装的。

IP: Header checksum = 5805 (correct)

表示接收端计算出的校验和值为5805,与头部中的校验和值相同,因此该数据包的头部是正确的,没有发生错误。该IP数据包头部的校验和值是5805,且根据计算结果,这个值被认为是正确的,即在传输过程中头部数据没有发生错误或损坏。

IP: Source address=[192.168.110.139]

表示IP数据包的源IP地址为192.168.110.139。

IP: Destination address=[192.168.110.138]

表示IP数据包的目的IP地址为192.168.110.138。

IP: No options

表示IP数据包的头部没有使用选项字段。

3.2、利用sniffer工具,分析TCP头的结构,并分析TCP的三次握手过程。(请附上截图)。

TCP: Source port             =2583

Source port = 2583 表示这个TCP连接的源端口是2583。源端口是数据包从哪个进程或服务发送出来的端口。端口是一个16位的整数,用于标识不同的服务和进程。

TCP: Destination port        =    21 (FTP-ctrl)

表示这个TCP连接的目标端口是21,并且这个端口是用于FTP(文件传输协议)的控制连接。

TCP: Initial sequence number = 2272858810

表示这个TCP连接的第一个数据包的序列号是2272858810。这个序列号是由发送端生成的,并且在每次建立TCP连接时都会变化。它有助于接收端将收到的数据包正确地排序和重组为原始的字节流。

TCP连接的三次握手过程中,发送SYN同步分组的一方选择了一个初始序列号为2272858810的数值。这个数值随后会被接收方用来确认 SYN+ACK 分组,并作为后续数据传输过程中的起始序列号基准。

TCP的初始序列号(Initial Sequence Number, ISN)是用于标识TCP连接中的第一个数据包的一个32位整数。这个序列号用于确保数据包的顺序和完整性

TCP: Next expected Seq number= 2272858811

表示接收方正在等待来自发送方的下一个TCP数据段,并期望其序列号(Sequence Number)为2272858811。

TCP: Data offset             = 28 bytes

表示TCP头部(TCP Header)的长度是28字节。TCP头部结构包含多个字段,用于控制和维护TCP连接的可靠传输。每个字段占据特定数量的比特位,合起来构成了整个TCP头部。Data Offset值为28时,则表示头部长度是28 * 4 = 112字节。

TCP: Reserved Bits: Reserved for Future Use (Not shown in the Hex Dump)

保留位:保留以备将来使用(未显示在十六进制转储中)在TCP协议中,有一些保留位(Reserved Bits)用于将来使用,这些位在十六进制表示中通常不显示。保留位是为了适应未来可能的变化和扩展而预留的,目前尚未使用。

TCP: Flags                   =02

TCP标志位(Flags)是TCP协议中用于指示和控制TCP连接状态的一些位字段。标志位在TCP头部的特定位置进行设置,用于指示TCP段的各种属性和行为。

TCP: Flags = 02 表示ACK标志被设置为1,意味着该TCP数据段包含了有效的确认序列号(ACKnowledgment Number),用于告知发送方接收方已成功接收到某个特定的数据段。

TCP: Window                  =64240

TCP: Window = 64240 表示这个TCP连接的窗口大小设置为64240字节,接收方当前可以接收最多64,240字节的数据,而无需发送确认。

TCP: Checksuns               = 8568(correct)

"Checksum = 8568" 指的是该TCP数据段计算出的校验和数值为8568。

"(correct)" 表示这个校验和经过验证是正确的,即接收方在接收到数据后重新计算了校验和,并且得出的结果与报头中携带的校验和值相匹配。

TCP: Urgent pointer          =0

表示当前的数据段不包含任何紧急信息。即使有紧急数据,也在之前的数据段中已经全部发送完毕。TCP的紧急指针(Urgent Pointer)是一个16位的值,用于标识紧随紧急数据之后的数据偏移量。当TCP发送端发送紧急数据时,接收端会设置紧急指针,以指示紧随紧急数据之后的数据在接收端缓冲区中的位置。

TCP: Options follow

表示这个TCP段包含一个或多个选项字段。常见的TCP选项包括最大段大小(MSS)、窗口扩大(Window Scale)、时间戳(Timestamps)等。

TCP: Maxinum segment size    = 1460

表示该连接上发送的数据段最大有效载荷为1460字节。

TCP的最大段大小(Maximum Segment Size, MSS)是TCP协议中定义的一个参数,它表示TCP段中数据的最大长度。MSS的大小取决于底层网络协议(如以太网)的最大传输单元(MTU)大小。

TCP: No-Operation

表示该选项字段不执行任何操作。

TCP: No-Operation

项通常用于填充TCP头部,以确保TCP头部长度是4字节的倍数。

TCP: SACK-Permitted Option

表示TCP协议中的一项可选功能,全称为Selective Acknowledgment Permitted。当这个选项启用时,表明通信双方支持并允许使用选择性确认(Selective Acknowledgment, SACK)机制。

TCP协议的三次握手信息:

主机1:192.168.110.139

主机2: 192.168.110.138

第一次握手:主机1首先向主机2的服务器发送连接请求,携带同步序号SYN=1和初始序号SEQ=2272858810。主机1向发送TCP请求

携带的信息:D=21 5=2583 SYN SEQ=2272858810 IEN=O WIN=64240

第二次握手:服务器同意建立连接,向主机1发送确认,携带同步序号SYN=1和确认号ACK=2272858811以及一个初始序号SEQ=1858504107。主机2向主机1表面接好了

携带的信息:D=2583 S=21 SYN ACK=2272858811 5EQ=1858504107 LEN=O WIN=64240

第三次握手:然后主机1再向主机2的服务器发送确认收到,确认号ACK=1858504108。表明携带可以传输数据了

携带信息:D=21 S=2583 ACK=1858504108 WIN=64240

3.3、实现一个或几个加解密程序。(详见《密码学及应用实验部分》(附截图)。[2]

//一下是加强版替换密码算法

#include<stdio.h>

#include<string.h>

//字符列表 ,下表对应每个字符,后面的密钥包括大小写字母和数字,后面的.,是明文的

//Z-52, -66,9-62

char charter[100]="0abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

/**

 *字符转数字,利用ascll码,来判断字符在charter的位置

 *

 */

int char_to_num(char ch)

{

    int num;

    if(ch<='z'&&ch>='a') num=ch-96;

    if(ch<='Z'&&ch>='A') num=ch-64+26;

    if(ch<='9'&&ch>='0') num=ch-47+52;

    return num;

}

/**

 *获取移动的距离,

 *原理是先获取密钥在charter数组对应的位置,也就是字符转数字,

 * 再将这些数字全部相加,就是移动的距离了

 */

int getmove(char key[])

{

    int keylen=strlen(key);

    int move=0;

    int i;

   

    for(i=0;i<keylen;i++)

    {

       move+=char_to_num(key[i]);

    }

    return move;

}

char* enc(char key[],char text[])

{

    int textlen=strlen(text);

    int move=getmove(key);//获取需要移动的距离

    int textnum;

    int i;

   

    for(i=0;i<textlen;i++)

    {

       textnum=char_to_num(text[i]);

       textnum=(textnum+move)%62;//向右边移动move个字符,%62是为了防止超出62

       if(textnum==0) textnum=62;//如果如果刚好移动到'9',也就是第62个字符,与62相mod,会等于0的所以需要调回来

       text[i]=charter[textnum];

    }

   

    return text;

}

/**解密

  *

  *先获取移动的距离。再将每个字符向左移动 到求出的距离即可

  *

  */

 

char* dec(char key[],char text[])

{

    int move=getmove(key);

    int i;

    int textlen=strlen(text);

    int textnum;

   

    for(i=0;i<textlen;i++)

    {

       textnum=char_to_num(text[i]);

       textnum=(textnum%62-move%62+62)%62;//防止溢出所以+62

       if(textnum==0) textnum=62;

       text[i]=charter[textnum];

    }

   

    return text;

}

int main()

{

    printf("改版替换密码\n");

    while(1)

    {

       char key[100000],text[100000],textlen=0,x,selt,*result;

      

       printf("1.加密  2.解密: 0.退出\n");

       scanf("%d",&selt);

      

        if(selt==0)break;

       if(selt==1) printf("请输入明文:");

       if(selt==2) printf("请输入密文:");

       scanf("%s",text);

       printf("请输入密钥:");

       scanf("%s",key);

      

       if(selt==1)

       {

           printf("加密后:%s\n",enc(key,text));

          

       }

       else if(selt==2)

       {

           printf("解密后:%s\n",dec(key,text));

       }

       printf("\n\n");

    }

    return 0;

}

截图:

//一下是变异版的替换算法

//原版本的密钥只是个数字,现在版本是字符串

#include<stdio.h>

#include<string.h>

using namespace std;

char charter[100]="0abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

//英文转为字母

int char_to_num(char ch)

{

    int num;

    if(ch<='z'&&ch>='a') num=ch-96;

    if(ch<='Z'&&ch>='A') num=ch-64+26;

    if(ch<='9'&&ch>='0') num=ch-47+52;

    return num;

}

//加密,将密钥的每个字符转化为数字,然后每个明文往后移动,移动的距离为每个密钥转换的数字

//比如密钥转换的数字为123,明文为hzcuyw,则h往后移动1变为 i,z往后移动两位变为 B,

//c往后移动三个,为f, 此时密钥最后一个用完,又重头开始,u变为v,y变z,w变x,一次类推,

//直到每个明文都被加密完成,解密则是反过来

char* enc(char key[],char text[])

{

    int i;

    int lenkey=strlen(key);

    int keynum[10000];

    int lentext=strlen(text);

    int textnum;

    int cnt=0;

   

    for(i=0;i<lenkey;i++)

    {

       keynum[i]=char_to_num(key[i]);//将密钥每个字符转化为数字

    }

    for(i=0;i<lentext;i++)

    {

       textnum=char_to_num(text[i]);

       textnum=(textnum+keynum[cnt++])%62;

       if(textnum==0) textnum=62;//如果如果刚好移动到'9',也就是第62个字符,与62相mod,会等于0的所以需要调回来

       text[i]=charter[textnum];

       if(cnt==lenkey)cnt=0;

    }

    return text;

}

char* dec(char key[],char text[])

{

    int i;

    int lenkey=strlen(key);

    int keynum[10000];

    int lentext=strlen(text);

    int textnum;

    int cnt=0;

   

    for(i=0;i<lenkey;i++)

    {

       keynum[i]=char_to_num(key[i]);//将密钥每个字符转化为数字

    }

    for(i=0;i<lentext;i++)

    {

       textnum=char_to_num(text[i]);

       textnum=(textnum%62-keynum[cnt++]%62+62)%62;

       if(textnum==0) textnum=62;//如果如果刚好移动到'9',也就是第62个字符,与62相mod,会等于0的所以需要调回来

       text[i]=charter[textnum];

       if(cnt==lenkey)cnt=0;

    }

    return text;

}

int main()

{

    while(1)

    {

       char key[100000],text[100000],textlen=0,x,selt,*result;

      

       printf("1.加密  2.解密: 0.退出\n");

       scanf("%d",&selt);

      

       if(selt==0)break;

       if(selt==1) printf("请输入明文:");

       if(selt==2) printf("请输入密文:");

       scanf("%s",text);

       printf("请输入密钥:");

       scanf("%s",key);

      

       if(selt==1)

       {

           printf("加密后:%s\n",enc(key,text));

          

       }

       else if(selt==2)

       {

           printf("解密后:%s\n",dec(key,text));

       }

       printf("\n\n");

    }

    return 0;

}

//普通版本的置换密码

#include<iostream>

#include<string.h>

#include<algorithm>

using namespace std;

char charter[100]="0abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

struct Node

{

    int i;//原本的位置

    int cnt;//字母表中的位置 ,也就是字母转数字的数字

    char text;

};

int cmp(Node a,Node b)

{

    if(a.cnt==b.cnt) return a.i<b.i;

    return a.cnt<b.cnt;

}

int char_to_num(char ch)

{

    int num;

    if(ch<='z'&&ch>='a') num=ch-96;

    if(ch<='Z'&&ch>='A') num=ch-64+26;

    if(ch<='9'&&ch>='0') num=ch-47+52;

    return num;

}

//置换密码,解密的置换先将密钥原本的位置,和在charter的位置共同保存在结构体 ,加密的时候将明文与密钥保存在同一个结构体中,

//后将结构体进行排序,排序后,按照顺序将明文进行输出,就是密文

char* displace(char key[],int lenkey,char intcp[])//密钥的长度与 intcp的长度相同

{

    Node sl[10000];//Save location保存位置

    char sae;

    int i;

    for( i=0;i<lenkey;i++)

    {

       sl[i].i=i;

       sl[i].cnt=char_to_num(key[i]);

       sl[i].text=intcp[i];

    }

    sort(sl,sl+lenkey,cmp);//进行交换

    for(int i=0;i<lenkey;i++)

    {

        intcp[i]=sl[i].text;

    }

    return intcp;

}

//解密的置换先将密钥原本的位置记位i,和在charter的位置记为cnt共同保存在结构体

//后进行结构体的排序,按照 在charter的位置进行先后排序,若相等,就按原本位置 排序

// 后面将明文当前的字符放到与密钥原本位置相同的位置,就可进行解密

char* decdisplace(char key[],int lenkey,char intcp[])//密钥的长度与 intcp的长度相同

{

    Node sl[10000];//Save location保存位置

    char sae[10000];

    int i;

    for( i=0;i<lenkey;i++)

    {

       sl[i].i=i;

       sl[i].cnt=char_to_num(key[i]);

       sl[i].text=intcp[i];

    }

    sort(sl,sl+lenkey,cmp);//进行交换

    for(int i=0;i<lenkey;i++)

    {

        sae[sl[i].i]=intcp[i];

    }

    memset(intcp,'\0',sizeof(intcp));

    strcat(intcp,sae);

    return intcp;

}

char* enc(char key[],char text[])

{

    int lenkey=strlen(key);

    int lentext=strlen(text);

    char intcp[10000];//intercept截取,截取与密钥等长的明文

    int lenin =0; //intcp数组里面有多少个字符

    char cpt[10000];//ciphertext密文

    memset(cpt,'\0',sizeof(cpt));

    for(int i=0;i<lentext;i++)

    {

       intcp[lenin++]=text[i];

       if(lenin==lenkey)

       {

           displace(key,lenkey,intcp);

           strcat(cpt,intcp);

           memset(intcp,'\0',sizeof(intcp));

           lenin=0;

       }

       if(lenin!=0&&i==(lentext-1))

       {

           displace(key,lenin,intcp);

           strcat(cpt,intcp);

           memset(intcp,'\0',sizeof(intcp));

       }

    }

    memset(text,'\0',sizeof(text));

    strcat(text,cpt);

    return text;

}

char* dec(char key[],char text[])

{

    int lenkey=strlen(key);

    int lentext=strlen(text);

    char intcp[10000];//intercept截取,截取与密钥等长的明文

    int lenin =0; //intcp数组里面有多少个字符

    char cpt[10000];//ciphertext密文

    memset(cpt,'\0',sizeof(cpt));

    for(int i=0;i<lentext;i++)

    {

       intcp[lenin++]=text[i];

       if(lenin==lenkey)

       {

           decdisplace(key,lenkey,intcp);

           strcat(cpt,intcp);

           memset(intcp,'\0',sizeof(intcp));

           lenin=0;

       }

       if(lenin!=0&&i==lentext-1)

       {

           displace(key,lenin,intcp);

           strcat(cpt,intcp);

           memset(intcp,'\0',sizeof(intcp));

       }

    }

    memset(text,'\0',sizeof(text));

    strcat(text,cpt);

    return text; 

}

int main()

{

    printf("置换密码\n");

    while(1)

    {

       char key[100000],text[100000],textlen=0,x,selt,*result;

      

       printf("1.加密  2.解密: 0.退出\n");

       scanf("%d",&selt);

      

       if(selt==0)break;

       if(selt==1) printf("请输入明文:");

       if(selt==2) printf("请输入密文:");

       scanf("%s",text);

       printf("请输入密钥:");

       scanf("%s",key);

      

       if(selt==1)

       {

           printf("加密后:%s\n",enc(key,text));

          

       }

       else if(selt==2)

       {

           printf("解密后:%s\n",dec(key,text));

       }

       printf("\n\n");

    }

    return 0;

}

//一下时加强版本的置换密码算法,具体是变异版替换密码算法+普通版本置换密码

#include<stdio.h>

#include<string.h>

using namespace std;

char charter[100]="0abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

//英文转为字母

int char_to_num(char ch)

{

    int num;

    if(ch<='z'&&ch>='a') num=ch-96;

    if(ch<='Z'&&ch>='A') num=ch-64+26;

    if(ch<='9'&&ch>='0') num=ch-47+52;

    return num;

}

//加密,将密钥的每个字符转化为数字,然后每个明文往后移动,移动的距离为每个密钥转换的数字

//比如密钥转换的数字为123,明文为hzcuyw,则h往后移动1变为 i,z往后移动两位变为 B,

//c往后移动三个,为f, 此时密钥最后一个用完,又重头开始,u变为v,y变z,w变x,一次类推,

//直到每个明文都被加密完成,解密则是反过来

char* enc(char key[],char text[])

{

    int i;

    int lenkey=strlen(key);

    int keynum[10000];

    int lentext=strlen(text);

    int textnum;

    int cnt=0;

   

    for(i=0;i<lenkey;i++)

    {

       keynum[i]=char_to_num(key[i]);//将密钥每个字符转化为数字

    }

    for(i=0;i<lentext;i++)

    {

       textnum=char_to_num(text[i]);

       textnum=(textnum+keynum[cnt++])%62;

       if(textnum==0) textnum=62;//如果如果刚好移动到'9',也就是第62个字符,与62相mod,会等于0的所以需要调回来

       text[i]=charter[textnum];

       if(cnt==lenkey)cnt=0;

    }

    return text;

}

char* dec(char key[],char text[])

{

    int i;

    int lenkey=strlen(key);

    int keynum[10000];

    int lentext=strlen(text);

    int textnum;

    int cnt=0;

   

    for(i=0;i<lenkey;i++)

    {

       keynum[i]=char_to_num(key[i]);//将密钥每个字符转化为数字

    }

    for(i=0;i<lentext;i++)

    {

       textnum=char_to_num(text[i]);

       textnum=(textnum%62-keynum[cnt++]%62+62)%62;

       if(textnum==0) textnum=62;//如果如果刚好移动到'9',也就是第62个字符,与62相mod,会等于0的所以需要调回来

       text[i]=charter[textnum];

       if(cnt==lenkey)cnt=0;

    }

    return text;

}

//加密,将密钥的每个字符转化为数字,然后每个明文往后移动,移动的距离为每个密钥转换的数字

//比如密钥转换的数字为123,明文为hzcuyw,则h往后移动1变为 i,z往后移动两位变为 B,

//c往后移动三个,为f, 此时密钥最后一个用完,又重头开始,u变为v,y变z,w变x,一次类推,

//直到每个明文都被加密完成,解密则是反过来

char* replace_enc(char key[],char text[])

{

    int i;

    int lenkey=strlen(key);

    int keynum[10000];

    int lentext=strlen(text);

    int textnum;

    int cnt=0;

   

    for(i=0;i<lenkey;i++)

    {

       keynum[i]=char_to_num(key[i]);//将密钥每个字符转化为数字

    }

    for(i=0;i<lentext;i++)

    {

       textnum=char_to_num(text[i]);

       textnum=(textnum+keynum[cnt++])%62;

       if(textnum==0) textnum=62;//如果如果刚好移动到'9',也就是第62个字符,与62相mod,会等于0的所以需要调回来

       text[i]=charter[textnum];

       if(cnt==lenkey)cnt=0;

    }

    return text;

}

char* replace_dec(char key[],char text[])

{

    int i;

    int lenkey=strlen(key);

    int keynum[10000];

    int lentext=strlen(text);

    int textnum;

    int cnt=0;

   

    for(i=0;i<lenkey;i++)

    {

       keynum[i]=char_to_num(key[i]);//将密钥每个字符转化为数字

    }

    for(i=0;i<lentext;i++)

    {

       textnum=char_to_num(text[i]);

       textnum=(textnum%62-keynum[cnt++]%62+62)%62;

       if(textnum==0) textnum=62;//如果如果刚好移动到'9',也就是第62个字符,与62相mod,会等于0的所以需要调回来

       text[i]=charter[textnum];

       if(cnt==lenkey)cnt=0;

    }

    return text;

}

int main()

{

    while(1)

    {

       char key[100000],text[100000],textlen=0,x,selt,*result;

      

       printf("1.加密  2.解密: 0.退出\n");

       scanf("%d",&selt);

      

       if(selt==0)break;

       if(selt==1) printf("请输入明文:");

       if(selt==2) printf("请输入密文:");

       scanf("%s",text);

       printf("请输入密钥:");

       scanf("%s",key);

      

       if(selt==1)

       {

           printf("加密后:%s\n",enc(key,replace_enc(key,text)));

          

       }

       else if(selt==2)

       {

           printf("解密后:%s\n",dec(key,replace_dec(key,text)));

       }

       printf("\n\n");

    }

    return 0;

}

3.4、已知RSA算法中,素数p=5,q=7,模数n=35,公钥e=5,明文为bed,对明文进行加解密,使用手工完成RSA公开秘钥密码体制算法加密运算。字母数字映射表如下:

(1)设计公私密钥

由题目可知p=5,q=7,模数n=35,公钥e=5,

φ(n) = (p-1)×(q-1) = (5-1)×(7-1) = 24。5和24公约数为1,合适。

由于

e×d≡1 modφ(n)

也就是

e*dmodφ(n)=1modφ(n),

带入数值为

5*d mod 24 = 1 mod 24

5*d mod 24 = 1

当d=1时 ,5*d mod 24 = 5

当d=2时 ,5*d mod 24 = 10

当d=3时 ,5*d mod 24 = 15

当d=4时 ,5*d mod 24 = 20

当d=5时 ,5*d mod 24 = 1

d继续扩大,找不到5*d mod 24=1,所有d=5

所以公私密钥对为:(5,35),(5,35)

(1)英文数字化

由字母映射表可以得出,b对应的数字是02,e对应的数字是05,d对应的数字是04,所以明文bed转化为数字后是:020504。

(2)明文加密

就是将明文转换为数字后,对明文进行加密,加密公式为

C=me (mod n)    [注意:m指的是明文转换后的数字,C为密文

由C=m^e(mod n)得:

C1= 025(mod 35) = 32,

C2=055(mod 35) = 10,

C3= 045(mod 35) = 9,

加密后得到的密文为:321009。

(3)密文解密。

将密文两位两位的进行解密,需要用到密钥:(d,n)

公式为

E=Ce (mod n)    [注意:E为解密后的编码,C为密文]

由公式可得;

E1 = 325(mod 35) = 02

E2 = 105(mod 35) = 05

E3 = 095 (mod 35) = 04

由以上可得到解密后的编码020504

后通过编码,两位两位的对照字母数字映射表,明文为bed

3.5、Kali系统是一个集成各种黑客工具的linux镜像系统。在微云网盘下载kali-linux-2023.3-vmware-i386文件,解压后在vmware虚拟机中加载运行该系统,探索系统中某一个网络工具的使用。

我选择的是Wireshark

(1)打开的页面:

(2)转换为中文:

步骤:

点开后

再点击ok,即可

(3)基本的功能:

截取网络封包。指的是从网络中截取和分析数据包,并将有关数据包的资料显示出来。网络管理员使用它来检测网络问题,开发员可用它来为新的通讯协定除错

(4)基本使用方法

1、选择一个选择一个网络,然后用鼠标右键点击,选择Start capture,或者点击上方的选择栏的捕获,然后选择选项,再选择一个网络,点击开始就可以了

或者

就可开始抓包了,开始捕获该网络信息,开始抓取网络包.

一下是开始抓包的界面:

2执行抓包的操作,就是联网,与网络进行交互数据,如

ping www.baidu.com

操作后:相关数据包就抓取到了。ip.addr == 183.2.172.42  and icmp

为了防止没有用的数据包的存在,影响我们的分析判断,可以在列表上方的方框,输入条件,显示我们需要的数据包,这方框也叫过滤栏,

我输入ip.addr == 183.2.172.42  and icmp来过滤不需要的数据包。 "ip.addr == 183.2.172.42 and icmp" 是一个条件表达式,它用于过滤数据包或网络流量。“ip.addr == 183.2.172.42”这部分表示选择IP地址为183.2.172.42的数据包。“icmp”这部分表示选择ICMP(Internet Control Message Protocol)协议的数据包。整个表达式的意思是:选择IP地址为183.2.172.42并且是ICMP协议的数据包。

一下是结果:

下面是我搜索协议为http的数据包的结果

也可以点击列表中的一条信息显示数据详细区,数据字节区,

下图中方框1是数据包列表,从左到右分别是序号,时间,源地址,目的地址,协议,长度,信息,方框2是数据详细区,方框2是数据字节区,

设置过滤器也可以点击捕获->捕获过滤器

跳出如下画面

可点击左下角的+号进行添加过滤器,或者选择一个过滤器点击‘-’号进行删除过滤器

下图中方框1是数据包列表,从左到右分别是序号,时间,源地址,目的地址,协议,长度,信息,方框2是数据详细区,方框2是数据字节区,

3.6、

(1)结合一到两个最有体会或印象深刻的知识点(可以任选章节或具体算法协议等)谈谈自己对网络安全的学习心得;

学习网络安全的过程中,有两个核心知识点给我留下了深刻的印象,它们分别是加密算法和身份认证协议。

首先,在加密算法方面,我深入理解了对称密钥加密(如AES)和非对称密钥加密(如RSA)的重要性。对称密钥加密以其高效性适用于大量数据的加密传输,但在密钥分发和管理上存在挑战;而非对称密钥加密则巧妙地解决了密钥分发问题,尽管计算效率相对较低,但为诸如SSL/TLS协议中的密钥交换提供了基础保障。通过对比和实践这两种加密方式,我认识到安全性和效率之间的权衡对于网络安全设计至关重要。

其次,身份认证协议如Kerberos、OAuth和TLS握手协议使我更深入理解了如何在复杂的网络环境中实现用户和系统间的安全通信。例如,Kerberos协议利用 tickets 和 ticket-granting tickets 的概念,实现了强大的三方认证体系,防止中间人攻击并保护了用户凭证的安全。OAuth协议则在多个应用和服务之间提供了灵活、安全的授权机制,使得第三方应用能在无需获取用户密码的情况下访问用户的特定资源。同时,TLS握手协议展示了在TCP/IP通信中如何运用数字证书、公钥基础设施(PKI)和上述提及的加密算法,来确保客户端与服务器间的通信内容保密性和完整性。

通过对这些知识点的学习,我深刻体会到网络安全并非孤立的技术点,而是涵盖密码学、认证、授权、审计等多个领域的综合应用。实践中,我们需要不断地更新和完善安全策略,以应对不断变化的威胁环境和新型攻击手段,确保网络空间的信息资产得到妥善保护。同时,我也认识到,安全防护不仅要有坚实的技术支撑,更要培养用户的网络安全意识,做到技术与管理并举,才能构建更加稳固的网络安全防线。

(2)从网络安全的整体视角谈谈自己对网络安全的的理解和认识。要求结合国家安全和个人专业素质培养。

从网络安全的整体视角来看,其内涵和外延都极其丰富且深远。在当今高度信息化的时代背景下,网络安全已经成为国家治理、经济发展、社会运行和个人生活不可或缺的关键要素,它不仅涉及技术层面的安全防护,更涵盖了法律制度、政策规划、伦理道德以及教育培养等多个维度。

首先,从国家安全的高度审视,网络安全是维护国家主权与安全的重要防线。网络空间作为第五大主权领域,其稳定与安全直接影响到国家战略利益的实现。随着信息技术的广泛应用,关键信息基础设施如电力系统、通信网络、金融体系等均实现了深度数字化,一旦遭受高级持续性威胁(APT)或大规模分布式拒绝服务攻击(DDoS),可能导致国家重要部门陷入瘫痪,严重影响社会稳定和国家安全。因此,建立完善的网络安全防御体系,包括但不限于强化网络攻防能力、提升应急响应速度、制定并执行严谨的信息安全法规,是确保国家安全的重要举措。

其次,在国际关系领域,网络安全问题也日益凸显其重要性。各国在网络空间中的博弈加剧,网络战、网络间谍活动、信息战等新型冲突形式对传统安全观念带来挑战,促使我们必须积极参与全球网络治理,推动构建公正合理的网络空间国际秩序,为国家发展营造有利的外部环境。

再者,个人专业素质的培养对于网络安全同样具有决定性意义。面对日新月异的网络技术和层出不穷的网络威胁,每个公民都应具备基本的网络安全素养,学会识别和防范钓鱼网站、恶意软件、社交工程攻击等常见威胁。特别是对于信息技术专业的学生和从业人员,深入学习密码学原理、网络攻防技术、数据加密与解密方法、安全协议及标准等专业知识,能够有效提高应对复杂网络安全问题的能力,成为保障国家和社会网络安全的中坚力量。

此外,从人才培养的角度出发,我们需要在高等教育阶段加强网络安全课程体系建设,将理论教学与实践操作紧密结合,通过实验实训、案例分析、模拟对抗等多种方式,锻炼学生的实战技能和创新能力。同时,推进校企合作,鼓励企业参与高校网络安全人才的培养,以满足市场对网络安全专业人才的需求。

最后,网络安全的社会教育不容忽视。政府、学校、家庭和社区应当共同努力,普及网络安全知识,提高公众的网络安全意识,形成“人人关心网络安全、人人维护网络安全”的良好氛围。只有当每个人都意识到自己既是网络安全的受益者,也是网络安全的守护者时,才能真正构筑起坚固的全民网络安全防线。

综上所述,网络安全是一个涉及国家安全、个人职业发展以及社会整体进步的宏大命题。在全球化、信息化时代,我们必须从战略高度深刻理解和把握网络安全的全局性和长远性,不断优化和完善相关法律法规、技术研发、人才培养和社会教育等方面的工作,共同为构建一个安全、可信、有序的网络空间而努力奋斗。

4学习总结

通过对网络安全的学习,我对网络安全有了更深入的理解和认识。在网络安全的世界里,防护与攻击始终是并存的,这既是一个挑战,也是一个机遇。

首先,通过使用sniffer工具对IP头和TCP头的分析,我深入了解了网络通信的底层机制。IP头结构让我明白了IP地址的重要性以及它是如何帮助确定数据包的路由的。而TCP头结构则揭示了TCP/IP协议的工作原理,以及TCP如何确保数据的可靠传输。这些知识对于理解网络通信原理和解决网络问题至关重要。

其次,实现加解密程序的过程中,我深入学习了密码学的原理和应用。加密技术是保护数据安全的关键手段,通过实现加解密程序,我不仅掌握了加密和解密的算法原理,还学会了如何将这些原理应用到实际的数据保护中。

此外,手工完成RSA加密算法的运算让我对非对称加密有了更深入的理解。RSA算法以其创始人Ron Rivest、Adi Shamir和Leonard Adleman的名字首字母命名,是当前金融和许多其他领域广泛使用的公钥加密算法。通过手工完成RSA加密过程,我体会到了公钥密码体制的强大之处,也理解了其在实际应用中的重要性和复杂性。

在Kali系统的实践操作中,我探索了Wireshark工具的使用,对网络安全有了更直观的认识。Kali系统作为一个集成各种黑客工具的Linux镜像系统,为学习网络安全提供了丰富的资源和实践环境。通过在虚拟机中加载运行Kali系统,我实际操作了各种黑客工具,体验了网络抓包的过程,这对我理解网络传播数据以及提高安全防范能力都起到了积极的促进作用。

在网络安全的学习过程中,有两个知识点给我留下了深刻的印象。一是防火墙技术,它作为网络安全的第一道防线,对于保护网络免受未经授权的访问和攻击至关重要。通过学习防火墙的配置和使用,我理解了其在网络安全中的重要地位和作用。二是加密技术,它能够确保数据的机密性和完整性,防止数据被非法获取或篡改。通过学习和实现加密算法,我深入理解了加密技术在网络安全中的关键作用和应用方式。

对于网络安全的学习心得,我认为最重要的是理论与实践相结合。理论知识是基础,但只有通过实践才能真正掌握和运用这些知识。在学习过程中,我积极参与到课程的各种实践项目中,通过亲手操作和实践,加深了对网络安全的理解和掌握。同时,我也意识到了持续学习和更新知识的重要性。网络安全是一个快速发展的领域,新的攻击手段和防御技术不断涌现。为了保持安全防护的有效性,我们需要不断学习新的知识和技术,跟上发展的步伐。

从网络安全的整体视角来看,我认为网络安全不仅仅是技术问题,更是一种安全意识和文化的体现。我们每个人都应该具备基本的网络安全意识和技能,了解常见的网络威胁和攻击手段,学会保护自己的个人信息和数据安全。同时,国家也应该加强网络安全法律法规的建设,加大对网络犯罪的打击力度,为网络安全提供有力的法律保障。

此外,网络安全与国家安全密切相关。在网络时代,网络安全是国家安全的重要组成部分。一个国家的网络安全防护能力直接影响到国家的政治、经济和军事安全。因此,国家应该加强网络安全防御能力的建设,提高网络监测和应急响应的能力,确保国家的安全和稳定。

综上所述,通过本学期对网络安全的学习,我对网络安全有了更深入的理解和认识。我明白了网络安全的重要性以及我们每个人在其中的角色和责任。在未来,我将继续关注和学习网络安全领域的新知识和技术,不断提高自己的专业素质和能力水平。同时,我也将积极传播网络安全意识,帮助他人建立良好的安全习惯和防护措施,共同维护一个安全、稳定、繁荣的网络环境。

参考文献:

[1]   https://blog.csdn.net/zzwwhhpp/article/details/113077747

[2]   https://blog.csdn.net/lady_killer9/article/details/117399543

http://www.dtcms.com/a/393675.html

相关文章:

  • 23种设计模式之【工厂方法模式】-核心原理与 Java实践
  • cocos 添加背景,帧动画,贴图
  • 亚马逊云科技重磅推出 Amazon S3 Vectors:首款大规模支持原生向量的云存储服务
  • SQLite Expert:一款功能强大的SQLite管理工具
  • Python 2025:供应链安全威胁与防御实战
  • 队列+宽搜(BFS)-429.N叉树的层序遍历-力扣(LeetCode)
  • 【Linux命令从入门到精通系列指南】rm 命令详解:安全删除文件与目录的终极实战手册
  • Springboot使用dockerfile-maven-plugin部署镜像
  • 安卓蓝牙键盘和鼠标6.10.4去更新汉化版 手机变为蓝牙键盘和鼠标
  • 工作笔记-----lwip的内存管理策略解析
  • 量子计算学习笔记(1)
  • Python爬虫基础与应用
  • Rabbitmq 集群初始化,配置导入
  • 云计算与虚拟化技术详解
  • elasticsearch 的配制
  • React学习教程,从入门到精通,React Hook 详解 —— 语法知识点、使用方法与案例代码(26)
  • ELK日志分析性能瓶颈问题排查与解决实践指南
  • 【Unity】【Photon】Fusion2中的匹配API 学习笔记
  • (3-1) Html
  • 《人机协同的边界与价值:开放世界游戏系统重构中的AI工具实战指南》
  • 数据库造神计划第十九天---事务(2)
  • Python到剪映草稿生成及导出工具,构建全自动化视频剪辑/混剪流水线
  • WordPress给指定分类文章添加一个自动化高亮(一键复制)功能
  • 5分钟使用Dify实现《射雕英雄传》问答智能体Agent
  • 3. 认识 const
  • 云原生 vs 传统部署
  • 2.1、机器学习-模型评估指标与参数调优
  • 设计模式(C++)详解—享元模式(2)
  • Linux实用操作以及基础命令
  • 深入理解 Vue 插槽:从基础到高级用法