华中科技大学数字鉴别实验报告
华中科技大学数字逻辑实验报告
华中科技大学计算机科学与技术双学位数字逻辑实验报告实验一组合逻辑电路的设计(第2-5页)实验二同步时许逻辑电路设计(第6-10页)实验三控制电路的设计(第10-12页)总结(第13页)学校:华中农业大学姓名:尹传林学号:2009301200906班级:植物科学技术学院植物保护专业0905班指导老师:熊自立完成时间:2011年4月4号到2011年4月23号实验一组合逻辑电路的设计一、实验目的1掌握组合逻辑电路的功能测试.2验证半加器和全加器的逻辑功能。
3学会二进制的运算规律。
二、实验器材74LS00 二输入四与非门 74LS04 六门反向器74LS08 二输入四与门 74LS10 三输入三与非门74LS86 二输入四异或门三、实验内容内容A 一位全加全减器的实现。
电路做加法还是做减法由S控制。
当s=0时做加法运算,s=1时做减法运算,当作为全加器输入信号A、B和Cin分别作为加数、被加数和低位来的进位,F1和F2为合数和向上位的进位。
当作为全减器输入信号A、B和Cin分别作为减数、被减数和低位来的借位,F1和F2为差数和向上位的借位。
内容B 舍入与检测电路的设计。
用所给定的集成电路组件设计一个多输出逻辑电路,输入为8421码.F1为四舍五入输入信号,F2为奇偶检测输出信号。
当输入的信号大于或等于(5)10时,电路输出F1=1,其他情况为0;当输入代码中含1的个数为奇数是,输出F2=1,其他情况为0.框图如图所示:四、实验步骤内容A 一位全加全减器的实现。
由要求可得如下真值表:F1的卡诺图为: F2的卡诺图为:化简得F1=A○+B○+C, F2=.由F1和F2表达式画出电路图如下:根据电路图,连接电路。
接线后拨动开关,结果如图:输入输出ABC 加法S=1 减法S=0F1 F2 F1 F20 0 0 0 0 0 00 0 1 1 0 1 10 1 0 1 0 1 10 1 1 0 1 0 11 0 0 1 0 1 01 0 1 0 1 0 01 1 0 0 1 0 01 1 1 1 1 1 1内容B 舍入与检测电路的设计。
华科实验报告模板
华科实验报告模板
1. 实验目的
(说明实验的目的和意义,可以引用相关文献)
2. 实验原理
(介绍实验的基本原理和背景知识,可以引用相关文献)
3. 实验仪器和材料
(列出实验所用的仪器、设备和材料,包括型号和规格)
4. 实验步骤
(详细描述实验的步骤,可以配上图表和算法)
5. 实验结果与分析
(将实验结果以表格、图形等形式进行呈现,并对实验结果进行详细的分析和解释)
6. 实验总结
(总结实验的主要内容,简要说明实验结果是否达到预期目标,并分析不足之处和改进措施)
7. 参考文献
(列出实验报告中所引用的文献)
附:实验数据、图表和代码
(将实验所得数据、图表和代码附在报告的附录中,方便其他人查看和复现实验结果)
以上是华科实验报告的基本结构和模板,根据实际需要可以对各个部分进行增减和调整。
在撰写实验报告时,需要注意以下几点:
1. 清晰明确:实验目的、原理、步骤和结果表达要清晰明确,不留歧义。
2. 简明扼要:用简洁的语言描述实验过程和结果,避免啰嗦和冗长。
3. 准确无误:字句和数据要准确无误,避免错误和误导。
4. 结构严谨:实验报告的结构要合理严谨,各部分之间要有明确的逻辑连接。
5. 语言规范:文章要使用准确、规范的语言,注重语法和标点的正确使用。
通过遵循以上几点,并根据具体实验的要求,撰写出一份完整、准确、简洁的实验报告。
华中科技大学数值分析实验报告
华中科技大学数值分析实验报告系、年级学号姓名类别硕士指导老师路志宏2013年4月13日实验 4.1实验目的:复化求积公式计算定积分实验题目:数值计算下列各式右端定积分的近似值3221(1)ln 2ln 321dx x -=--⎰121(2)41dx x π=+⎰102(3)3ln 3xdx=⎰221(4)xe xe dx =⎰实验要求:(1) 若用复化梯形公式、复化Simpson 公式和复化Gauss-Legendre I 型公式做计算,要求绝对误差限为71*102ε-=,分别利用它们的余项对每种算法做出步长的事前估计。
(2) 分别用复化梯形公式、复化Simpson 公式和复化Gauss-Legendre I 型公式作计算。
(3) 将计算结果与精确解作比较,并比较各种算法的计算量。
一、事前误差估计3221(1)ln 2ln 321dxx -=--⎰ 令 21()1f x x =- 则有2(2)234(31)()(1)x fx x -+=-(4)552424()(1)(1)fx x x =-+-故(2)52max ()27f x =(4)5808max ()243f x =由题中精度要求,可知对于复化梯形求积公式有22''()(32)52()()121227n b a h R f h f ηε--=-≤≤得步长h=5.582*10-4对于复化Simpson 求积公式有44(4)()(32)5808()()28802880243n b a h R f h f ηε--=-≤≤得步长h=0.04975对于复化Gauss-Legendre I 型求积公式有44(4)()(32)5808()()43204320243n b a h R f h f ηε--=≤≤得步长h=0.05494对于(2)~(4),其步长可以仿上加以确定,此处不再赘述,结果一并列表如下:二、利用求积公式进行计算利用上述求积公式进行计算,结果如下表:三、将计算结果与精确解作比较,并比较各种算法的计算量由上表中的误差分析可知,利用题目所要求的复化求积公式运算的结果均在误差限以内,精度满足要求。
华中科技大学数字逻辑实验报告
华中科技大学计算机科学与技术双学位数字逻辑实验报告实验一组合逻辑电路的设计(第2-5页)实验二同步时许逻辑电路设计(第6-10页)实验三控制电路的设计(第10-12页)总结(第13页)学校:华中农业大学姓名:尹传林学号:2009301200906班级:植物科学技术学院植物保护专业0905班指导老师:熊自立完成时间:2011年4月4号到2011年4月23号实验一组合逻辑电路的设计一、实验目的1掌握组合逻辑电路的功能测试.2验证半加器和全加器的逻辑功能。
3学会二进制的运算规律。
二、实验器材74LS00 二输入四与非门 74LS04 六门反向器74LS08 二输入四与门 74LS10 三输入三与非门74LS86 二输入四异或门三、实验内容内容A 一位全加全减器的实现。
电路做加法还是做减法由S控制。
当s=0时做加法运算,s=1时做减法运算,当作为全加器输入信号A、B和Cin分别作为加数、被加数和低位来的进位,F1和F2为合数和向上位的进位。
当作为全减器输入信号A、B和Cin分别作为减数、被减数和低位来的借位,F1和F2为差数和向上位的借位。
内容B 舍入与检测电路的设计。
用所给定的集成电路组件设计一个多输出逻辑电路,输入为8421码.F1为四舍五入输入信号,F2为奇偶检测输出信号。
当输入的信号大于或等于(5)10时,电路输出F1=1,其他情况为0;当输入代码中含1的个数为奇数是,输出F2=1,其他情况为0.框图如图所示:四、实验步骤内容A 一位全加全减器的实现。
由要求可得如下真值表:F1的卡诺图为: F2的卡诺图为:化简得F1=A○+B○+C, F2=.由F1和F2表达式画出电路图如下:根据电路图,连接电路。
接线后拨动开关,结果如图:输入输出ABC 加法S=1 减法S=0F1 F2 F1 F20 0 0 0 0 0 00 0 1 1 0 1 10 1 0 1 0 1 10 1 1 0 1 0 11 0 0 1 0 1 01 0 1 0 1 0 01 1 0 0 1 0 01 1 1 1 1 1 1内容B 舍入与检测电路的设计。
判别分析 实验报告
判别分析实验报告判别分析实验报告一、引言判别分析是一种常用的统计分析方法,广泛应用于数据挖掘、模式识别、生物信息学等领域。
本实验旨在通过对一个真实数据集的分析,探讨判别分析在实际问题中的应用效果。
二、数据集介绍本实验使用的数据集是一份关于肿瘤患者的临床数据,包括患者的年龄、性别、肿瘤大小、转移情况等多个变量。
我们的目标是根据这些变量,建立一个判别模型,能够准确地预测患者是否患有恶性肿瘤。
三、数据预处理在进行判别分析之前,我们首先对数据进行预处理。
这包括数据清洗、缺失值处理、异常值检测等步骤。
通过对数据的观察和分析,我们发现有部分数据存在缺失值,需要进行处理。
我们选择使用均值替代缺失值的方法进行处理,并对替代后的数据进行了异常值检测。
四、判别模型建立在本实验中,我们选择了线性判别分析(LDA)作为判别模型的建立方法。
LDA 是一种经典的判别分析方法,通过将数据投影到低维空间中,使得不同类别的样本在投影后的空间中能够更好地区分开来。
我们使用Python中的scikit-learn 库来实现LDA算法。
五、模型评估为了评估建立的判别模型的性能,我们将数据集划分为训练集和测试集。
使用训练集对模型进行训练,并使用测试集进行模型的评估。
我们选择了准确率、精确率、召回率和F1值等指标来评估模型的性能。
经过多次实验和交叉验证,我们得到了一个较为稳定的模型,并对其性能进行了详细的分析和解释。
六、结果与讨论经过模型评估,我们得到了一个在测试集上准确率为85%的判别模型。
该模型在预测恶性肿瘤时具有较高的精确率和召回率,说明了其在实际应用中的可行性和有效性。
但同时我们也发现,该模型在预测良性肿瘤时存在一定的误判率,可能需要进一步优化和改进。
七、结论本实验通过对一个真实数据集的判别分析,验证了判别分析方法在预测恶性肿瘤的应用效果。
通过建立判别模型,并对其性能进行评估,我们得到了一个在测试集上具有较高准确率的模型。
然而,我们也发现了该模型在预测良性肿瘤时存在一定的误判率,需要进一步的改进和优化。
手写数字识别实验报告
手写数字识别实验报告最近,手写数字识别技术受到越来越多的关注,各种手写数字识别系统也被广泛应用于实际应用中。
为了验证手写数字识别技术的有效性,本实验选择了国际上最流行的MNIST数据集,实现了一个深度学习模型,用来实现对手写数字的自动识别。
本实验步骤如下:一、数据集的准备本实验使用MNIST数据集。
MNIST数据集是一个包含60,000个训练图像和10,000个测试图像的数据集,所有图像都是灰度图像,每个图像都是28×28像素大小,每张图片都标记有0-9的数字,图像所属的类别。
二、模型构建本实验使用Convolutional Neural Network(CNN)构建模型,CNN是一种卷积神经网络,具有卷积层、池化层和全连接层等,可以有效提取图像中的特征。
本实验CNN模型构建方法:(1)卷积层:积核大小为3×3,输入通道为1,输出通道为64,采用ReLU激活函数;(2)池化层:用最大池化操作,池化窗口大小为2×2;(3)全连接层:入节点数为1024,输出节点为10,采用Softmax 激活函数。
三、模型训练本实验使用python的Keras库,并采用Adam作为优化器,学习率为0.001。
本实验使用训练集中的50,000图像训练模型,使用另外10,000图像作为测试集,训练次数为20次,每次训练500张图片。
四、结果分析本实验模型最终在测试集上的准确率达到99.32%,属于公认的良好水准。
从精度曲线图可以看出,模型的精度在训练的过程中持续上升,训练时间也在不断减少,说明模型越来越稳定,具有良好的泛化能力。
综上所述,本实验通过使用CNN模型,基于MNIST数据集,实现对手写数字的自动识别,达到了良好的效果。
本实验设计技术有助于提高手写数字识别技术的应用水平,为相关领域的研究提供了参考依据。
华科数据库实验报告
华科数据库实验报告华科数据库实验报告引言:数据库是计算机科学领域中非常重要的一部分,它是用来存储和管理大量数据的工具。
在现代社会中,各种各样的应用都需要使用数据库来支持其数据存储和处理的需求。
本实验旨在通过实际操作,深入了解华科数据库的特点和使用方法,并对其进行评估和分析。
1. 实验背景华科数据库是华中科技大学开发的一套数据库系统,用于支持学校内部的各项业务。
它采用了先进的分布式架构,具有高可用性和高性能的特点。
本次实验将使用华科数据库进行一系列的操作,包括数据的插入、查询和删除等,以及性能测试和优化。
2. 实验过程2.1 数据插入首先,我们需要准备一些测试数据,并将其插入到华科数据库中。
通过编写SQL语句,我们可以轻松地将数据插入到指定的表中。
在插入数据之前,我们需要先创建相应的表结构,并定义字段的数据类型和约束。
2.2 数据查询一旦数据插入完成,我们就可以进行各种查询操作了。
华科数据库提供了丰富的查询功能,包括基本的SELECT语句、条件查询、排序、分组等。
我们可以根据实际需求,灵活运用这些查询功能,从数据库中获取所需的数据。
2.3 数据删除当我们不再需要某些数据时,可以使用DELETE语句将其从数据库中删除。
华科数据库支持根据条件删除数据,这样我们可以方便地删除满足特定条件的数据。
3. 实验结果与分析通过实验,我们对华科数据库的性能和稳定性进行了评估。
在数据插入方面,华科数据库表现出色,插入速度快,且支持大规模数据的插入。
在数据查询方面,华科数据库提供了强大的查询功能,可以满足各种复杂的查询需求。
在数据删除方面,华科数据库的删除操作也非常高效。
然而,我们在实验过程中也发现了一些问题。
首先,华科数据库在处理大规模数据时,会出现一定的性能瓶颈。
虽然它能够支持大规模数据的插入和查询,但在某些情况下,查询速度会变慢。
其次,华科数据库对于复杂的数据关系处理能力还有待提高。
在处理多表关联查询时,会出现一些性能问题。
华中科技大学数字逻辑实验
标准文档数字逻辑实验报告(1)姓名:学号:班级:指导教师:计算机科学与技术学院20 年月日《数字电路与逻辑设计》实验报告数字逻辑实验报告系列二进制加法器设计预习报告《数字电路与逻辑设计》实验报告一、系列二进制加法器设计1、实验名称系列二进制加法器设计。
2、实验目的要求同学采用传统电路的设计方法,对5种二进制加法器进行设计,并利用工具软件,例如,“logisim”软件的虚拟仿真功能来检查电路设计是否达到要求。
通过以上实验的设计、仿真、验证3个训练过程使同学们掌握传统逻辑电路的设计、仿真、调试的方法。
3、实验所用设备Logisim2.7.1软件一套。
4、实验内容对已设计的5种二进制加法器,使用logisim软件对它们进行虚拟实验仿真,除逻辑门、触发器外,不能直接使用logisim软件提供的逻辑库元件,具体内容如下。
(1)一位二进制半加器设计一个一位二进制半加器,电路有两个输入A、B,两个输出S和C。
输入A、B分别为被加数、加数,输出S、C为本位和、向高位进位。
(2)一位二进制全加器设计一个一位二进制全加器,电路有三个输入A、B和Ci,两个输出S和Co。
输入A、B和Ci分别为被加数、加数和来自低位的进位,输出S和Co为本位和和向高位的进位。
(3)串行进位的四位二进制并行加法器用四个一位二进制全加器串联设计一个串行进位的四位二进制并行加法器,电路有九个输入A3、A2、A1、A0、B3、B2、B1、B0和C0,五个输出S3、S2、S1、S0和C4。
输入A= A3A2A1A0、B= B3B2B1B0和C0分别为被加数、加数和来自低位的进位,输出S= S3S2S1S0和Co为本位和和向高位的进位。
(4)先行进位的四位二进制并行加法器《数字电路与逻辑设计》实验报告利用超前进位的思想设计一个先行进位的四位二进制并行加法器,电路有九个输入A3、A2、A1、A、B3、B2、B1、B和C,五个输出S3、S2、S1、S和C4。
数字认证综合实验报告
一、实验目的本次实验旨在通过实际操作,了解数字认证的基本原理和应用,掌握数字认证技术的实现过程,并熟悉相关工具的使用方法。
通过实验,培养学生的动手能力和创新能力,提高学生在信息安全领域的实际操作能力。
二、实验环境1. 操作系统:Windows 102. 开发环境:Python3.73. 工具:PyCharm、数字证书生成工具、数字签名工具三、实验内容1. 数字证书的生成与导入(1)使用数字证书生成工具,生成一个自签名的数字证书。
(2)将生成的数字证书导入到本地密钥库中。
2. 数字签名的生成与验证(1)使用数字签名工具,对一份文档进行数字签名。
(2)验证数字签名的正确性。
3. 数字信封的加密与解密(1)使用数字信封加密工具,对一份文档进行加密。
(2)使用数字信封解密工具,对加密文档进行解密。
4. 数字证书的吊销与更新(1)使用数字证书吊销工具,吊销一个数字证书。
(2)使用数字证书更新工具,更新一个数字证书。
四、实验步骤1. 数字证书的生成与导入(1)打开数字证书生成工具,设置证书的属性,如有效期、密钥长度等。
(2)生成自签名数字证书,并保存到本地。
(3)打开Python,导入PyOpenSSL库,使用以下代码导入数字证书:```pythonfrom OpenSSL import cryptodef load_certificate(cert_path):with open(cert_path, 'rb') as f:cert = crypto.load_certificate(crypto.FILETYPE_PEM, f.read()) return cert# 导入数字证书cert_path = 'path/to/cert.pem'cert = load_certificate(cert_path)```2. 数字签名的生成与验证(1)使用数字签名工具,对一份文档进行数字签名。
法医学中数字鉴定技术研究
法医学中数字鉴定技术研究随着数字信息技术的快速发展,在法医领域中数字鉴定技术逐渐发挥了重要作用。
数字鉴定技术的发展不仅可以提高鉴定工作的效率和准确度,还可以有效减少人为因素的干扰,从而提升鉴定结果的可信度。
因此,数字鉴定技术被越来越广泛地应用于法医学中。
一、数字鉴定技术在法医学中的应用1.数字图像分析技术数字图像分析技术可以通过对图像的处理和分析,从中获取关键信息,比如判断图像的真实性、修图痕迹的检测、人脸识别等。
在法医学中,数字图像分析技术常常被用于分析犯罪现场图像、尸体解剖图像等,进行案件鉴定和解决。
此外,数字图像分析技术还可以帮助法医人员更准确地判断伤口的程度和位置,为依法定罪、定刑提供科学依据。
2.数字音频分析技术数字音频分析技术可以对录音、音乐等数字音频进行分析,从中获取关键信息,例如判断录音的真实性、检测音频剪辑等。
在法医学中,数字音频分析技术可以用于分析录音证据的真实性和完整性,提高鉴定结果的准确度和公正性。
此外,数字音频分析技术还可以帮助法医人员判断被害人的死因,进一步推断凶手的作案手段和手法,为案件侦破提供有力的证据。
3.数字文本分析技术数字文本分析技术可以对文本进行分析和挖掘,从中获取关键信息,例如统计单词频率、检测文本抄袭等。
在法医学中,数字文本分析技术可以用于判断文本证据的真实性和完整性,帮助法医人员鉴别文本抄袭和篡改。
此外,数字文本分析技术还可以帮助法医人员判断被害人的心理状态和行为特征,为案件侦破提供有力的证据。
二、数字鉴定技术在法医学中的意义数字鉴定技术在法医学中的应用具有极大的意义。
首先,数字鉴定技术可以提高鉴定工作的效率和准确度,有效减少人为因素的干扰,从而提升鉴定结果的可信度。
其次,数字鉴定技术可以帮助法医人员直接获取、分析和处理数据,而不必再花费大量时间和精力手工整理数据。
此外,数字鉴定技术还可以加速与案件相关的证据的鉴定和分析,提高调查和破案速度。
三、数字鉴定技术在未来的应用前景数字鉴定技术在未来有着广泛的应用前景。
8份华中科技大学检测技术实验报告
编者寄语内含8篇华中科技大学检测技术实验报告,基本涵盖各个实验。
其中最后一篇含有书上的各种设计性实验,可供大家参考。
华科的孩子,没事偷着乐吧。
电气学科大类《信号与控制综合实验》实验报告(基本实验一:检测技术基本实验)姓名学号专业班号指导教师日期实验成绩评阅人实验二十二差动变压器的标定一、实验目的通过实验学习差动变压测试系统的组成和标定方法。
二、实验原理差动变压器由衔铁、初级线圈、次级线圈和线圈骨架等组成。
初级线圈作为差动变压器激励用,相当于变压器的原边;次级线圈由两个结构尺寸和参数相同的相同线圈反相串接而成,相当于变压器的副边。
差动变压器是开磁路,工作是建立在互感基础上。
由于零残电压的存在会造成差动变压器零点附近的不灵敏区,电压经过放大器会使放大器末级趋向饱和,影响电路正常关系,因此必须采用适当的方法进行补偿。
零残电压中主要包含两种波形成份:1、基波分量:这是由于差动变压器两个次级绕组因材料或工艺差异造成等效电路参数(M、L、R)不同,线圈中的铜损电阻及导磁材料的铁损,线圈中线间电容的存在,都使得激励电流与所产生的磁通不同相。
2、高次谐波:主要是由导磁材料磁化曲线非线性引起,由于磁滞损耗和铁磁饱和的影响,使激励电流与磁通波形不一致,产生了非正弦波(主要是三次谐波)磁通,从而在二次绕组中感应处非正弦波的电动势。
减少零残电压的办法有:1、从设计和工艺制作上尽量保证线路和磁路的对程;2、采用相敏检波电路;3、选用补偿电路。
相敏检波器工作原理:相敏检波电路如图所示,图○1为输入信号端,○2为交流参考电压输入端,○3为输出端。
○4为直流参考电压输入端。
⑤、⑥为整形电路将正弦信号转换成的方波信号,使相敏检波器中的电子开关正常工作。
当○2、○4端输入控制电压信号时,通过差动放大器的作用使D和J处于开关状态,从而把○1端输入的正弦信号转换成半波整流信号。
相敏检波器原理图三、实验所需部件差动变压器、音频振荡器、电桥、差动放大器、移相器、相敏检波器、低通滤波器、电压表、示波器、测微仪四、实验步骤(一)了解相敏检波器工作原理1.调节音频振荡器输出频率为5KHZ,输出幅值2V,将音频振荡器00端接相敏检波器的输入端①,相敏检波器的输出端③与低通滤波器的输入端连接,低通滤波器的输出端接数字电压表2V。
数字识别实训报告心得体会
一、实训背景随着人工智能技术的飞速发展,数字识别技术在各个领域得到了广泛应用。
为了提高我国在数字识别领域的竞争力,培养具备实际操作能力的专业人才,我们参加了为期一个月的数字识别实训。
通过本次实训,我们对数字识别技术有了更深入的了解,掌握了数字识别的基本原理和实际应用。
二、实训内容1. 数字识别基本原理实训期间,我们学习了数字识别的基本原理,包括数字图像预处理、特征提取、分类器设计等。
通过学习,我们了解到数字识别技术主要分为两个阶段:图像预处理和特征提取,其中图像预处理包括灰度化、二值化、滤波等操作,特征提取包括边缘检测、形态学变换、纹理分析等操作。
2. 数字识别算法实训中,我们重点学习了两种数字识别算法:基于模板匹配的识别算法和基于机器学习的识别算法。
通过对比分析,我们了解到基于模板匹配的识别算法在处理简单场景时具有较高的识别率,而基于机器学习的识别算法在处理复杂场景时具有更好的泛化能力。
3. 数字识别应用实训期间,我们还学习了数字识别在各个领域的应用,如车牌识别、指纹识别、人脸识别等。
通过实际案例的分析,我们了解到数字识别技术在智能交通、安防监控、生物识别等领域的应用前景广阔。
三、实训收获1. 理论知识与实践相结合本次实训将数字识别理论知识与实际操作相结合,使我们更加深刻地理解了数字识别技术的原理和应用。
在实训过程中,我们不仅学习了数字识别的基本原理,还通过实际操作掌握了数字识别技术的应用方法。
2. 提高编程能力在实训过程中,我们使用了多种编程语言(如Python、C++等)进行数字识别程序的开发。
通过实际编程,我们的编程能力得到了显著提高,为今后从事相关领域的工作打下了坚实的基础。
3. 培养团队合作精神实训过程中,我们分成小组进行项目开发,每个成员都承担着不同的任务。
在团队合作中,我们学会了相互沟通、协作,共同解决问题。
这为我们今后在工作中与他人合作提供了宝贵经验。
4. 增强创新意识实训过程中,我们不断尝试改进数字识别算法,优化程序设计。
数字识别实验报告
数字识别实验报告数字识别实验报告引言:数字识别是计算机视觉领域的一个重要研究方向,它涉及到图像处理、模式识别等多个学科。
本实验旨在通过构建一个数字识别模型,探索不同算法在数字识别中的效果,并比较它们的准确性和稳定性。
一、实验设计1. 数据集选择本实验选用了MNIST数据集,该数据集包含了大量手写数字的图像样本,是数字识别领域中最经典的数据集之一。
2. 算法选择本实验采用了三种常见的数字识别算法:K近邻算法、支持向量机算法和深度学习算法(卷积神经网络)。
3. 实验步骤(1)数据预处理:对原始图像进行灰度化、二值化等处理,以便将图像转化为算法所需的输入格式。
(2)特征提取:提取图像中的特征,如边缘、纹理等,以便算法能够更好地区分不同的数字。
(3)模型训练:使用训练集对选定的算法进行训练,并调整算法的参数以提高模型的准确性。
(4)模型测试:使用测试集对训练好的模型进行测试,并记录准确率和识别速度等指标。
(5)结果分析:比较不同算法在数字识别中的表现,并分析其优缺点。
二、实验结果1. K近邻算法经过实验,我们发现K近邻算法在数字识别中表现出较高的准确性,但由于其计算复杂度较高,在大规模数据集上的运行速度较慢。
2. 支持向量机算法支持向量机算法在数字识别中也取得了不错的效果,尤其在处理非线性可分问题时表现出色。
然而,该算法对于大规模数据集的训练时间较长。
3. 深度学习算法(卷积神经网络)深度学习算法在数字识别中展现出了强大的潜力,通过构建多层卷积神经网络,我们得到了较高的准确率和较快的识别速度。
然而,该算法对于数据集的规模和质量要求较高,需要更多的计算资源和训练时间。
三、结果分析综合比较三种算法的实验结果,我们可以得出以下结论:1. K近邻算法在准确性方面表现出色,但在处理大规模数据时速度较慢。
2. 支持向量机算法在处理非线性问题时具有优势,但对于大规模数据集的训练时间较长。
3. 深度学习算法在准确率和识别速度方面都有较好的表现,但对数据集的规模和质量要求较高。
数字图像处理与识别实验报告参考模板
数字图像处理与识别实验报告实验题目:手写数字识别实验目的:使用神经网络图像识别方法对鼠标滑动输入的手写数字进行训练和识别,使计算机能够识别0~9十个数字。
了解机器学习和神经网络原理并且将其应用在图像处理识别中。
实验方法:基于反向传播(BP)神经网络方法BP拓扑网络结构:BP网络包含输入层、隐含层和输出层,每层包含了许多并行运算的神经元,层与层之间的神经元采用全互连方式,当样本输入网络后,各神经元的激励值由输入层经各隐含层向输出层传播。
然后计算目标输出与实际输出的误差,并按照误差减小的方向,从输出层逐层修正各连接权值,最后回到输入层,如此反复直到达到期望的输出。
这种信息的正向传递和误差的反向传播过程,就是BP网络每一层权值不断调整过程,也就相当于网络的学习过程。
它的实质是计算误差信号的最小值,采用的是梯度下降算法,按误差函数的负梯度方向修改权值。
本实验中可以将训练与测试同步结合起来,测试的过程中也在不断的学习。
本次实验采用的是神经网络中的监督式学习,也就是说外部环境有一个监督元。
它能为一组输入提供期望得到的输出,系统可以根据实际输出与目标输出的差值反馈给权重来调节权重的值,这一差值也就是误差信号。
在试验中,系统每次做出一个预测,会提问你预测的是否正确,若正确则不用对参数进行重新训练,若错误,则需要输入正确的值,系统对参数进行训练,这就是一个监督学习的方式。
基于BP神经网络的数字识别算法步骤为:a.初始化神经单元参数。
包括输入层、隐藏层和输出层节点数量,本次实验的输入层是400(20×20的灰度值),隐藏层是26,输出层是10,设置最大迭代次数为50.b.加载训练数据集。
将已经训练过的数字图像数据导入进来。
我输入的是一个20×20像素的手写数字图像,将其转化为灰度图,取400个像素值作为输入层的值。
实验中需要大量的训练数据,对神经网络中的参数进行训练。
本实验,下图为输入的黑白手写数字图像。
华中科技大学HUST微机原理并行IO接口数码管实验报告
电子信息与通信学院实验报告实验名称:微机原理实验课程名称:并行IO接口设计班级:姓名:学号:教师:一、实验目的1.掌握GPIO IP核的工作原理和使用方法2.掌握中断控制方式的IO接口设计原理3.掌握中断程序设计方法4.掌握IO接口程序控制方法-------查询方式-------延时方式二、实验任务写一个数码管滚动输出任意数字的程序,并下载到FPGA板子上,用延时、中断两种方式实现。
三、实验原理硬件实现框图如图所示:四、硬件实现步骤1.使用XPS创建一个基于AXI总线的最小计算机系统。
File –> New BSB Project,如图:2.修改时钟设置:将时钟产生器的时钟输入信号进行修改,修改为单一时钟源。
修改后的结果如图:3.添加GPIO IP核,设置seg_0配置:a.在IP Catalog标签中,双击下面图标创建GPIO IP核:b.添加GPIO IP核后,将名字改为LED_16Bits,如图:c.更改seg_0配置窗口的属性,如图:4.添加AXI Interrupt Controller IP核:a.在IP Catalog标签中,双击下面图标创建INTC IP核:b.添加axi_intc_0的中断源,如图:c.将microblaze_0实例的INTERRUPT引脚选择axi_intc_0_INTERRUPT,如图:5.产生外部GPIO连接:a.选中seg_0中的GPIO_IO_O,选择make external,生成外部连接端口;选中GPIO_IO,设置为“No connection”,取消其外部连接端口;选中seg_0中的GPIO2_IO_O,选择make external,生成外部连接端口;选中GPIO2_IO,设置为“No connection”,取消其外部连接端口。
结果如图:b.在ports标签下,展开External Ports项,可看到seg_0生成的seg_0_GPIO2_IO_pin和seg_0_GPIO_IO_pin端口,如图:6.添加timer IP核:a.选择如图的IP核并双击,添加到工程:b.中断信号的连接结果如图所示:7.配置UCF文件:在UCF文件中修改如下所示配置,配置LED连接电路约束:NET "CLK" TNM_NET = sys_clk_pin;TIMESPEC TS_sys_clk_pin = PERIOD sys_clk_pin 100000 kHz;NET "CLK" LOC = "E3" | IOSTANDARD = "LVCMOS33";NET "RESET" LOC = "E16" | IOSTANDARD = "LVCMOS33";NET "RsRx" LOC = "C4" | IOSTANDARD = "LVCMOS33";NET "RsTx" LOC = "D4" | IOSTANDARD = "LVCMOS33";NET "seg_0_GPIO2_IO_pin<0>" LOC = "L3" | IOSTANDARD = "LVCMOS33"; NET "seg_0_GPIO2_IO_pin<1>" LOC = "N1" | IOSTANDARD = "LVCMOS33"; NET "seg_0_GPIO2_IO_pin<2>" LOC = "L5" | IOSTANDARD = "LVCMOS33"; NET "seg_0_GPIO2_IO_pin<3>" LOC = "L4" | IOSTANDARD = "LVCMOS33"; NET "seg_0_GPIO2_IO_pin<4>" LOC = "K3" | IOSTANDARD = "LVCMOS33"; NET "seg_0_GPIO2_IO_pin<5>" LOC = "M2" | IOSTANDARD = "LVCMOS33"; NET "seg_0_GPIO2_IO_pin<6>" LOC = "L6" | IOSTANDARD = "LVCMOS33"; NET "seg_0_GPIO2_IO_pin<7>" LOC = "M4" | IOSTANDARD = "LVCMOS33"; NET "seg_0_GPIO_IO_pin<0>" LOC = "N6" | IOSTANDARD = "LVCMOS33"; NET "seg_0_GPIO_IO_pin<1>" LOC = "M6" | IOSTANDARD = "LVCMOS33"; NET "seg_0_GPIO_IO_pin<2>" LOC = "M3" | IOSTANDARD = "LVCMOS33"; NET "seg_0_GPIO_IO_pin<3>" LOC = "N5" | IOSTANDARD = "LVCMOS33"; NET "seg_0_GPIO_IO_pin<4>" LOC = "N2" | IOSTANDARD = "LVCMOS33"; NET "seg_0_GPIO_IO_pin<5>" LOC = "N4" | IOSTANDARD = "LVCMOS33"; NET "seg_0_GPIO_IO_pin<6>" LOC = "L1" | IOSTANDARD = "LVCMOS33"; NET "seg_0_GPIO_IO_pin<7>" LOC = "M1" | IOSTANDARD = "LVCMOS33";8.创建工程过程完成后,a.在主界面下选择Hardware->Generate Netlist;b.在主界面下选择Hardware->Generate Bitstream;c.单击Graphical Design View,可以看到系统的连接图,如下:五、软件设计1.中断方式实现数码管滚动任意数字用户应用程序的设计包括定时器配置、启动中断系统、设计中断服务程序。
手写体数字识别实验报告
软件学院12-13-2学期《人工智能》课程项目报告题目:使用SMO方法进行手写体数字识别目录软件学院12-13-2学期《人工智能》课程项目报告 (1)1 问题描述 (2)2 二值化处理 (2)2.1 思想: (2)2.2 OSTU算法: (2)2.3 OTSU算法伪代码: (2)3 降维处理 (2)4.半监督算法 (4)4.1半监督算法流程: (4)4.2半监督算法的主要算法: (4)1)self-Training models: (4)2)Propagating-1-nearest-neighbor: (4)3)CLUSTER-THEN-LABELMETHODS (4)4)Co_Training: (4)5)基于图的算法(Graph based Learning): (5)4.4半监督学习分类算法的现实价值: (5)5 我使用SVM的SMO算法 (5)5.1 SMO算法基本思想: (5)5.2 应用SMO算法的流程: (5)6 性能分析 (6)6.1.监督学习 (6)6.2.半监督学习(Tri-training) (6)6.3 我们用J48,SMO, NaiveBayes以及BayesNet四种算法对降维后的算法进行训练并求出其准确性,得到如下数据 (7)7 思考总结 (7)1 问题描述手写体数字识别问题,简而言之就是识别出10个阿拉伯数字,由于数字的清晰程度或者是个人的写字习惯抑或是其他,往往手写体数字的形状,大小,深浅,位置会不大一样。
现在我们拥有3006个带标记的数据以及56994的未带标记的数据,而我们的目标就是正确识别出这些手写体数字。
因此我们可以把这些带标记的数据看作经验值,运用一定算法来学习,预测出这些未带标记的数据。
对问题的分析如下:1 考虑到每个值都是0-255之间的一个整型值,对于算法的分析操作会影响性能,我将每个值进行了二值化,变成0,1。
2 考虑到这些数据都是28×28=784维的,维数太大,在后续的学习过程中效率会很低,我对它进行了降维处理。
武大数字实验报告
实验名称:数字电路基础实验实验日期:2023年10月25日实验目的:1. 理解数字电路的基本组成和工作原理。
2. 掌握组合逻辑电路和时序逻辑电路的设计方法。
3. 培养实际操作能力和分析问题的能力。
实验原理:数字电路是利用二进制数字信号进行逻辑运算、存储和控制等功能的一种电子电路。
它由逻辑门、触发器、计数器等基本元件组成。
本实验主要涉及组合逻辑电路和时序逻辑电路。
实验仪器与材料:1. 74LS系列集成电路2. 数字逻辑实验箱3. 示波器4. 逻辑分析仪5. 电源6. 导线实验内容:一、组合逻辑电路实验1. 实验一:逻辑门电路(1)使用与非门、或非门、异或门等基本逻辑门,设计并实现以下逻辑函数:- F(A, B) = A + B- G(A, B, C) = AB + C- H(A, B, C) = A'B'C + ABC(2)使用示波器观察输入输出波形,验证逻辑函数的正确性。
2. 实验二:编码器(1)设计并实现一个4-2线优先编码器。
(2)使用示波器观察输入输出波形,验证编码器的正确性。
3. 实验三:译码器(1)设计并实现一个2-4线译码器。
(2)使用示波器观察输入输出波形,验证译码器的正确性。
二、时序逻辑电路实验1. 实验一:触发器(1)设计并实现一个D触发器。
(2)使用示波器观察输入输出波形,验证D触发器的正确性。
2. 实验二:计数器(1)设计并实现一个4位同步计数器。
(2)使用示波器观察输入输出波形,验证计数器的正确性。
3. 实验三:寄存器(1)设计并实现一个8位双向移位寄存器。
(2)使用示波器观察输入输出波形,验证寄存器的正确性。
实验结果与分析:1. 组合逻辑电路实验通过实验,我们掌握了逻辑门电路的基本原理和操作方法,能够根据逻辑函数设计电路,并使用示波器验证电路的正确性。
2. 时序逻辑电路实验通过实验,我们了解了触发器、计数器和寄存器等时序逻辑电路的工作原理,掌握了时序逻辑电路的设计方法,并能够使用示波器观察电路的波形。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
身份认证课程实验报告基于X509证书和SSL协议的身份认证编程实现学号指导老师:时间:一、实验的目的和意义身份认证是信息安全与保密技术的核心技术之一,是一门实践性非常强的课程,实践教学是培养密码技术应用性人才的重要途径,实践教学质量的好环,实际上也决定了应用型人才培养质量的高低。
因此,加强身份认证课程实践教学环节,提高实践教学质量,对培养高质量的应用型人才至关重要。
本实验主要有以下目的:理解和掌握X509证书和SSL协议;能够正确编译、安装、部署和配置openssl系统;能够利用openssl系统建立一个小型的CA中心,产生密钥对,申请、发布、撤销证书,能够发布CRL列表;能够自己动手编写程序,使用openssl系统发布的证书进行C/S系统的身份认证,使用openssl对C/S之间的通信信息进行加密。
二、实验原理OpenSSL是一个开放源代码的SSL协议的产品实现,它采用C语言作为开发语言,具备了跨系统的性能,支持Linux、Unix、Windows、Mac和VMS等多种平台。
虽然OpenSSL使用SSL作为其名字的重要组成部分,但其实现的功能确远远超出了SSL协议本身。
OpenSSL事实上包括了三部分:SSL协议、密码算法库和应用程序库。
SSL协议部分完全实现和封装了SSL协议的三个版本和TLS协议,SSL协议库的实现是在密码算法库的基础上实现的。
使用该库,你完全可以建立一个SSL服务器和SSL客户端。
密码算法库是一个强大完整的密码算法库,它是OpenSSL的基础部分,也是很值得一般密码安全技术人员研究的部分,它实现了目前大部分主流的密码算法和标准。
主要包括公开密钥算法、对称加密算法、散列函数算法、X509数字证书标准、PKCS12、PKCS7等标准。
事实上,OpenSSL的SSL协议部分和应用程序部分都是基于这个库开发的。
基于OpenSSL指令的应用很容易,只要安装好了OpenSSL,就可以开始使用了。
最简单的应用就是使用Req、CA以及X509指令来签发一个证书了,该证书可以用于各种目的,比如很多Apache服务器就是使用OpenSSL的指令生成的证书作为服务器证书。
三、实验要求①能够在windows系统下,安装vc6和Perl组件系统。
解压Openssl软件包,进行正确编译、安装和配置Openssl系统;保证Openssl系统的正确运行;②能够发布CA自签名证书;建立一个小型的CA中心;熟悉CA证书系统的密钥对的产生、提出证书申请、发布证书、撤销证书、发布CRL列表等流程;发布以自己姓名(汉语全拼)为名字的个人证书;发布Server服务器端的证书;③熟悉基于socket的网络通信编程的相关知识,编写简单的Client程序和Server程序,实现Client程序与Server程序之间基于X509证书和SSL协议身份认证和通信加密;具体可参考Openssl目录下的client和server目录下的相关源代码;④设计用户界面,能够由用户自己输入想要传输的message;比如-m “zhangsan is working”,服务器能够接收并且显示消息。
⑤对程序重要的函数添加完整的注释,对重要函数都要说明清楚函数的功能、输入和输出参数列表、返回值和函数内部的关键算法。
四、实验环境Windows7 Ultimate操作系统,Microsoft Visual C++6.0 SP6和ActivePerl5.8.0.806编译环境,openssl-0.9.8软件包。
五、实验操作过程1.安装openssl软件包1.1 .安装PERL组件ActivePerl-5.8.0.806-MSWin32-x86,如图5-1所示。
图5-11.2 解压openssl-0.9.8.rar压缩包至D:\openssl目录下,如图5-2所示。
图5-21.3 打开命令提示符控制台,进入解压后的openssl文件夹,执行perl Configure VC-WIN32命令,如图5-3所示。
图5-31.4 继续在该目录下,执行ms\do_ms命令,如图5-4所示。
图5-41.5 进入vc6.0安装文件夹(c:\ Program Files\Microsoft Visual Studio\VC98\bin),执行vcvars32.bat命令,设置系统环境变量,如图5-5所示。
图5-51.6 重新返回D:\openssl,执行nmake -f ms\ntdll.mak命令,安装OpenSSL动态库,如图5-6所示。
安装后,执行nmake -f ms\ntdll.mak test,对安装情况进行测试,如图5-7所示。
图5-6图5-72.创建CA中心2.1 CA认证中心需要下列相关目录,故手动建立下列目录。
如图5-8所示。
c:\caroot\c:\caroot\certsc:\caroot\newcertsc:\caroot\privatec:\caroot\crl在caroot根目录下手动创建一个空的文本数据库文件index.txt。
图5-72.2 在private目录下生成随机数文件.rnd。
可以用C:\caroot>edit private\.rnd这种方式生成。
生成后的.rnd文件内容如图5-8所示。
图5-82.3 生成证书序列号文件serial。
在caroot下创建证书序列号文件serial,使用文本编辑器打开,在文件中输入"01";(文件内容无银号),此处也可以者使用命令C:\caroot>echo 01 > serial (注意确认serial文件内容为01,并且无引号)。
如图5-9和5-10所示。
图5-9图5-102.5 产生CA私钥在openssl下执行genrsa -out c:\caroot\private\ca.key -rand c:\caroot\private\.rnd 2048,生成密钥ca.key。
这里采用默认的rsa加密算法,生成2048位密钥。
如图5-9所示。
图5-102.5 生成CA证书ca.crt.如图5-11所示。
req -new -x509 -days 3650 -key c:\caroot\private\ca.key -out c:\caroot\private\ca.crt -configc:\caroot\f图5-11安装过程中输入的用户信息如图5-12所示。
图5-12安装成功后,用以下命令查看文件证书:x509 -in c:\caroot\private\ca.crt -noout–text。
证书内容如图5-13和图5-14所示。
图5-13图5-142.6生成自签名证书请求,并签发证书生成密钥执行genrsa -out c:\caroot\certs\cert.key -rand c:\caroot\private\.rnd -des3 2048,生成cert.key 如图5-15所示。
图5-15执行openssl>genrsa -out private\ca.key -rand private\.rnd -des 2048 ,生成ca.key,并输入所需信息。
执行结果如图5-16所示。
5-16执行openssl>x509 -in private\ca.crt -noout –text,查看密钥,如图5-17和5-18所示。
图5-17图5-182.7 重复以上步骤,执行生成server的证书过程。
如图5-19至5-所示。
图5-19图5-20图5-21图5-222.8 重复以上步骤,生成产生proxy的证书过程。
2.9重复以上步骤,生成产生client的证书过程。
2.10 重复以上步骤,生成产生张三的证书过程。
3.安装openssl软件分别编译client和server目录下的程序。
3.1在visual C++中打开server工程,调试编译直至结果无误。
如图5-23所示。
图5-233.2 连接生成server.exe可执行文件,如图5-24。
图5-243.3 在visual C++中打开client工程,调试编译直至结果无误,如图5-25。
图5-253.4 连接生成client.exe可执行文件,如图5-26所示。
图5-26六、程序测试和运行结果1 打开server.exe文件,如图所示。
窗口显示“begin TCP socket”,如图6-1所示。
图6-12 打开client.exe文件。
窗口显示信息如图6-2所示:图6-27根据提示,输入字符串。
此处输入Hi!how are you?what’s your name?执行回车,在client窗口显示“Got 11 chars:’I hear you’”如图6-3所示。
图6-3此时,在server窗口接收到如下消息:“Got 32 chars:’H i!how are you?what’s your name?’”如图6-4所示。
图6-4从以上实验现象可知Client程序与Server程序之间基于X509证书和SSL协议身份认证和通信加密获得成功。
七、实验的心得体会本次试验在编译安装各组件、配置实验环境时,遇到了很多问题,比如VC6.0对win7系统支持不是很好,编译openssl动态库时常常失败,在网上查到了很多资料才终于弄明白了。
从这里我认识到,虽然有现成的操作过程可以参考,但还是比不上自己的动手实践。
只有自己操作,才能够真正明白和解决实际中遇到的各种问题。
这次试验也让我明白了X509证书和SSL协议的一些基本知识,学会了利用openssl建立小型CA中心,发布证书等操作。
实践出真知,这远比从课本上的来的知识更重要。
八、附加程序的完成的源代码1 服务器端源程序(server.cpp)// server.cpp : Defines the entry point for the console application.////#ifdef WIN32//#include "stdafx.h"/****************************************************************************** *SSL/TLS服务端程序WIN32版(以demos/server.cpp为基础)*需要用到动态连接库libeay32.dll,ssleay.dll,*同时在setting中加入ws2_32.lib libeay32.lib ssleay32.lib,*以上库文件在编译openssl后可在out32dll目录下找到,*所需证书文件请参照文章自行生成.******************************************************************************/ #include <stdio.h>#include <stdlib.h>#include <memory.h>#include <errno.h>#include <sys/types.h>#ifdef WIN32#include <winsock2.h>#else/* Networking headers */#include <netinet/in.h> /* structsockaddr_in */#include <sys/socket.h> /* getpeername */#include <arpa/inet.h> /* inet_ntoa */#include <sys/time.h> /* select */#include <sys/ioctl.h> /* ioctl */#include <netinet/tcp.h>#include <netdb.h>#include <unistd.h>#ifndef INADDR_ANY#define INADDR_ANY (u32)0x00000000#endif#ifndef INADDR_LOOPBACK#define INADDR_LOOPBACK (u32)0x7F000001#endifexterninterrno;#define get_last_socket_error() errno#define get_last_error() errno#define readsocket(s,b,n) read((s),(b),(n))#define writesocket(s,b,n) write((s),(b),(n))#define closesocket(s) close(s)#define ioctlsocket(a,b,c) ioctl((a),(b),(c))#include "globalmem.h"#endif#include "openssl/rsa.h"#include "openssl/crypto.h"#include "openssl/x509.h"#include "openssl/pem.h"#include "openssl/ssl.h"#include "openssl/err.h"/*所有需要的参数信息都在此处以#define的形式提供*/#define CERTF "C:\\caroot\\certs\\server.crt" /*服务端的证书(需经CA签名)*/#define KEYF "C:\\caroot\\private\\server.key" /*服务端的私钥(建议加密存储)*/#define CACERT "C:\\caroot\\private\\ca.crt" /*CA 的证书*/#define PORT 8888 /*准备绑定的端口*/#define CHK_NULL(x) if ((x)==NULL) exit (1)#define CHK_ERR(err,s) if ((err)==-1) { perror(s); exit(1); }#define CHK_SSL(err) if ((err)==-1) { ERR_print_errors_fp(stderr); exit(2); }int main (){ int err;intlisten_sd;intsd;structsockaddr_insa_serv;structsockaddr_insa_cli;intclient_len;SSL_CTX* ctx;SSL* ssl;X509* client_cert;char* str;charbuf [4096];SSL_METHOD *meth;#ifdef WIN32WSADATA wsaData;if(WSAStartup(MAKEWORD(2,2),&wsaData) != 0){printf("WSAStartup()fail:%dn",GetLastError());return -1;}#endifSSL_load_error_strings(); /*为打印调试信息作准备*/OpenSSL_add_ssl_algorithms(); /*初始化*/meth = TLSv1_server_method(); /*采用什么协议(SSLv2/SSLv3/TLSv1)在此指定*/ctx = SSL_CTX_new (meth);CHK_NULL(ctx);SSL_CTX_set_verify(ctx,SSL_VERIFY_PEER,NULL); /*验证与否*/SSL_CTX_load_verify_locations(ctx,CACERT,NULL); /*若验证,则放置CA证书*/if (SSL_CTX_use_certificate_file(ctx, CERTF, SSL_FILETYPE_PEM) <= 0) { ERR_print_errors_fp(stderr);exit(3);}if (SSL_CTX_use_PrivateKey_file(ctx, KEYF, SSL_FILETYPE_PEM) <= 0) { ERR_print_errors_fp(stderr);exit(4);}if (!SSL_CTX_check_private_key(ctx)) {printf("Private key does not match the certificate public keyn");exit(5);}SSL_CTX_set_cipher_list(ctx,"RC4-MD5");/*开始正常的TCP socket过程.................................*/printf("Begin TCP socket...\n");listen_sd = socket (AF_INET, SOCK_STREAM, 0);CHK_ERR(listen_sd, "socket");memset (&sa_serv, '\0', sizeof(sa_serv));sa_serv.sin_family = AF_INET;sa_serv.sin_addr.s_addr = INADDR_ANY;sa_serv.sin_port = htons (PORT);err = bind(listen_sd, (structsockaddr*) &sa_serv,sizeof (sa_serv));CHK_ERR(err, "bind");/*接受TCP链接*/err = listen (listen_sd, 5);CHK_ERR(err, "listen");client_len = sizeof(sa_cli);#ifdef WIN32sd = accept (listen_sd, (structsockaddr*) &sa_cli, &client_len);#elsesd = accept(listen_sd, (structsockaddr *)&sa_cli, (socklen_t*)&client_len);#endifCHK_ERR(sd, "accept");closesocket (listen_sd);printf ("Connection from %lx, port %x\n",sa_cli.sin_addr.s_addr, sa_cli.sin_port);/*TCP连接已建立,进行服务端的SSL过程. */printf("Begin server side SSL\n");ssl = SSL_new (ctx);CHK_NULL(ssl);SSL_set_fd (ssl, sd);err = SSL_accept (ssl);printf("SSL_accept finished\n");CHK_SSL(err);/*打印所有加密算法的信息(可选)*/printf ("SSL connection using %s\n", SSL_get_cipher (ssl));/*得到服务端的证书并打印些信息(可选) */client_cert = SSL_get_peer_certificate (ssl);if (client_cert != NULL) {printf ("Client certificate:\n");str = X509_NAME_oneline (X509_get_subject_name (client_cert), 0, 0);CHK_NULL(str);printf ("\t subject: %s\n", str);//free (str);str = X509_NAME_oneline (X509_get_issuer_name (client_cert), 0, 0);CHK_NULL(str);printf ("\t issuer: %s\n", str);//free (str);X509_free (client_cert);/*如不再需要,需将证书释放*/}elseprintf ("Client does not have certificate.\n");/* 数据交换开始,用SSL_write,SSL_read代替write,read */while(true){err = SSL_read (ssl, buf, sizeof(buf) - 1);CHK_SSL(err);buf[err] = '\0';printf ("Got %d chars:'%s'\n", err, buf);err = SSL_write (ssl, "I hear you.", strlen("I hear you."));CHK_SSL(err);}/* 收尾工作*/shutdown (sd,2);SSL_free (ssl);SSL_CTX_free (ctx);return 0;}/**************************************** EOF - serv.cpp*******************/2 客户端源程序(client.cpp)// client.cpp : Defines the entry point for the console application.//#include "stdafx.h"/****************************************************************************** *SSL/TLS客户端程序WIN32版(以demos/cli.cpp为基础)*需要用到动态连接库libeay32.dll,ssleay.dll,*同时在setting中加入ws2_32.lib libeay32.lib ssleay32.lib,*以上库文件在编译openssl后可在out32dll目录下找到,*所需证书文件请参照文章自行生成*/******************************************************************************/ #include <stdio.h>#include <stdlib.h>#include <memory.h>#include <errno.h>#include <sys/types.h>#include <winsock2.h>#include "openssl/rsa.h"#include "openssl/crypto.h"#include "openssl/x509.h"#include "openssl/pem.h"#include "openssl/ssl.h"#include "openssl/err.h"#include "openssl/rand.h"/*所有需要的参数信息都在此处以#define的形式提供*/// #define CERTF "zhangsan.crt" /*客户端的证书(需经CA签名)*/// #define KEYF "zhangsan.key" /*客户端的私钥(建议加密存储)*/#define CERTF "C:\\caroot\\certs\\server.crt" /*客户端的证书(需经CA签名)*/#define KEYF "C:\\caroot\\private\\server.key" /*客户端的私钥(建议加密存储)*/#define CACERT "C:\\caroot\\private\\ca.crt" /*CA 的证书*/#define PORT 8888 /*服务端的端口*///#define SERVER_ADDR "192.168.1.201" /*服务段的IP地址*///#define PORT 1111 /*服务端的端口*/#define SERVER_ADDR "127.0.0.1" /*服务段的IP地址*/#define CHK_NULL(x) if ((x)==NULL) exit (-1)#define CHK_ERR(err,s) if ((err)==-1) { perror(s); exit(-2); }#define CHK_SSL(err) if ((err)==-1) { ERR_print_errors_fp(stderr); exit(-3); }int main (){int err;intsd;structsockaddr_insa;SSL_CTX* ctx;SSL* ssl;X509* server_cert;char* str;charbuf [4096] = {0};charszMsg[4096] = {0};SSL_METHOD *meth;intseed_int[100]; /*存放随机序列*/WSADATA wsaData;if(WSAStartup(MAKEWORD(2,2),&wsaData) != 0){printf("WSAStartup()fail:%d\n",GetLastError());return -1;}OpenSSL_add_ssl_algorithms(); /*初始化*/SSL_load_error_strings(); /*为打印调试信息作准备*/meth = TLSv1_client_method(); /*采用什么协议(SSLv2/SSLv3/TLSv1)在此指定*/ ctx = SSL_CTX_new (meth);CHK_NULL(ctx);SSL_CTX_set_verify(ctx,SSL_VERIFY_PEER,NULL); /*验证与否*/SSL_CTX_load_verify_locations(ctx,CACERT,NULL); /*若验证,则放置CA证书*/ if (SSL_CTX_use_certificate_file(ctx, CERTF, SSL_FILETYPE_PEM) <= 0) { ERR_print_errors_fp(stderr);exit(-2);}if (SSL_CTX_use_PrivateKey_file(ctx, KEYF, SSL_FILETYPE_PEM) <= 0) {ERR_print_errors_fp(stderr);exit(-3);}if (!SSL_CTX_check_private_key(ctx)) {printf("Private key does not match the certificate public key\n");exit(-4);}/*构建随机数生成机制,WIN32平台必需*/srand( (unsigned)time( NULL ) );for(int i = 0; i < 100;i++ )seed_int[i] = rand();RAND_seed(seed_int, sizeof(seed_int));/*以下是正常的TCP socket建立过程.............................. */printf("Begin tcp socket...\n");sd = socket (AF_INET, SOCK_STREAM, 0);CHK_ERR(sd, "socket");memset(&sa,'\0', sizeof(sa));sa.sin_family = AF_INET;sa.sin_addr.s_addr = inet_addr (SERVER_ADDR); /* Server IP */sa.sin_port = htons (PORT); /* Server Port number */err = connect(sd, (structsockaddr*) &sa,sizeof(sa));CHK_ERR(err, "connect");/* TCP 链接已建立.开始SSL 握手过程.......................... */printf("Begin SSL negotiation \n");ssl = SSL_new (ctx);CHK_NULL(ssl);SSL_set_fd (ssl, sd);err = SSL_connect (ssl);CHK_SSL(err);/*打印所有加密算法的信息(可选)*/printf ("SSL connection using %s\n", SSL_get_cipher (ssl));/*得到服务端的证书并打印些信息(可选) */server_cert = SSL_get_peer_certificate (ssl);CHK_NULL(server_cert);printf ("Server certificate:\n");str = X509_NAME_oneline (X509_get_subject_name (server_cert),0,0); CHK_NULL(str);printf ("\t subject: %s\n", str);//free (str);str = X509_NAME_oneline (X509_get_issuer_name (server_cert),0,0); CHK_NULL(str);printf ("\t issuer: %s\n", str);//free (str);X509_free (server_cert); /*如不再需要,需将证书释放*//* 数据交换开始,用SSL_write,SSL_read代替write,read */printf("Begin SSL data exchange\nPlease Input the message:\n");while(gets(szMsg),szMsg[0] != 0){err = SSL_write (ssl, szMsg, strlen(szMsg));CHK_SSL(err);char* presult = NULL;unsigned long nresult = 0;err = SSL_read (ssl, buf, 100);printf ("Got %d chars:'%s'\n", err, buf);//nresult = atoi(buf);//if ( (err == 10) &&//(nresult> 0))// {// presult = (char*) malloc(nresult + 1);/// err = SSL_read(ssl, presult, nresult);// if ( err == nresult)// {// presult[nresult] = '\0';// }//CHK_SSL(err);// printf ("Got %d chars:'%s'\n", err, presult);// free(presult);// }//SSL_write(ssl, "1", 1);printf("InPut the Message:\n");}SSL_shutdown (ssl); /* send SSL/TLS close_notify *//* 收尾工作*/shutdown (sd,2);SSL_free (ssl);SSL_CTX_free (ctx);return 0;}/******************************EOF - cli.cpp*************************************/。