静态IP 整数转换 CK sass printing bitmap grid EaselJS 外卖系统源码 idea生成main方法 js对象添加元素 matlab中如何定义函数 kali重启网卡 android网络请求 数据库教程 python随机函数 python3删除文件 安装python教程 windows搭建python开发环境 java实现接口 java正则表达式匹配 java中的string java正则替换 java获取当前年月 java判断语句 内存整理工具 redis入门指南 键盘模拟器 丁丁下载 java电子书 通讯录管理系统 fireworks8序列号 游戏python界面编程 ABViewer 视频后期处理软件 cdr字体加粗 国都证券官网下载 jquery下载 红米3和红米3s的区别 camworks
当前位置: 首页 > 学习教程  > 编程语言

南京邮电大学网络信息安全——OpenSSL加密数据实验(实验二)

2020/9/19 16:03:42 文章标签:

南京邮电大学网络信息安全——OpenSSL加密数据实验(实验二)

  • OpenSSL的下载和编译
    • OpenSSL的下载
    • OpenSSL的编译
      • 解压
      • 配置
      • 编译
  • 利用OpenSSL编程
    • 编译测试文件
      • 测试文件是否通过
        • 设置环境变量(如果按照实验指南来进行安装,不需要设置环境变量)
    • 加密测试
      • 源码编写
      • 编译和测试
  • 总结

OpenSSL的下载和编译

OpenSSL的下载

OpenSSL的下载链接为http://www.openssl.org/source/,在这里找到对应的下载方式
在这里插入图片描述需要注意的是这里可能要搭个梯子,不然下载的可能会相当慢,当然也可以在国内找镜像也不是不可以。
需要注意的是下载的时候要找对版本,i386对应IA32架构(32位系统),amd64对应x86-64架构(64位系统)
这里说一点题外话就是amd64即x86-64架构(俗称的64位架构),由于该架构由amd提出并有inter发扬光大,所以有两个称呼。

OpenSSL的编译

解压

直接将下载好的内容放入Ubuntu即可。
在这里插入图片描述然后执行一下解压命令

user1@ubuntu:~/Desktop$ tar -xzvf openssl-3.0.0-alpha6.tar.gz

这里的xzvf参数的含义如下:

  • x:解压tar格式的文件
  • v:解压时显示详细信息
  • z:使用gzip程序解压
  • f:使用归档

配置

解压完成后检查文件夹
在这里插入图片描述在文件夹内运行

user1@ubuntu:~/Desktop/openssl-3.0.0-alpha6$ ./Configure 

这里和原本的实验要输入的指令不太一样,原来的指令为:

./config –prefix=/usr/local

这里说一下,-perfix参数的意思是将软件的安装路径指定一下,我这里选择尊重Ubuntu的规范,不去修改他。同时写一下安装路径的默认规划为

文件类型路径
二进制文件usr\local\bin
配置文件usr\local\etc
库文件usr\local\local

编译

在原来的文件夹里面运行make指令

user1@ubuntu: make & make install

这时屏幕上会出现大量的输出
在这里插入图片描述等待输出完成,输入指令

user1@ubuntu:  make test

可以看到正在进行测试。
在这里插入图片描述需要注意的是在进行测试的过程中可能会出现某些错误,但是秉着够用就好的原则,我们这里不去关注他,因为这些功能我们可能是用不到的。并且最后的测试结果也是通过的。
在这里插入图片描述然后执行命令,这个命令记得执行,不然找不到对应的头文件和动态库…这个地方我debug了好久

make install

利用OpenSSL编程

编译测试文件

测试文件源码如下

#include <stdio.h>
#include <evp.h>

int main()
{
printf("hello world!");
OpenSSL_add_all_algorithms();
return 0;
}

编译

user1@ubuntu:~/Desktop/OpenSSL_Test$ gcc test.c -I /usr/local/include/openssl/    -lcrypto 

其中参数含义如下:

  • -I:头文件路径
  • -lxxx:在链接阶段链接动态库libxxx.so,如这里链接libcrypto.so文件

这里说一下如果直接按照实验指南里面的指令(不完全一致,修改了环境变量)

gcc test.c –o test –I /usr/local/openssl/include /usr/local/libcrypto.a –ldl

会发现在链接阶段无法通过
在这里插入图片描述

测试文件是否通过

编译完成后会出现以下的文件
在这里插入图片描述直接运行,会出现找不到动态库的错误
在这里插入图片描述原因在于Ubuntu的默认动态库搜索路径为/usr/lib,而我自定义的路径为/usr/local/lib里面,所以需要设置以下环境变量。

设置环境变量(如果按照实验指南来进行安装,不需要设置环境变量)

打开动态链接库配置文件

user1@ubuntu:~/Desktop/OpenSSL_Test$ sudo gedit /etc/ld.so.conf

添加自己的动态库路径
在这里插入图片描述保存,并更新动态库缓存

sudo ldconfig

再次运行,即可成功
在这里插入图片描述

加密测试

源码编写

如果直接使用实验指南里面的源码的话会出现以下报错
在这里插入图片描述经过查询发现在Openssl更新到1.1版本后,其API有一点点改变,修改后的源码如下

#include <stdio.h>
#include <string.h>
#include <openssl/evp.h>
#include <openssl/x509.h> 
void tEVP_Encrypt()
{
	unsigned char key[EVP_MAX_KEY_LENGTH];//密钥
	unsigned char iv[EVP_MAX_KEY_LENGTH];//初始化向量
	/* old usage*/
	//EVP_CIPHER_CTX ctx;//EVP算法上下文
	/* old usage*/

	/*new usage*/
	//EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
	/*new usage*/

	unsigned char out[1024];//输出密文缓冲区
	int outl;//密文长度
	int outltmp;
	char *msg="Hello OpenSSL";//待加密的数据
	int rv;
	int i;	
	//设置key和iv(可以采用随机数和可以是用户输入)
	for(i=0;i<24;i++)
	{
		key[i]=i;
	}
	for(i=0;i<8;i++)
	{iv[i]=i;
	}//初始化密码算法结构体
	EVP_CIPHER_CTX_init(ctx);
	//设置算法和密钥以及向量
rv = EVP_EncryptInit_ex(ctx,EVP_des_ede3_cbc(),NULL,key,iv);
	if(rv!=1)
	{
		printf("Err\n");
		return;
	}
	//数据加密
	rv = EVP_EncryptUpdate(ctx,out,&outl,(const unsigned char*)msg,strlen(msg));
	if(rv!=1)
	{
		printf("Err\n");
		return;
	}//结束数据加密,把剩余数据输出
	rv = EVP_EncryptFinal_ex(ctx,out+outl,&outltmp);
	if(rv!=1)
	{
		printf("Err\n");
		return;
	}
	outl = outl +outltmp;
	printf("Original text:%s\n",msg);
	//打印输出密文
printf("Length of ciphertext:%d\n Data of ciphertext:\n",outl);
	for(i=0;i<outl;i++)
	{
		printf("0x%02x ",out[i]);
	}printf("\n");
}
int main()
{ 
	OpenSSL_add_all_algorithms();
	tEVP_Encrypt();
	return 0;
}

编译和测试

/usr/bin/g++ -g /home/user1/Desktop/OpenSSL_Test/test2.cpp -o /home/user1/Desktop/OpenSSL_Test/test2 -I /usr/local/include/openssl/ -lcrypto

执行即可成功

在这里插入图片描述

总结

总体来说,这次的实验虽然涉及到了Ubuntu下的编译和编程,但是可能由于openssl用的人比较多,编译过程中并没有“炼丹“。并且测试源码都已经给出了,所以总体来说比较简单。相较第一个实验来说,因为并没有涉及到软件的使用,所以并没有像使用WireShark时由于每个人的WireShark版本不一致导致实验难易不一。
需要注意的有两个点:

  • 动态库名称及路径的设置,在这个实验里面要链接的动态库为libcrypto.so
  • Openssl的API的变化

本文链接: http://www.dtmao.cc/news_show_200343.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?