OpenEuler基础实验

技术OpenEuler基础实验 OpenEuler基础实验OpenEuler基础实验
20191331 lyx
基于 鲲鹏--OpenEuelr 20.03 64bit--ARM (华为云服务器)
实验

OpenEuler基础实验。

OpenEuler基础实验

20191331 lyx

基于 鲲鹏--OpenEuelr 20.03 64bit--ARM (华为云服务器)

实验环境:彭坤-openeuelr 20.03 64位arm。

使用Xshell连接。

PS: xshell是一个非常好用的远程连接工具,它自带的文件管理系统可以非常直观地管理文件。它是符合我们平时Windows系统交互逻辑,可以非常快速地双向传输文件。

基于openEuler的OpenSSL编译安装和编程实践

检查openssl版本。

目前openEuler系统安装的OpenSSL版本是1.1.1d,现在(2021.04)最新的OpenSSL版本是1.1.1l .

openEuler中不需要开发头文件。我们需要下载OpenSSL的源代码,自己编译安装。

1.首先去OpenSSL官网下载最新版OpenSSL源码。

链接:https://www.openssl.org/source/

2.新建两个文件夹,分别放置OpenSSL的源码和安装路径。

[root @ arm ~]# mkdir lyx-opensslsrc lyx-OpenSSL

[root@arm ~]# cd lyx-openssl

[root@arm lyx-openssl]# pwd

/root/lyx-openssl

3.将源码上传并解压至lyx-opensslsrc文件夹:

tar-zxvf openssl-1.1.1l.tar.gz-C/

4.配置编译安装路径(/root/lyx-openssl),和openEuler系统默认的不同。

cd rocopensslsrc/openssl-1.1.1k。/config-prefix=/root/rocopenssl

5.编译(make时间稍长,耐心等待),测试、安装,其中测试步骤可选:

制造

进行测试

制作安装

6.查看安装后的版本,确定是最新安装的1.1.1l版:

cd ~/rocopenssl。/bin/openssl版本

安装成功:

OpenSSL命令的使用

要通过openssl帮助查看帮助文档:

OpenSSL编程

密码算法库非常强大,是OpenSSL的基础。它实现了现代密码学中大多数主流的密码算法和标准,包括公钥(非对称)算法、对称加密算法、信息摘要算法、X509数字证书标准、PKCS12个人信息交换语法标准、PKCS7加密消息语法标准、OCSP在线证书状态查询协议、CRL证书撤销列表等标准。OpenSSL还提供了Engine机制。引擎可以将加密卡、加密机等外部硬件算法模块无缝集成到OpenSSL中。

什么是SSL

为了使网络通信更加安全,需要认证和加密。认证意味着你就是你要找的人,加密意味着拦截中间消息的第三方无法获取消息内容。

为此,有人设计了SSL,这是套接字上的安全层。简单来说,就是TCP之上的安全通信层,SSL上的HTTP就是HTTPs。现在几乎所有的银行网站访问都是基于HTTPS协议。

认证通过证书非对称加密算法解决。

于是便有了OpenSSL

SSL的交互过程还是很复杂的,涉及到非对称加密和对称加密,以及复杂的交互过程。因为这个原因,有人写了openssl库,被广泛使用。本文旨在说明如何安装和基本使用这个库。

有了这个openssl库,您可以直接编写与HTTPS交互的代码。

OpenSSL功能

Openssl可以实现密钥证书管理、对称加密和非对称加密。

de>openssl: 多用途的命令行工具,包openssl,可以执行交互或批量命令。
libcrypto: 加密算法库,包openssl-libs。
libssl:加密模块应用库,实现了ssl及tls,包nss。

  • 作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。

一个简单测试

#include stdio.h
#include openssl/evp.h
int main(){
	
    OpenSSL_add_all_algorithms();
	
    return 0;
}

编译:
gcc -o to test_openssl.c -I /root/lyx-openssl/include -L /root/lyx-openssl/lib -lcrypto -lpthread

执行 ./to;echo $

BASE64算法

编写一个BASE64的测试代码 testbase64.c

#include stdio.h
#include string.h
#include openssl/evp.h
#include openssl/x509.h
//Base64编码
void tEVP_Encode()
{
	EVP_ENCODE_CTX *ctx;
        ctx = EVP_ENCODE_CTX_new();	//EVP编码结构体
	unsigned char in[1024];			//输入数据缓冲区
	int inl;						//输入数据长度
	char out[2048]={0};				//输出数据缓冲区
	int outl;						//输出数据长度
	FILE *infp;						//输入文件句柄
	FILE *outfp;					//输出文件句柄
	infp = fopen("test.dat","rb");//打开待编码的文件
	if(infp == NULL)
	{
		printf("Open File \"Test.dat\"  for Read Err.\n");
		return;
	}
	
	outfp = fopen("test.txt","w");//打开编码后保存的文件
	if(outfp == NULL)
	{
		printf("Open File \"test.txt\" For Write Err.\n");
		return;
	}
	EVP_EncodeInit(ctx);//Base64编码初始化
	printf("文件\"Test.dat\" Base64编码后为:\n");
	//循环读取原文,并调用EVP_EncodeUpdate计算Base64编码
	while(1)
	{
		inl = fread(in,1,1024,infp);
		if(inl = 0)
			break;
		EVP_EncodeUpdate(ctx,out,outl,in,inl);//编码
		fwrite(out,1,outl,outfp);//输出编码结果到文件
		printf("%s",out);
	} 
	EVP_EncodeFinal(ctx,out,outl);//完成编码,输出最后的数据。
	fwrite(out,1,outl,outfp);
	printf("%s",out);
	fclose(infp);
	fclose(outfp);	
	printf("对文件\"Test.dat\" Base64编码完成,保存到\"test.txt\"文件.\n\n\n");
}
//Base64解码
void tEVP_Decode()
{
	EVP_ENCODE_CTX *ctx;
        ctx = EVP_ENCODE_CTX_new();			//EVP编码结构体
	char in[1024];					//输入数据缓冲区
	int inl;						//输入数据长度
	unsigned char out[1024];		//输出数据缓冲区
	int outl;						//输出数据长度
	FILE *infp;						//输入文件句柄
	FILE *outfp;					//输出文件句柄
	
	infp = fopen("test.txt","r");//打开待解码的文件
	if(infp == NULL)
	{
		printf("Open File \"Test.txt\"  for Read Err.\n");
		return;
	}
	outfp = fopen("test-1.dat","wb");//打开解码后保存的文件
	if(outfp == NULL)
	{
		printf("Open File \"test-1.txt\" For Write Err.\n");
		return;
	}
	EVP_DecodeInit(ctx);//Base64解码初始化
	printf("开始对文件\"Test.txt\" Base64解码...\n\n");
	//循环读取原文,并调用EVP_DecodeUpdate进行Base64解码
	while(1)
	{
		inl = fread(in,1,1024,infp);
		if(inl = 0)
			break;
		EVP_DecodeUpdate(ctx,out,outl,in,inl);//Base64解码
		fwrite(out,1,outl,outfp);//输出到文件
	} 
	EVP_DecodeFinal(ctx,out,outl);//完成解码,输出最后的数据。
	fwrite(out,1,outl,outfp);
	fclose(infp);
	fclose(outfp);	
	printf("对文件\"Test.txt\" Base64解码完成,保存为\"test-1.dat\"\n\n\n");
	
}
 
int main()
{
 
	tEVP_Encode();
	tEVP_Decode();
	
	return 0;
}

通过gcc -o testbase64 testbase64.c -I /root/lyx-openssl/include -L /root/lyx-openssl/lib -lcrypto -lpthread -finput-charset=GBK -fexec-charset=UTF-8编译:

出现错误:

原因是缺少中文字体库

安装必要的字体库:
yum groupinstall -y fonts

再次编译,成功:

执行 ./testbase64

test.dat 是一个二进制文件 内容为:20191331 lyx hello BASE64

汇编语言练习

3.2汇编语言练习——查找最大数

  • 1.实验目的

通过本实验了解和熟悉 ARM64 汇编语言。

  • 2.实验要求

    • 使用 ARM64 汇编语言来实现如下功能:在给定的一组数中查找最大数。

    • 程序可使用GCC(Aarch64 版本)工具来编译,并且可在树莓派 Linux 系统或者 QEMU + ARM64 实验平台上运行。

.section .data
.align 3
my_data:
        .quad 1
        .quad 2
        .quad 5
        .quad 8
        .quad 10
        .quad 12
my_data_count:
        .quad 6
.align 3    
print_data:
        .string "big data: %d\n"
.section .text
.globl main
main:
        stp x29, x30, [sp, -16]!
        ldr x0, =my_data
        ldr x1, my_data_count
        add x4, x0, #40
        mov x3, xzr
1:
        ldr x2, [x0], #8
        cmp x2, x3
        csel x3, x2, x3, hi
        cmp x0, x4
        b.ls 1b
        ldr x0, =print_data
        mov x1, x3
        bl printf
        ldp x29, x30, [sp], 16
        ret

编译运行:

编译时犯了个错:忘记汇编代码后缀为 .s

调试:

3.3汇编语言练习——通过 C 语言调用汇编函数

  • 1.实验目的

通过本实验了解和熟悉 C 语言中如何调用汇编函数。

  • 2.实验要求

    • 使用 ARM64 汇编语言来实现如下功能:在给定的一组数中查找最大数。

    • 程序可使用GCC(Aarch64 版本)工具来编译,并且可在树莓派 Linux 系统或者 QEMU + ARM64 实验平台上运行。

*****************compare.S******************
.section .text
.globl compare_data
compare_data:
cmp x0, x1
csel x0, x0, x1, hi
ret
*******************main.c********************
#include stdio.h
extern int compare_data(int a, int b);
int main()
{ 
int val;
val = compare_data(5, 6);
printf("big data: %d\n", val);
}

编译运行:

3.4汇编语言练习——通过汇编语言调用 C 函数

  • 1.实验目的

通过本实验了解和熟悉 C 语言中如何调用汇编函数。

  • 2.实验要求

    • 使用 ARM64 汇编语言来实现如下功能:在给定的一组数中查找最大数。

    • 程序可使用GCC(Aarch64 版本)工具来编译,并且可在树莓派 Linux 系统或者 QEMU + ARM64 实验平台上运行。

*************compare.c************
int compare_data(int a, int b)
{ 
return (a = b)  a : b;
} 
***************main.s**************
.section .data
.align 3
print_data:
.string "big data: %d\n"
.section .text
.globl main
main:
stp x29, x30, [sp, -16]!
mov x0, #6
mov x1, #5
bl compare_data
mov x1, x0
ldr x0, =print_data
bl printf
ldp x29, x30, [sp], 16
ret

编译运行:

3.5汇编语言练习——GCC 内联汇编

#include stdio.h
static int compare_data(int a, int b)
{ 
  int val;
  asm volatile (
   "cmp %1, %2\n"
   "csel %0, %1, %2, hi\n"
   : "+r" (val)
   : "r" (a), "r" (b)
   : "memory");
return val;
} 
int main()
{ 
  int val;
  val = compare_data(5, 6);
  printf("big data: %d\n", val);
  val = compare_data(6, 4);
  printf("big data: %d\n", val);
} 

编译运行:

参考资料

OpenEuler系统安装 https://www.cnblogs.com/rocedu/p/14615565.html
OpenSLL编译安装和编程基础 https://www.cnblogs.com/rocedu/p/14617763.html
OpenSSL的介绍和使用 https://blog.csdn.net/zhaoem82/article/details/102544993

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/61487.html

(0)

相关推荐

  • k均值算法的基本原理(k均值的算法流程)

    技术K 均值算法是如何让数据自动分组本篇文章给大家分享的是有关K 均值算法是如何让数据自动分组,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。下面要介绍的K

    攻略 2021年12月23日
  • 【2021-11-29】连岳摘抄

    技术【2021-11-29】连岳摘抄 【2021-11-29】连岳摘抄23:59如果你热爱工作,你每天就会尽自己所能力求完美,而不久,你周围的每一个人也会从你这里感染到这种热情。——山姆·沃尔顿人不想学

    礼包 2021年12月1日
  • 真心话劲爆污,你还剩几个能说心里话的朋友

    技术真心话劲爆污,你还剩几个能说心里话的朋友应该没有了真心话劲爆污,随着年龄的增加,越来越不想跟别人说什么,说了也会莫名其妙的惹些烦恼!心里话,只能自己消耗,并不能跟别人说,说多了自寻烦恼而已。而且一般心里话都是一些烦恼

    2021年10月20日
  • php如何封装app

    技术php如何封装app小编给大家分享一下php如何封装app,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! ph

    攻略 2021年11月30日
  • 三国时期是公元多少年,三国时期到底有多少人口

    技术三国时期是公元多少年,三国时期到底有多少人口有人说三国人口只有500万三国时期是公元多少年,也有人说是1000万,甚至不少人说2000万~3000万之间。那么到底三国时代有多少人口?东汉末年和三国时期的户门数字并无正

    生活 2021年10月29日
  • 硫酸铜的化学式,氯化钠、碳酸钠、硫酸铜的比较

    技术硫酸铜的化学式,氯化钠、碳酸钠、硫酸铜的比较离子检验 :NaCl用AgNO3,生成白色沉淀AlClNa2CO3用酸检验硫酸铜的化学式,生成气泡且与石灰水生成CaCO3白色沉淀CuSO4用可溶性碱检验,如Ca(OH)2

    生活 2021年10月22日