当前位置:首页 » 编程语言 » c语言实现消息认证码
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言实现消息认证码

发布时间: 2022-12-26 16:18:07

c语言编写账号,密码登录怎么写

同意其他楼的说法,别以为这工作很简单,或者按键精灵简单。

建议你用循序渐进的思路

  1. 先实现在windows记事本里输入任意文字---这就是你说的类似按键精灵的操作,涉及到寻找窗口句柄、发送消息等windows api。

  2. 再实现在最基本的网站上的文本框里输入内容---也是类似找句柄,不过网页的结构层次很复杂,难以定位

  3. 最后再说登陆126这种,因为它可能有各种验证码等阻止自动化登陆的方法,别说c语言了,就是其他像python这种,也不是轻而易举就能绕过的

  4. 不排除126这种大型网站已经公开了邮箱api,不通过界面也可以访问你的邮件,这需要看官方文档

㈡ 关于mosquitto怎么用c语言实现消息的订阅和发送(mqtt)

1.目标:测试Mosquitto使用MQTT协议发消息的相关性能指标,包含发送速度,并发负载能力,资源占用,消息到达率。
2.MQTT协议简介:
1).建立长连接。客户端发起请求和服务端建立长连接,建立成功后,服务端会返回ACK(CONNACK)
2).客户端订阅:客户端发起订阅,订阅成功后,服务端会返回ACK(SUBACK)
3).发消息:发布者会给服务端发消息,服务端在把消息给合适的客户端。
Qos=0(服务质量):客户端消息收到后,不会发出ACK给服务端(PUBACK)。
Qos =1:服务端会发ACK给发布者,客户端收到消息后会发ACK给服务端。
4).取消订阅:客户端发起取消订阅,服务端返回ACK(UNSUBACK)
5)Pingreq&Pingresp:客户端和服务端会保持心跳。
3.存在问题:
1. 如何模拟出40W的用户
2. 如何长连接,订阅,发消息,取消订阅,Pingreq行为如何实现。
4. python开源库 Mosquitto.py,解决所有问题
1. 模拟40W用户
a)可以使用虚拟机和Mosquitto.py实现,具体为:一般一台虚拟机最多是6W+的模拟数据(需要修改句柄数,我使用5W),方法是Client_id可以简单的做出5W个来,然后调用Mosquitto里面的connect方法,建立长连接。准备8台虚拟机就可以实现40W客户端的模拟
2.行为的模拟
a)订阅:Mosquitto.subscribe / 发消息:Mosquitto.publish / 取消订阅:Mosquitto.unsubscribe。 简单一句话 Mosquitto库实现所有的行为.
5. 指标:发送速度,到达率,并发负载,资源占用。
a. 发送速度:服务端日志记录,分析解决
b. 到达率: 1.客户端记录下收到消息,分析计算。2.计算服务端收到的PUBACK(客户端收到消息返回的ACK),进行计算
c. 并发负载:5W 用户不断增加,注意观察服务端的负载情况。
e.资源占用:其实主要是cpu/mem/带宽:cpu多核的话需要观察top命令下的_id字段, mem可以观察free -h命令的剩余mem, 带宽可以使用mpstat进行观察
6. 可以遇见问题:
a. 模拟客户端的虚拟机需要修改句柄数才能支持5W的客户端模拟数量
b. 要先吃透MQTT协议的流程,吃透了进行测试会非常的方便
c. Clear session,设置为true则不为客户端保留休息,设置为false保留消息。其实就是客户端离线后在连接上可以收到之前推出的消息。

㈢ C语言的switch(Msg)

WNDCLASSEX是一个包含窗体各种参数的结构体,例如窗口风格(是模态、非模态、有无系统菜单、有无边框等等),窗体实例句柄,窗体消息处理函数等等.
WNDCLASSEX在winuser.h中被定义
typedef WNDCLASSEXW WNDCLASSEX,*LPWNDCLASSEX,*PWNDCLASSEX;
而WNDCLASSEXW也在winuser.h中被定义为:
typedef struct _WNDCLASSEXW {
UINT cbSize;//WNDCLASSEX 的大小
UINT style;//窗口风格
WNDPROC lpfnWndProc;//窗体消息处理函数的指针
int cbClsExtra;//紧跟在窗口类结构后的附加字节数
int cbWndExtra;//跟在窗口实例后的附加字节数
HINSTANCE hInstance;//窗体实例句柄
HICON hIcon;//窗体图标句柄
HCURSOR hCursor;//光标句柄
HBRUSH hbrBackground;//背景画刷背景
LPCWSTR lpszMenuName;//菜单名的const wchar_t类型的指针
LPCWSTR lpszClassName;//类名的const wchar_t类型的指针
HICON hIconSm;//和窗口类关联的小图标
} WNDCLASSEXW, *LPWNDCLASSEXW, *PWNDCLASSEXW;

HWND是窗体的句柄类型
在windef.h中被定义
DECLARE_HANDLE(HWND);
而在winnt中有#define DECLARE_HANDLE(n) typedef HANDLE n
和#define DECLARE_HANDLE(n) typedef struct n##__{int i;}*n

MSG是Windows消息的结构体,当产生消息时被推送到消息队列,等待处理,例如右击时会生成右击消息的MSG,消息会记录接收消息的窗体的句柄,和消息类型:WM_RBUTTONDOWN,消息产生时的鼠标的坐标,把消息投递到消息队列,Windows会把消息一条条地取出,根据接收者投递给它们的消息处理函数
LRESULT CALLBACK WindowProcere (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
witch (message)
{
...
}
}

MSG在winuser.h中被定义为
typedef struct tagMSG {
HWND hwnd;//接收消息的窗体的句柄
UINT message;//消息ID, 例如WM_CLOSE、WM_MOUSEMOVE
WPARAM wParam;//消息参数, 含义随message的不同而不同
LPARAM lParam;//消息参数, 含义随message的不同而不同
DWORD time;//消息投递到消息队列的时间
POINT pt;//产生消息时鼠标的坐标
} MSG,*LPMSG,*PMSG;

㈣ 怎么用C语言向指定窗口发送消息

如果是简单情况, 需要输入的数据就在一个文件里放着。 比如 test.dat , 而要接收数据的程序文件叫 run.exe
可以这样 运行这个程序: run.exe < test.dat
这样文件内容就作为run.exe运行时的输入了。

如果是复杂点的情况,需要输入的数据是随时算的, 可以写个“输出所需数据”的程序, 就是做数据然后 printf出来就可以(别忘了回车) 。 这个程序比如叫 data.exe
可以这样运行两个程序: data.exe | run.exe
这样 data.exe输出的内容就作为run.exe运行时的输入了

㈤ 如何用C语言实现向某个IP发送数据包(例如4个浮点数)

使用socket编程即可。
1、网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。

2、下面用Socket实现一个windows下的c语言socket通信例子,这里客户端传递一个字符串,服务器端进行接收。

【服务器端】
#include "stdafx.h"
#include <stdio.h>
#include <winsock2.h>
#include <winsock2.h>
#define SERVER_PORT 5208 //侦听端口
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int ret, nLeft, length;
SOCKET sListen, sServer; //侦听套接字,连接套接字
struct sockaddr_in saServer, saClient; //地址信息
char *ptr;//用于遍历信息的指针
//WinSock初始化
wVersionRequested=MAKEWORD(2, 2); //希望使用的WinSock DLL 的版本
ret=WSAStartup(wVersionRequested, &wsaData);
if(ret!=0)
{
printf("WSAStartup() failed!\n");
return;
}
//创建Socket,使用TCP协议
sListen=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sListen == INVALID_SOCKET)
{
WSACleanup();
printf("socket() faild!\n");
return;
}
//构建本地地址信息
saServer.sin_family = AF_INET; //地址家族
saServer.sin_port = htons(SERVER_PORT); //注意转化为网络字节序
saServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //使用INADDR_ANY 指示任意地址

//绑定
ret = bind(sListen, (struct sockaddr *)&saServer, sizeof(saServer));
if (ret == SOCKET_ERROR)
{
printf("bind() faild! code:%d\n", WSAGetLastError());
closesocket(sListen); //关闭套接字
WSACleanup();
return;
}

//侦听连接请求
ret = listen(sListen, 5);
if (ret == SOCKET_ERROR)
{
printf("listen() faild! code:%d\n", WSAGetLastError());
closesocket(sListen); //关闭套接字
return;
}

printf("Waiting for client connecting!\n");
printf("Tips: Ctrl+c to quit!\n");
//阻塞等待接受客户端连接
while(1)//循环监听客户端,永远不停止,所以,在本项目中,我们没有心跳包。
{
length = sizeof(saClient);
sServer = accept(sListen, (struct sockaddr *)&saClient, &length);
if (sServer == INVALID_SOCKET)
{
printf("accept() faild! code:%d\n", WSAGetLastError());
closesocket(sListen); //关闭套接字
WSACleanup();
return;
}
char receiveMessage[5000];
nLeft = sizeof(receiveMessage);
ptr = (char *)&receiveMessage;
while(nLeft>0)
{
//接收数据
ret = recv(sServer, ptr, 5000, 0);
if (ret == SOCKET_ERROR)
{
printf("recv() failed!\n");
return;
}
if (ret == 0) //客户端已经关闭连接
{
printf("Client has closed the connection\n");
break;
}
nLeft -= ret;
ptr += ret;
}
printf("receive message:%s\n", receiveMessage);//打印我们接收到的消息。

}
// closesocket(sListen);
// closesocket(sServer);
// WSACleanup();
}
【客户端】
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#define SERVER_PORT 5208 //侦听端口
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int ret;
SOCKET sClient; //连接套接字
struct sockaddr_in saServer; //地址信息
char *ptr;
BOOL fSuccess = TRUE;
//WinSock初始化
wVersionRequested = MAKEWORD(2, 2); //希望使用的WinSock DLL的版本
ret = WSAStartup(wVersionRequested, &wsaData);
if(ret!=0)
{
printf("WSAStartup() failed!\n");
return;
}
//确认WinSock DLL支持版本2.2
if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2)
{
WSACleanup();
printf("Invalid WinSock version!\n");
return;
}
//创建Socket,使用TCP协议
sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sClient == INVALID_SOCKET)
{
WSACleanup();
printf("socket() failed!\n");
return;
}
//构建服务器地址信息
saServer.sin_family = AF_INET; //地址家族
saServer.sin_port = htons(SERVER_PORT); //注意转化为网络节序
saServer.sin_addr.S_un.S_addr = inet_addr("192.168.1.127");
//连接服务器
ret = connect(sClient, (struct sockaddr *)&saServer, sizeof(saServer));
if (ret == SOCKET_ERROR)
{
printf("connect() failed!\n");
closesocket(sClient); //关闭套接字
WSACleanup();
return;
}

char sendMessage[]="hello this is client message!";
ret = send (sClient, (char *)&sendMessage, sizeof(sendMessage), 0);
if (ret == SOCKET_ERROR)
{
printf("send() failed!\n");
}
else
printf("client info has been sent!");
closesocket(sClient); //关闭套接字
WSACleanup();
}

㈥ 用objective-c语言实现一个消息中心(NSnotificationcenter)功能

对象之间进行通信最基本的方式就是消息传递,在Cocoa中提供Notification
Center机制来完成这一任务。其主要作用就是负责在任意两个对象之间进行通信。使用方法很简单,如下几个步骤即可:
假设A与B之间进行通信,B来触发事件,A接受该事件,并作出响应。
1)
A编写自定义的消息响应函数update
2)
A向消息中心注册,[NSNotificationCenter
defaultCenter]
addObserver:
self
selector:@selector(update)
name:@"update"
object:nil]
3)
B触发事件[[NSNotificationCenter
defaultCenter]
postNotificationName:@"update"
object:nil]
每一个进程都有一个默认的NSNotificationCenter,可以通过类方法defaultCenter获取该消息中心的实例。消息中心可以处理同一进程中不同对象之间的消息。如果要在同一台机器上进行进程间的通信,需要使用。
消息中心以同步的方式将消息分发到所有的观察者中,换言之,直到所有的观察者都收到消息并处理完毕以后,控制权才会回到调用者的手里。如果需要异步的处理消息,需要使用通知队列NSNotificationQueue。
在多线程程序中,通知会被分发到每一个发起消息的线程中,这可能与观察者注册时所在的线程已经不是同一线程。
实例:
@implementation
TestClass
-
(void)
dealloc
{
//
If
you
don't
remove
yourself
as
an
observer,
the
Notification
Center
//
will
continue
to
try
and
send
notification
objects
to
the
deallocated
//
object.
[[NSNotificationCenter
defaultCenter]
removeObserver:self];
[super
dealloc];
}
-
(id)
init
{
self
=
[super
init];
if
(!self)
return
nil;
//
Add
this
instance
of
TestClass
as
an
observer
of
the
TestNotification.
//
We
tell
the
notification
center
to
inform
us
of
"TestNotification"
//
notifications
using
the
receiveTestNotification:
selector.
By
//
specifying
object:nil,
we
tell
the
notification
center
that
we
are
not
//
interested
in
who
posted
the
notification.
If
you
provided
an
actual
//
object
rather
than
nil,
the
notification
center
will
only
notify
you
//
when
the
notification
was
posted
by
that
particular
object.
[[NSNotificationCenter
defaultCenter]
addObserver:self
selector:@selector(receiveTestNotification:)
name:@"TestNotification"
object:nil];
return
self;
}
-
(void)
receiveTestNotification:(NSNotification
*)
notification
{
//
[notification
name]
should
always
be
@"TestNotification"
//
unless
you
use
this
method
for
observation
of
other
notifications
//
as
well.
if
([[notification
name]
isEqualToString:@"TestNotification"])
NSLog
(@"Successfully
received
the
test
notification!");
}
@end

㈦ 求09年3月计算机二级C语言笔试答案

博客首页 排行榜 点播单(0) 《你我的南京》征文 注册 帮助
博文综合 博文 博主 图片 音乐 视频 播主 论坛 新浪吧 圈子
慲慲哋杺里,炷孒1个沵~~
http://blog.sina.com.cn/rourou881225[订阅]肉肉儿博客 相册 音乐 播客 个人中心 首页博文收藏博客圈字体大小:大中小 正文 09年3月全国计算机考试三级网络技术笔试答案(2009-03-29 22:27:32)标签:杂谈

09年3月全国计算机考试三级网络技术笔试试题答案
一、选择题(每小题1分,共60分)
(1)1959年10月我国研制成功的一台通用大型电子管计算机是(B)
A)103计算机
B)104计算机
C)120计算机
D)130计算机
(2)关于计算机应用的描述中,错误的是(C)
A)模拟操作是一种特殊的研究方法
B)大气预报采用了巨型计算机处理数据
C)经济运行模型还不能用计算机模拟
D)过程控制可采用抵挡的处理芯片
(3)关于服务器的描述中,正确的是(D)

A)按体系结构分为入门级、部门级、企业级服务器

B)按用途分为台式、机架式、机柜式服务器

C)按处理器类型分为文件、数据库服务器

D)刀片式服务器的每个刀片是一块系统主板
(4)关于计算机配置的描述中,错误的是(A)

A)服务器机箱的个数用1U/2U/3U/....../8U表示

B)现在流行的串接口硬盘是SATA硬盘

C)独立磁盘冗余阵列简称磁盘阵列

D)串行SCSI硬盘简称SAS硬盘
(5)关于软件开发的描述中,正确的是(B)

A)软件生命周期包括计划、开发两个阶段

B)开发初期进行需求分析、总体设计、详细设计

C)开发后期进行编码、测试、维护

D)软件运行和使用中形成文档资料
(6)关于多媒体的描述中,错误的是(D)

A)多媒体的数据量很大,必须进行压缩才能实用

B)多媒体数据有许多冗余,这是进行的基础

C)信息编码法提供了无损压缩

D)常用的预测编码是变换编码
(7)关于数据报交换方式的描述中,错误的是(A)

A)在报文传输前建立源结点与目标的结点之间的虚电路

B)同一报文的不同分组可以经过不同路径进行传输

C)同一报文的每个分组中都要有源地址和目标地址

D)同一报文的不同分组可能不按顺序到达目的结点
(8)IEEE802.11无线局域网的介质访问控制方法中,帧间间隔大小取决于(D)

A)接入点
B)交换机
C)帧大小
D)帧类型
(9)以下网络应用中不属于Web应用的是(B)

A)电子商务
B)域名解析
C)电子政务
D)博客

(10)关于千兆以太网的描述中,错误的是(C)

A)与传统以太网采用相同的帧结构
B)标准中定义了千兆介质专用接口

C)只使用光纤作为传输介质
D)用GMII分割MAC子层与物理层
(11)虚拟局域网的技术基础是(C)
A)路由技术
B)宽带分配
C)交换技术
D)冲突检测
(12)关于OSI参考模型的描述中,正确的是(C)
A)高层为低层提供所需的服务
B)高层需要知道低层的实现方法
C)不同结点的同等层有相同的功能 D)不同结点需要相同的操作系统
(13)如果网络结点传输10bit数据需要1×10-8,则该网络的数据传输速度是(B)

A)10Mbps
B)1Gbps
C)100Mbps
D)10Gbps
(14)关于传统Ethernet的描述中,错误的是(D)

A)是一种典型的总线型局域网
B)结点通过广播方式发送数据

C)需要解决介质访问控制问题
D)介质访问控制方法是CSMACA
(15)网桥实现网络互联的层次是(A)

A)数据链路层
B)传输层
C)网络层
D)应用层
(16)在TC/IP参考模型中,负责提供面向连接服务的协议是(C)
A)FTP
B)DNS
C)TCP
D)TDP
(17)以下哪一个不是无线局域网IEEE80211规定的物理层传输方式?(C)
A)直接序列扩频
B)跳频扩频
C)蓝牙
D)红外
(18)关于网络层的描述中,正确的是(B)
A)基本数据传输单位是帧
B)主要功能是提供路由选择
C)完成应用层信息格式的转换
D)提供端到端的传输服务

(19)1000BASE-T标准支持的传输介质是(C)
A)单模光纤
B)多模光纤
C)非屏蔽双绞线
D)屏蔽双绞线
(20)电子邮件传输协议是(D)
A)DHCP
B)FTP
C)CMIP
D)SMTP
(21)关于IEEE802模型的描述中,正确的是(B)
A)对应于OSI模型的网络层
B)数据链路层分为LLC与MAC层
C)只包括一种局域网协议
D)针对广域网环境
(22)关于Ad Hoc网络的描述中,错误的是(B)
A)是一种对等的无线移动网络
B)在WALN的基础上发展起来
C)采用无基站的通信模式

D)在军事领域应用广泛
(23)以下P2P应用软件中不属于文件共享类应用的是(A)
A)Skype
B)Gnutella
C)Napster
D)BitTorrent
(24)关于服务器操作系统的描述中,错误的是(D)
A)是多用户、多任务的系统
B)通常采用多线程的处理方式
C)线程比进程需要的系统开销小
D)线程管理比进程管理复杂
(25)关于Windows Server基本特征的描述中,正确的是(B)
A) Windows 2000开始与IE集成,并摆脱了DOS
B) Windows 2003依据.NET架构对NT技术做了实质的改进
C) Windows 2003 R2可靠性提高,安全性尚显不足
D) Windows 2008重点加强安全性,其他特征与前面版本类似
(26)关于活动目标的描述中,错误的是(D)
A)活动目标包括目录和目录服务
B)域是基本管理单位,通常不再细分
C)活动目标采用树状逻辑结构
D)通过域构成树,树再组成森林
(27)关于Unix操作系统的描述中,正确的是(A)
A) Unix由内核和外壳两部分组成

B)内核由文件子系统和目录子系统组成

C)外壳由进程子系统和线程子系统组成

D)内核部分的操作原语对用户程序起作用

(28)关于Linux操作系统的描述中,错误的是(C)

A)内核代码与Unix不同
B)适合作为Internet服务平台

C)文件系统是网状结构
D)用户界面主要有KDE和GNOME
(29)关于TCP/IP协议集的描述中,错误的是(A)

A)由TCP和IP两个协议组成
B)规定了Internet中主机的寻址方式
C)规定了Internet中信息的传输规则
D)规定了Internet中主机的命名机制
(30)关于IP互联网的描述中,错误的是(C)
A)隐藏了低层物理网络细节
B)数据可以在IP互联网中跨网传输
C)要求物理网络之间全互连
D)所有计算机使用统一的地址描述方法
(31)以下哪个地址为回送地址?(B)
A) 128.0.0.1
B) 127.0.0.1
C) 126.0.0.1
D) 125.0.0.1
(32)如果一台主机的IP地址为20.22.25. 6,子网掩码为255.255.255.0,那么该主机的主机号为(A)
A) 6
B) 25
C) 22
D) 20
(33)一个连接两个以太网的路由器接收到一个IP数据报,如果需要将该数据报转发到IP地址为202.123.1.1的主机,那么该路由器可以使用哪种协议寻找目标主机的MAC地址?(B)
A) IP
B) ARP
C) DNS
D) TCP
(34)在没有选项和填充的情况下,IPv4数据报报头长度域的值应该为(C)
A) 3
B) 4
C) 5
D) 6
(35)对IP数据报进行分片的主要目的是(D)
A)提高互联网的性能
B)提高互联网的安全性
C)适应各个物理网络不同地址的长度
D)适应各个物理网络不同的MTU长度

(36)以下关于ICMP差错报文特点的描述中,错误的是(A)
A)享受特别优先权和可靠性
B)数据包含故障IP数据报数据区的前64比特
C)伴随抛弃出错IP数据报产生
D)目的地址通常为抛弃数据报的源地址
(37)一个路由器的路由表如下所示。如果该路由器接收到一个目的IP地址为10.1.2.5的报文,那么它应该将其投递到(B)

要到达的网络
下一路由地址

10.2.0.0
直接投递

10.3.0.0
直接投递

10.1.0.0
10.2.0.5

10.4.0.0
10.3.0.7

A)10.1.0.0
B)10.2.0.5
C)10.4.0.0
D)10.3.0.7
(38)关于RIP与OSPF协议的描述中,正确的是(C)
A)RIP和OSPF都采用向量-距离算法
B) RIP和OSPF都采用链路-状态算法
C) RIP采用向量-距离算法,OSPF采用链路-状态算法
D) RIP采用链路-状态算法,OSPF采用向量-距离算法
(39)为确保连接的可靠建立,TCP采用的技术是(D)
A)4次重发
B)3次重发
C)4次握手
D)3次握手
(40)关于客户机/服务器模式的描述中,正确的是(A)
A)客户机主动请求,服务器被动等待
B)客户机和服务器都主动请求
C)客户机被动等待,服务器主动请求
D)客户机和服务器都被动等待
(41)关于Internet域名系统的描述中,错误的是(C)
A)域名解析需要一组既独立又协作的域名服务器
B)域名服务器逻辑上构成一定的层次结构
C)域名解析总是从根域名服务器开始
D)递归解析是域名解析的一种方式
(42)pwd是一个FTP用户接口命令,它的意义是(A)
A)请求用户输入密码
B)显示远程主机的当前工作目录
C)在远程主机中建立目录
D)进入主动传输方式
(43)为了使电子邮件能够传输二进制信息,对RFC822进行扩充后的标准为(C)
A)RFC823
B)SNMP
C)MIME
D)CERT
(44)关于WWW服务系统的描述中,错误的是(B)
A)WWW采用客户/机服务器模式
B)WWW的传输协议采用HTML
C)页面到页面的链接信息由URL维持
D)客户端应用程序称为浏览器
(45)下面哪个不是Internet网络管理协议?(D)
A)SNMPv1
B) SNMPv2
C) SNMPv3
D) SNMPv4
(46)根据计算机信息系统安全保护等级划分准则,安全要求最高的防护等级是(D)
A)指导保护级
B)强制保护级
C)监督保护级
D)专控保护级
(47)下面那种攻击属于被动攻击?(A)
A)流量分析
B)数据伪装
C)消息重放
D)消息篡改
(48)AES加密算法处理的分组长度是(B)
A)56位
B)64位
C)128位
D) 256位
(49)RCS加密算法没有采用的基本操作是(C)
A)异或
B)循环
C)置换
D)加
(50)关于消息认证的描述中,错误的是(C)
A)消息认证称为完整性校验
B)用于识别信息源的真伪
C)消息认证都是实时的
D)消息认证可通过认证码实现
(51)关于RSA密码体制的描述中,正确的是(D)
A)安全性基于椭圆曲线问题
B)是一种对称的密码体制
C)加密速度很快
D)常用于数字签名
(52)关于Kerberors认证系统的描述中,错误的是(D)
A)有一个包含所有用户密钥的数据库
B)用户密钥是一个加密口令
C)加密算法必须使用DES
D)Kerberos提供会话密钥

(53) RSA算法加密时,已知公钥是(e=7,n=20),私钥是(d=3,n=20),用公钥对消息M=3加密,得到的密文是:(D)
A)19
B)13
C)12
D)7
(54)下面哪个地址不是组播地址? (D)
A)224.0.1.1
B)232.0.0.1
C)233.255.255.1
D)240.255.255.1
(55)下面哪种P2P网络拓扑不是分布式非结构化的?(B)
A)Gnutella
B)Maze
C)LimeWire
D)BearShare
(56)关于即时通信的描述中,正确的是(C)
A)只工作在客户机/服务器方式
B)QQ是最早推出的即时通信软件
C)QQ的聊天通信是加密的
D)即时通信系统均采用SIP协议
(57)下面哪种服务不属于IPTV通信类服务?(C)
A)IP语音服务
B)即时通信服务
C)远程教育服务
D)电视短信服务
(58)从技术发展角度看,最早出现的IP电话工作方式是(A)
A)PC-to-PC
B)PC-to-Phone
C)Phone-to-PC
D) Phone-to- Phone
(59)数字版权管理主要采用数据加密、版权保护、数字签名和(B)
A)认证技术
B)数字水印技术
C)访问控制技术
D)防篡改技术
(60)网络全文搜索引擎一般包括搜索器、检索器、用户接口和(A)

A)索引器
B)机器人
C)爬虫

二、填空题(每题2分,共40分)

(1)精简指令集计算机的英文缩写是【RISC】。
(2)流媒体数据流具有连续性、实时性和【时序性】三个特点。
(3)00-60-38-00-08-A6是一个【MAC】地址。
(4)Ethernet V2.0规定帧的数据字段的最大长度是【1500B】。
(5)RIP协议用于在网络设备之间交换【路由】信息。
(6)网络协议的三个要素是【语法】、语义与时序。
(7)TCP/IP参考模型的主机—网络层对应于OSI参考模型的物理层与【数据链路层】。
(8)一台Ethernet交换机提供24个100Mbps的全双工端口与1个1Gbps的全双工端口,在交换机满配置情况下的总带宽可以达到【6.8Gps】。
(9)Web/OS是运行在【浏览器】中的虚拟操作系统。
(10)Novell公司收购了SUSE,以便通过SUSE【Linux】Professional产品进一步发展网络操作系统业务。
(11)IP服务的三个特点是:不可靠、面向非连接和【尽最大努力投递】。
(12)如果一个IP地址为10.1.2.20,子网掩码为255.255.255.0的主机需要发送一个有限广播数据报,该有限广播数据报的目的地址为【255.255.255.255】。
(13)IPv6的地址长度为【128】位。
(14)浏览器结构由一个【控制单元】和一系列的客户单元、解释单元组成。
(15)为了解决系统的差异性,Telnet协议引入了【网络虚拟终端(或NVT)】,用于屏蔽不同计算机系统对键盘输入解释的差异。
(16)SNMP从被管理设备收集数据有两种方法:基于【轮询】方法和基于中断方法。
(17)数字签名是笔迹签名的模拟,用于确认发送者身份,是一个【加密】的消息摘要。
(18)包过滤防火墙依据规则对收到的IP包进行处理,决定是【转发】还是丢弃。
(19)组播允许一个发送方发送数据包到多个接收方。不论接收组成员的数量是多少,数据源只发送【一次】数据包。
(20)P2P网络存在四种主要结构类型,Napster是【集中】目录式结构的代表

㈧ SSL/TLS协议原理解读

HTTPS是什么相信大家都知道,如果你不知道。。。请关闭此文!!!
HTTP的数据是明文传输的,没有安全性可言。HTTPS是秘文传输,那么HTTPS是怎么实现数据的安全(加密)传输的?那是因为HTTPS比HTTP多了个'S'。 即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

SSL/TLS协议是网络安全通信的重要基石,本文将简单介绍SSL/TLS协议,主要关注SSL/TLS协议的安全性,特别是SSL规范的正确实现。 本系列的文章大体分为几个部分:

1、SSL/TLS简介
2、SSL/TLS协议的基本流程
3、从SSL到TLS
4、SSL/TLS的流行实现库

SSL全称是Secure Sockets Layer,安全套接字层,它是由网景公司(Netscape)设计的主要用于Web的安全传输协议,目的是为网络通信提供机密性、认证性及数据完整性保障。如今,SSL已经成为互联网保密通信的工业标准。

SSL最初的几个版本(SSL 1.0、SSL2.0、SSL 3.0)由网景公司设计和维护,从3.1版本开始,SSL协议由因特网工程任务小组(IETF)正式接管,并更名为TLS(Transport Layer Security),发展至今已有TLS 1.0、TLS1.1、TLS1.2这几个版本。

如TLS名字所说,SSL/TLS协议仅保障传输层安全。同时,由于协议自身特性(数字证书机制),SSL/TLS不能被用于保护多跳(multi-hop)端到端通信,而只能保护点到点通信。

SSL/TLS协议能够提供的安全目标主要包括如下几个:

认证性——借助数字证书认证服务器端和客户端身份,防止身份伪造

机密性——借助加密防止第三方窃听

完整性——借助消息认证码(MAC)保障数据完整性,防止消息篡改

重放保护——通过使用隐式序列号防止重放攻击

为了实现这些安全目标,SSL/TLS协议被设计为一个两阶段协议,分为握手阶段和应用阶段:

握手阶段也称协商阶段,在这一阶段,客户端和服务器端会认证对方身份(依赖于PKI体系,利用数字证书进行身份认证),并协商通信中使用的安全参数、密码套件以及MasterSecret。后续通信使用的所有密钥都是通过MasterSecret生成。

在握手阶段完成后,进入应用阶段。在应用阶段通信双方使用握手阶段协商好的密钥进行安全通信。

Handshake协议:包括协商安全参数和密码套件、服务器身份认证(客户端身份认证可选)、密钥交换;

ChangeCipherSpec 协议:一条消息表明握手协议已经完成;

Alert 协议:对握手协议中一些异常的错误提醒,分为fatal和warning两个级别,fatal类型的错误会直接中断SSL链接,而warning级别的错误SSL链接仍可继续,只是会给出错误警告;

Record 协议:包括对消息的分段、压缩、消息认证和完整性保护、加密等。

图2、图3都是表示的协议流程,大同小异。可以对比着看加深理解。

每一个SSL/TLS链接都是从握手开始的,握手过程包含一个消息序列,用以协商安全参数、密码套件,进行身份认证以及密钥交换。握手过程中的消息必须严格按照预先定义的顺序发生,否则就会带来潜在的安全威胁。今年顶级安全会议CCS 有文章提出了建立综合状态机来检查SSL链接中消息序列……

2.1 握手过程中的消息序列

ClientHello:ClientHello通常是握手过程中的第一条消息,用于告知服务器客户端所支持的密码套件种类、最高SSL/TLS协议版本以及压缩算法。

ClientHello中还包含一个随机数,这个随机数由4个字节的当前GMT UNIX时间以及28个随机选择的字节组成,共32字节。该随机数会在密钥生成过程中被使用。

另外,ClientHello中还可能包含客户端支持的TLS扩展。(TLS扩展可以被用来丰富TLS协议的功能或者增强协议的安全性)

ServerHello:服务器接受到ClientHello后,会返回ServerHello。服务器从客户端在ClientHello中提供的密码套件、SSL/TLS版本、压缩算法列表里选择它所支持的项,并把它的选择包含在ServerHello中告知客户端。接下来SSL协议的建立就基于服务器选择的密码套件类型、SSL/TLS协议版本以及压缩算法。

ServerHello中同样会包含一个随机数,同样4+28 字节类型,由服务器生成。

Certificate:客户端和服务器都可以发送证书消息来证明自己的身份,但是通常客户端证书不被使用。 服务器一般在ServerHello后会接一条Certificate消息,Certificate消息中会包含一条证书链,从服务器证书开始,到Certificate authority(CA)或者最新的自签名证书结束。下图形象地描述了证书链:

SSL中使用的证书通常是X.509类型证书,X.509证书的内容如下表所示:

在用的X.509证书包含Version 1和Version 3两种版本,其中v1版本的证书存在安全隐患,同时不支持TLS扩展,被逐渐弃用。现在大多数在用的SSL证书都是V3版本。

同时证书会附带与协商好的密钥交换算法对应的密钥。密钥交换算法以及它们所要求的密钥类型如下表所示。

ServerKeyExchange:该消息仅当以下密钥交换算法被使用时由服务器发出:

RSA_EXPORT(仅当服务器的公钥大于512bit时)、DHE_DSS、DHE_DSS_EXPORT、DHE_RSA、DHE_RSA_EXPORT、DH_anon 使用其它密钥交换算法时,服务器不能发送此消息。

ServerkeyExchange消息会携带这些密钥交换算法所需要的额外参数,以在后续步骤中协商PreMasterSecret。这些参数需要被签过名。

CertificateRequest:这个消息通常在要求认证客户端身份时才会有。消息中包含了证书类型以及可接受的CA列表。

ServerHelloDone:服务器发送这条消息表明服务器部分的密钥交换信息已经发送完了,等待客户端的消息以继续接下来的步骤。这条消息只用作提醒,不包含数据域。

ClientKeyExchange:这条消息包含的数据与所选用的密钥交换算法有关。

如果选择的密钥交换算法是RSA,那么消息包含的参数为用服务器RSA公钥(包含在之前证书中的或者是ServerKeyExchange中的)加密过的PreMasterSecret,它有48个字节,前2个字节表示客户端支持的最高协议版本,后46个字节是随机选择的。

如果选择的密钥交换算法是DH或者DHE,则可能有两种情况:

隐式DH公开值:包含在Certificate消息里;

显示DH公开值:公开值是本消息的一部分。

CertificateVerify:这条消息用来证明客户端拥有之前提交的客户端证书的私钥。

Finished:表明握手阶段结束。这是第一条用协商的算法和密钥保护的消息。

因为是用协商好的密钥加密的消息,它可以用来确认已经协商好的密钥。

同时Finished消息包含一个verify_data域,可以用来校验之前发送和接收的信息。

Verify_data域是一个PRF函数的输出(pseudo-random function)。这个伪随机函数的输入为:(1)两个hash值:一个SHA-1,一个MD5,对之前握手过程中交换的所有消息做哈希;(2)the MasterSecret,由预备主密钥生成;(3)finished_label,如果客户端发送的则是”client finished”,服务器发送的则是”server finished”。关于这个PRF的细节在3.3节中会具体描述。 此外,Finished 消息不能够在ChangeCipherSpec前发送。

2.2 不同密钥交换算法对应的握手过程

不同的密钥交换算法对应的握手过程中的消息序列是不同的,相应的实现方式也不同,本节介绍几个常见密钥交换算法对应的握手过程。

TLS-RSA:在这个场景下,PreMasterSecret是由客户端指定的,并用RSA公钥加密发送给服务器。服务器不影响PReMasterSecret的生成。

TLS-DH:基于DH的密钥交换也被称为静态Diffie-Hellman。在这种场景下,可能是双方各自提交一个证书包含DH公开值,或者服务器端提交证书包含DH公开值,客户端在每次会话中选择一个值。协商好的DH值被用作PreMasterSecret。显然证书中的参数是固定的,那么每次链接的PreMasterSecret也是相同的。

TLS-DH不能提供前向安全性。

TLS-DHE:基于DHE的TLS握手中会有ServerKeyExchange消息。握手过程中交换参数的认证通过数字签名来实现,支持的签名算法包括RSA和DSS。DH参数会有它的数字签名一起被包含在ServerKeyExchange中被发送出去。客户端在ClientKeyExchange中返回它的公开DH参数,但没有签名保护。同样协商出来的DH密钥被用作PreMasterSecret。

2.3 密钥生成

Pseudo-random Function(PRF):伪随机函数是SSL协议中的一个重要组成部分,它被用来秘密扩展以及生成密钥。在3.1节讲解Finished消息时已经简单提及PRF,在这里我们详细讨论PRF的工作原理。SSL/TLS协议中的PRF如下图所示:

这个PRF基于两个hash函数:MD5和SHA-1,它有3个输入,一个Secret(比如PreMasterSecret),一个标志符(比如”client finished”, “server finished”),还有一个种子值(比如客户端随机数+服务器端随机数)。

Secret在使用时被分为长度相同的两半:S1和S2,分别作为P_MD5和P_SHA-1的输入。

PRF的输出按如下方式处理得到:

P_MD5和P_SHA-1都是扩展函数,用来扩展秘密值以用于密钥生成,它们的计算方式如下:

其中A(0) = seed, A(i) = HMAC hash( secret, A( i −1) )

这个秘密扩展会一直进行直到得到足够多的扩展数据。 Key Derivation:主密钥(MasterSecret)是利用上述PRF从预备主密钥(PreMasterSecret)生成的。每个MasterSecret为48字节,生成方式如下:

得到MasterSecret后,它会被进一步处理最后生成4个不同的密钥和2个初始向量(IV)。处理过程如下:

处理过程一直持续到足够多的输出被生成,然后把输出分为4个key和2个IV:

下图完整阐述了SSL/TLS协议中的密钥生成过程。

本节介绍SSL/TLS协议的版本变迁,不同版本的区别以及安全特性等。

SSL 1.0由于从来没有被公开过,并且存在严重安全漏洞,我们就不讨论了。

SSL 2.0:SSL 2.0于1995年4月被发布。SSL 2.0中主要存在的问题如下:

MAC不能覆盖填充长度域,攻击者可能利用这点破坏消息完整性;

缺乏握手认证,攻击者可以篡改密码套件列表,诱骗通信双方使用较弱的密码套件;

使用较弱的或有问题的密码算法(如MD5,RC4等),或者使用不安全的分组模式(如CBC模式);

对于不同的密码学基元使用相同的密钥,违背基本安全常识。

由于以上安全问题,RFC 6176已经明确提出避免使用SSL 2.0,但是现实生活中还有少量客户端和服务器支持SSL 2.0.

SSL 3.0:SSL 3.0引入了一些新的特性和机制解决了很多之前版本存在的漏洞。此外,SSL 3.0中引入了ChangeCipherSpec子协议。SSL 3.0向后兼容SSL 2.0,相对于SSL 2.0,它的主要改变包括以下几点:

支持更多的密码套件(支持更多的密码算法如DSS,SHA-1)

在握手阶段支持密钥协商(DH和FORTEZZA)

支持密码学参数的重协商

增加了消息压缩选项

MAC能够覆盖填充长度域了,同时MAC可以使用MD5或者SHA-1

不同的密码学基元使用不同的key

Alert子协议能对任何错误给出两种提示:Warning和Fatal

中止链接的时候会用一个close_notify警告通知通信双方

支持证书链,而非单个证书

通过Finished消息认证所有发送和接收的消息

加密了的PreMasterSecret包含当前使用的协议版本,防止协议回滚

TLS 1.0:TLS 1.0和SSL 3.0差别非常小。实际上,TLS 1.0是SSL 3.1,在IETF接手后改名为TLS。TLS 1.0版本是目前使用最广泛的SSL/TLS协议版本。

TLS 1.0不再支持使用FORTEZZA的密码套件。

TLS 1.0中MAC被替换成HMAC。

之前提到ChangeCipherSpec消息必须在Finished消息前发送,在TLS 1.0中,如果消息序列不符合这个要求,会产生FATAL警告并终止链接。

TLS 1.1:这个版本相比之前改动也很小。最重要的改动是预防了针对CBC分组模式的一些攻击。现在的填充错误变的和非法MAC错误不可区分了,防止攻击者利用可区分错误响应建立解密预言机对密文进行攻击。

在每次加密过程中,使用CBC分组模式时,都需要显示给出IV,而不用再密钥生成时使用PRF生成IV。

此外,TLS 1.1禁止为适应之前出口限制而使用弱化的密码套件。

TLS 1.2:这是最新的版本,部署的还比较少。这个版本禁用了PRF中的MD5和SHA-1,而用一个可配置的hash函数取代了它们,这样的修改简化了计算过程。修改后的PRF风格如下:

此外,TLS 1.2的一个重要变化是支持认证加密模式(支持GCM等)。但是由于一些AEAD(Authenticated Encryption with Associated Data)密码算法要求IV为隐式的,所以IV又恢复到由MasterSecret生成,即TLS 1.0以前的风格。

TLS 1.2支持使用GCM、CCM的新密码套件。

同时SSL 2.0被宣布放弃,不再向后兼容SSL 2.0.

本节简单介绍一下流行的SSL/TLS实现库,SSL协议非常复杂,由开发者自己实现常常会出错,开发者在具体实现SSL协议时通常会依赖于这些密码学库。

4.1 常见的SSL/TLS 实现

OpenSSL:这是非常流行的开源SSL/TLS实现。

OpenSSLim完全用C语言实现,支持SSL 2.0/3.0,TLS 1.0/1.1/1.2以及DTLS 1.0。

OpenSSL 近年来出现了很多的安全漏洞,比如2014年曝出的着名的Heartbleed漏洞等。

JSSE:这是使用Java实现的,支持SSL 3.0,TLS 1.0/1.1/1.2.

Bouncy Castle:它不仅仅支持SSL/TLS,它是一个完整的密码学库,支持各种密码学算法和协议。不过它仅仅支持TLS 1.0版本。

Android平台主要使用这个密码学库。

GnuTLS:这是另一个用C语言实现的库,支持SSL 3.0,TLS 1.0/1.1/1.2以及DTLS 1.0。主要在Unix世界被使用。同时以各种安全漏洞多而闻名。

NSS:这是最初由网景公司(Netscape)开发的库,支持SSL 2.0/3.0,TLS 1.0/1.1,现在主要被浏览器和客户端软件使用,比如Firefox使用的就是NSS库,Chrome使用的是一个NSS库的修正版。

下表是一些常见软件以及它们所使用的SSL/TLS实现库的情况:

其它还有一些常用的SSL实现库,如cryptlib、CyaSSL、MatrixSSL、PolarSSL等,由于市场占有率不高,我们这里就不多做介绍了。

4.2 流行SSL/TLS实现库的安全研究

最近几年曝出的高风险SSL安全漏洞大多跟SSL实现库有关,比如2014年4月曝出的“心脏滴血”漏洞,存在于OpenSSL 1.0.1-1.0.1f版本中,影响全球近17%的Web服务器;同样是2014年曝出的苹果公司iOS 7.0.6版本系统中存在的“gotofail”漏洞,因为程序员的疏忽导致SSL证书校验中的签名校验失效;包括今年曝出的SSL Freak攻击也是由于SSL实现库的安全漏洞导致的攻击,我们研究小组的同学对这个攻击有详细的分析,参见《SSL Freak来袭:如何实施一个具体的SSL Freak攻击》。同时我们还开发了一个基于python的中间人代理攻击框架“风声”对某国内知名电商的服务器进行具体的攻击,并上报了漏洞。

考虑到大量SSL/TLS实现库中存在安全问题,同时这些主流的SSL/TLS实现库对开发者而言使用难度较高,比如有些SSL/TLS实现库要求开发者自己进行随机数生成或密钥管理,让缺乏系统信息安全知识培训的开发者去使用这样高度复杂的密码学库容易产生很多安全问题。我们在这里推荐一些高级密码学库:Google keycazer、NaCl、Cryptlib、GPGME。这些密码学库存在的安全问题较少,同时封装了一些底层的密码学操作,降低了开发者的使用难度。

以上就是本次要介绍的SSL /TLS协议基本知识,后续的文章我们会对一些典型SSL/TLS攻击进行具体介绍。

参考:
1、 http://netsecurity.51cto.com/art/201505/476337.htm
2、 http://www.cnblogs.com/NathanYang/p/9183300.html
3、 https://www.cnblogs.com/bhlsheji/p/4586597.html