实验一 密码引擎-1-OpenEuler-OpenSSL编译

一、任务详情

  1. 安装Ubuntu和OpenEuler虚拟机
  2. 下载最新的OpenSSL源码(1.1版本)
  3. 用自己的8位学号建立一个文件夹,cd 你的学号,用pwd获得绝对路径
  4. 参考 https://www.cnblogs.com/rocedu/p/5087623.html 先在Ubuntu中完成OpenSSL编译安装,然后在OpenEuler中重现
    ./config --prefix=..(学号目录的绝对路径)指定OpenSSL编译链接
  5. 提交 test_openssl.c 编译运行截图
  6. 加分项:在Windows中编译OpenSSL,记录编译过程,提交相关文档(推荐MarkDown格式)

二、Linux下OpenSSL的安装

(一)环境

  • Ubuntu 22.04
  • OpenSSL 1.1.1t
    Ubuntu最新版本下载参见http://www.ubuntu.com/download/。
    OpenSSL最新版本下载参见http://www.openssl.org/source/。

(二)安装过程

1.首先解压源代码:

tar xzvf openssl-1.1.1t.tar.gz

image

2.然后进入源代码目录:

cd openssl-1.1.1t

image

3.然后使用下列命令编译安装:

./config
make
sudo make install

image
image
image

三、用自己的8位学号建立一个文件夹,cd 你的学号,用pwd获得绝对路径

image

四、参考 https://www.cnblogs.com/rocedu/p/5087623.html 先在Ubuntu中完成OpenSSL编译安装,然后在OpenEuler中重现

./config --prefix=..(学号目录的绝对路径)指定OpenSSL编译链接

image
image

五、提交 test_openssl.c 编译运行截图

(一)编译

gcc -o test_openssl test_openssl.c -I/usr/local/ssl -L/usr/local/lib -lcrypto -ldl -lpthread

(二)执行,结果打印0

./test_openssl;echo $?

image

六、加分项:在Windows中编译OpenSSL,记录编译过程,提交相关文档(推荐MarkDown格式)

(一)下载Windows下安装openssl

openssl源码和Windows版下载地址:https://oomake.com/download/opensslhttps://slproweb.com/products/Win32OpenSSL.html

image

(二)链接openssl设置

1.加静态库

  (先激活项目)菜单栏->Project->Build Options->Debug->Linker settings->Add 自己openssl安装目录下/lib下所有.lib文件(选择时使用Ctrl+A)
image

2.加动态库

  菜单栏->Project->Build Options->Debug->Search directories->Linker->Add 动态库的目录(参考前面安装时的选项,设置后为/bin下)
image

3.加头文件

  菜单栏->Project->Build Options->Debug->Search directories->Compiler->Add 安装目录/include
image

(三)编译运行

1. 测试代码

image

2. OpenSSL 使用 base64 编码/解码

#include <openssl/evp.h>
#include <openssl/bio.h>
#include <openssl/buffer.h>
#include <string.h>
#include <iostream>

using namespace std;

char * base64Encode(const char *buffer, int length, bool newLine);
char * base64Decode(char *input, int length, bool newLine);

int main(int argc, char* argv[])
{
	bool newLine = false;
	string input = "Hello World!";

	char * encode = base64Encode(input.c_str(), input.length(), newLine);
	char * decode = base64Decode(encode, strlen(encode), newLine);

	cout << "Base64 Encoded : " << encode << endl;
	cout << "Base64 Decoded : " << decode << endl;

	cin.get();
	return 0;
}

// base64 编码
char * base64Encode(const char *buffer, int length, bool newLine)
{
	BIO *bmem = NULL;
	BIO *b64 = NULL;
	BUF_MEM *bptr;

	b64 = BIO_new(BIO_f_base64());
	if (!newLine) {
		BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
	}
	bmem = BIO_new(BIO_s_mem());
	b64 = BIO_push(b64, bmem);
	BIO_write(b64, buffer, length);
	BIO_flush(b64);
	BIO_get_mem_ptr(b64, &bptr);
	BIO_set_close(b64, BIO_NOCLOSE);

	char *buff = (char *)malloc(bptr->length + 1);
	memcpy(buff, bptr->data, bptr->length);
	buff[bptr->length] = 0;
	BIO_free_all(b64);

	return buff;
}

// base64 解码
char * base64Decode(char *input, int length, bool newLine)
{
	BIO *b64 = NULL;
	BIO *bmem = NULL;
	char *buffer = (char *)malloc(length);
	memset(buffer, 0, length);
	b64 = BIO_new(BIO_f_base64());
	if (!newLine) {
		BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
	}
	bmem = BIO_new_mem_buf(input, length);
	bmem = BIO_push(b64, bmem);
	BIO_read(bmem, buffer, length);
	BIO_free_all(bmem);

	return buffer;
}

输出如下所示:

Base64 Encoded : SGVsbG8gV29ybGQh
Base64 Decoded : Hello World!

image

七、遇到的问题及解决方法

(一)error while loading shared libraries: libcrypto.so.1.1: cannot open shared object file: No such file or directory

image

1. 这个错误通常是因为缺少libcrypto的库文件所导致的。可以通过以下步骤解决这个问题:

  确定系统是否已安装OpenSSL库文件。可以使用以下命令检查:

dpkg -l | grep openssl

  如果没有安装,则需要安装OpenSSL库文件

sudo apt-get install openssl

image

2. 确定是否存在libcrypto.so.1.1文件。可以使用以下命令在系统上搜索:

find / -name "libcrypto.so.1.1" 2>/dev/null

  如果没有找到,则需要重新安装OpenSSL库文件:

sudo apt-get install --reinstall libssl-dev

image

3. 确保库文件路径正确。可以使用以下命令检查库文件路径:

echo $LD_LIBRARY_PATH

  如果路径不正确,则需要将其添加到环境变量中:

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

  在这个例子中,假设libcrypto.so.1.1文件在/usr/local/lib目录下。
image

posted @ 2023-03-18 23:39  油菜园12号  阅读(364)  评论(0编辑  收藏  举报