PBC密码库安装及使用教程

文章目录

  • 1.PBC库介绍
  • 2.PBC库安装
  • 3.PBC库使用
  • 4.相关API
    • 4.1 配对的初始化和释放
    • 4.2 元素的初始化和释放
    • 4.3 元素的赋值
    • 4.4 哈希
    • 4.5 元素的常用运算
    • 4.6 元素的幂运算
    • 4.7 元素的比较
    • 4.8 从群中随机选取一个元素(常用)
    • 4.9 配对的运算
    • 4.10 小结
  • 5.Some examples
  • 6.PBC Wrapper/C++
    • 6.1 PBC C++ Wrapper的安装
    • 6.2 在代码中使用PBC C++ Wrapper
    • 6.3 常用的API
      • 6.3.1 配对的定义和初始化
      • 6.3.2 元素的定义和初始化
      • 6.3.3 元素的加减乘除和指数运算
      • 6.3.4 配对运算
      • 6.3.5 元素的比较
  • 7.基于PBC库的LSSS算法实现
  • 8.参考文献:

1.PBC库介绍

    PBC(Pairing-Based Cryptography Libarary)是实现双线性对运算的函数库,由Stanford大学Ben Lynn博士用C开发并开源的密码库。 PBC密码库为双线性对实现提供了接口,是基于双线性对密码体制研究的一个非常有用的辅助工具。
    库的地址:http://crypto.stanford.edu/pbc/

2.PBC库安装

    首先,在官网下载安装包,可以看到有多个不同的包,这里下载pbc-0.5.14.tar.gz,因为安装环境是在Linux平台。
在这里插入图片描述

linux下执行步骤如下:

wget https://crypto.stanford.edu/pbc/files/pbc-0.5.14.tar.gz
tar -zxvf pbc-0.5.14.tar.gz
./configure --prefix=$HOME/.local  
make  
make install

    其中--prefix指定了PBC库要安装的目录,您也可以指定到自己喜欢的地方。如果一切正常,您应该会在$HOME/.local中看到新文件,包括includelibbin三个文件夹

3.PBC库使用

  1. 在需要用到PBC库的源代码包含头文件pbc/pbc.h即可。即#include <pbc/pbc.h>。可以看出pbc.h主要汇总了其他要包含的头文件:
#ifndef __PBC_H__
#define __PBC_H__

#include <stdarg.h>
#include <stdio.h>
#include <stdint.h> // for intptr_t
#include <stdlib.h>
#include <gmp.h>

#if defined (__cplusplus)
extern "C" {
#endif

#include "pbc_utils.h"
#include "pbc_field.h"
#include "pbc_param.h"
#include "pbc_pairing.h"
#include "pbc_curve.h"
#include "pbc_mnt.h"
#include "pbc_a1_param.h"
#include "pbc_a_param.h"
#include "pbc_d_param.h"
#include "pbc_e_param.h"
#include "pbc_f_param.h"
#include "pbc_g_param.h"
#include "pbc_i_param.h"
#include "pbc_random.h"
#include "pbc_memory.h"

#if defined (__cplusplus)
}  // extern "C"
#endif

#endif //__PBC_H__

  1. 编译的时候需要链接GMP库和PBC库。即在gcc或者g++命令上加入-lgmp -lpbc; 如果使用Cmake构建代码,在CMakeLists.txt上加入link_libraries(gmp)以及link_libraries(pbc)

test.cpp

#include "pbc.h"

int main(void)
{
   
    /* call PBC functions */
    return 0;
}

编译示例如下:

g++ -o test test.cpp -lgmp -lpbc -L/usr/local/lib/pbc

4.相关API

4.1 配对的初始化和释放

    在pbc中,配对的类型为pairing_t,初始化前需要声明变量,如pairing_t pairing

    一般配对的初始化有三个函数:

int pairing_init_set_str(pairing_t pairing,const char * s)
int pairing_init_set_buf(pairing_t pairing,const char * s,size_t len)
void pairing_init_pbc_param(struct pairing_s *pairing, pbc_param_t p)

    其中第一第二个函数直接从字符串读取,第三个使用pbc_param_t对象初始化。一般来说第一第二个比较常用。其中pairing为需要初始化的配对变量,s为字符串的参数,len为字符串的长度。
    初始化的参数一般也不需要自己手写,在PBC库上已经集成了几个比较常用的配对参数。我们可以在PBC源码的param目录上找到。论文一般都是用Type A配对。我们可以复制param/a.param文件的内容在代码上进行初始化即可:
在这里插入图片描述

#define TYPEA_PARAMS \
"type a\n" \
"q 87807107996633125224377819847540498158068831994142082" \
"1102865339926647563088022295707862517942266222142315585" \
"8769582317459277713367317481324925129998224791\n" \
"h 12016012264891146079388821366740534204802954401251311" \
"822919615131047207289359704531102844802183906537786776\n" \
"r 730750818665451621361119245571504901405976559617\n" \
"exp2 159\n" \
"exp1 107\n" \
"sign1 1\n" \
"sign0 1\n"

pairing_t pairing;
pairing_init_set_buf(pairing, TYPEA_PARAMS, strlen(TYPEA_PARAMS));

也可以使用fopen()读取文件内容初始化:

pairing_t pairing;
char param[1024];
FILE* file = fopen("a.param", "r");
size_t count = fread(param, 1, 1024, file);
fclose(file);
if (!count) pbc_die("input error");
pairing_init_set_buf(pairing, param, count);

当不用这个配对的时候,需要调用void pairing_clear(pairing_t pairing)释放这个变量。

4.2 元素的初始化和释放

    双线性映射 e : G 1 × G 2 → G T e: G_1 \times G_2 \rightarrow G_T e:G1×G2GT ,其涉及三个素数阶的循环群, P B C \mathrm{PBC} PBC 中称它们为 G 1 、 G 2 G_1 、 G_2 G1G2 以及 G T G_T GT 。它接收两个元素作为输入,一个来自 G 1 G_1 G1 ,一个来自 G 2 G_2 G2 。输出的元素来自 G T G_T GT 。如果配对是对称的,则 G 1 = G 2 G_1 = G_2 G1=G2
    在pbc中,元素变量为element_t类型,初始化前需要声明:element_t e: 执行配对运算前需要对元素进行初始化。初始化函数有以下几个:

void element_init_G1(element_t e, pairing_t pairing)
void element_init_G2(element_t e, pairing_t pairing)
void element_init_GT(element_t e, pairing_t pairing)

    上面三个函数分别是对将变量 e \mathrm{e} e 初始化为 G 1 、 G 2 G_1 、 G_2 G1G2 G T G_T GT 的元素。

void element_init_Zr(element_t e, pairing_t pairing)

    这个函数用于将变量 e \mathrm{e} e 初始化为环 Z r Z_r Zr 的元素,一般用于指数部分。

void element_init_same_as(element_t e, element_t e2)

    这个函数将变量e初始化为和变量e2所处的代数结构的元素。即如果e2 G 2 G_2 G2 ,那么e也被初始化为 G 2 G_2 G2 的元素。

    元素变量用完一定要记得使用void element_clear(element_t e)释放,否则会导致内存泄漏!

4.3 元素的赋值

  • 对于元素e,如果想e=0,则调用element_set0(e)
  • 如果想e=1,则调用element_set1(e)
  • e=i,其中i为一个非负的长整型数(unsigned long int),则调用element_set_si(e, i)

4.4 哈希

    如果我们需要将某个变量(一般都是字符串)Hash成群上的一个点,则调用void element_from_hash(element_t e, void *data, int len)函数转换即可,其中e为需要赋值的元素,data为变量地址,len为变量的长度。需要注意的是,传进来的数据需要强制转换成(void *)。如:

element_from_hash(h, (void*)"ABCDEF", 6);

4.5 元素的常用运算

  • 加法 n = a + b : \boldsymbol{n}=a+b: n=a+b: void element_add(element_t $n$, element_t a, element_t b)
  • 减法 n = a − b : n=a-b: n=ab: void element_sub(element_t n, element_t a, element_t b)
  • 乘法 n = a × b \boldsymbol{n}=a \times b n=a×b : void element_mul(element_t n, element_t a, element_t b)
  • 连加 n = a + ⋯ + a ⏟ z 介 n=\underbrace{a+\cdots+a}_{\mathrm{z} 介} n=z a++a : void element_mul_si(element_t n, element_t a, signed long int z)
  • 连加 n = a + ⋯ + a ⏟ z ↑ n=\underbrace{a+\cdots+a}_{\mathrm{z} \uparrow} n=z a++a : void element_mul_zn(element_t c, element_t a, element_t z),注意这里的元素z 必须为整数mod环,即 z ∈ Z n z \in Z_n zZn
  • 除法 n = a / b n=a / b n=a/b : void element_div(element_t n, element_t a, element_t b)
  • 倒数 n = 1 a : n=\frac{1}{a}: n=a1: void element_invert(element_t n, element_t a)

4.6 元素的幂运算

    在官方文档有详细的介绍。我一般使用比较多的是void element_pow_zn(element_t x, element_t a, element_t n),即计算 x = a n x=a^n x=an,其中n必须要初始化为环 Z n Z_n Zn,即element_init_Zr(n, pairing)

4.7 元素的比较

    常用的为函数int element_cmp(element_t a, element_t b),如果a=b ,则函数输出0,否则输出1。

4.8 从群中随机选取一个元素(常用)

    对应的函数为void element_random(element_t e)

4.9 配对的运算

    如果要执行配对运算 r = e ( x , y ) r=e(x, y) r=e(x,y) ,则调用函数 pairing_apply(r, x, y, pairing)。其中 x \mathrm{x} x 必须为群 G 1 G_1 G1 的元素, y \mathrm{y} y 必须为群 G 2 G_2 G2 的元素, r r r 必须为群 G T G_T GT 的元素。
    如果出现多次相同 G 1 G_1 G1 元素的配对运算,可以通过预处理的手段解决,即声明一个pairing_pp_t 类型的变量,使用固定的 G 1 G_1 G1 元素初始化。如官方文档中的代码:

pairing_pp_t pp;
pairing_pp_init(pp, x, pairing); // x is some element of G1
pairing_pp_apply(r1, y1, pp); // r1 = e(x, y1)
pairing_pp_apply(r2, y2, pp); // r2 = e(x, y2)
pairing_pp_clear(pp); // not need pp anymore

    另外,计算 o u t = e ( i n 1 , i n 2 ) out=e(in1, in2) out=e(in1,in2),更常用的配对函数如下:

// 配对函数2
element_pairing(element_t out, element_t in1, element_t in2)  //Computes a pairing: 'out' = 'e'('in1', 'in2'),

4.10 小结

  • PBC库的元素变量的周期一般是“声明–>初始化–>赋值–>释放”。

  • element_t变量在函数中一般不直接作为返回值return回去,而是在参数中返回即可。

  • PBC库的调用过程比较繁琐,如果追求代码的简洁和可读性,可以参考使用PBC C++ Wrapper。

5.Some examples

6.PBC Wrapper/C++

    可以看出,C语言源码的PBC lib的使用还是相当繁琐的,而且需要手动初始化和释放内存,代码设计不谨慎容易造成内存泄露。而C++封装的PBC Library在代码的可读性上有了不少的提升,而且不用手动调用API释放内存,使用PBC C++ Wrapper能避免不少的弯路。

6.1 PBC C++ Wrapper的安装

  1. 安装C++ Wrapper之前需要安装好上述C语言版的PBC Library。
  2. 使用git下载源码:git clone git://git-crysp.uwaterloo.ca/pbcwrapper
  3. 进入目录pbcwrapper,在终端输入make编译C++ Wrapper
  4. 编译后输入./Testing执行测试程序看看C++ Wrapper是否正常工作。

6.2 在代码中使用PBC C++ Wrapper

    在PBC C++ Wrapper的安装中我们已经使用make将代码编译成了一个静态库libPBC.a,为了能让我们的代码调用这个C++ Wrapper,我们将目录pbcwrapper复制到我们代码所在目录上。
    如果我们的项目使用cmake构建,在CMakeLists.txt文件上加入以下内容(需要根据自己的情况更改):

cmake_minimum_required(VERSION 3.15)
project(pbc_test)  # 项目名,根据自己情况更改

# gmp和pbc是必须要链接上去的
link_libraries(gmp)
link_libraries(pbc)

# 引入pbcwrapper的头文件和静态库
include_directories(${PROJECT_SOURCE_DIR}/pbcwrapper)
link_directories(${PROJECT_SOURCE_DIR}/pbcwrapper)

set(CMAKE_CXX_STANDARD 14)

add_executable(pbc_test main.cpp)

# 静态链接,注意pbc_test是前面add_executable指定的,需要根据自己情况修改。
target_link_libraries(pbc_test PBC)

    这样就可以在自己的代码上使用PBC C++ Wrapper了,我们可以用C++重新实现PBC Library官方文档上的示例程序(即BLS签名算法)。

#include "PBC.h" //包含pbcwrapper的头文件PBC.h

int main() {
    //初始化配对变量e
    char param[1024];
    FILE* file = fopen("a.param", "r");
    size_t count = fread(param, 1, 1024, file);
    fclose(file);
    if (!count) pbc_die("input error");
    Pairing e(param, count);

    G2 g(e);
    Zr secret_key(e);

    G2 public_key = g ^ secret_key; //指数运算
    G1 h(e, (void*)"ABCDEF", 6);
    G1 sig = h ^ secret_key;

    GT temp1 = e(sig, g); //配对运算
    GT temp2 = e(h, public_key);
    if (temp1 == temp2) {
        printf("signature verifies\n");
    } else {
        printf("signature does not verify\n");
    }
}

    我们可以使用cmake构建代码看看代码能不能正确执行。如果不想要cmake,可以使用g++命令编译代码:g++ main.cpp -o main -lgmp -lpbc -lPBC -I ./pbcwrapper -L ./pbcwrapper

    从上面的代码可以看到,PBC C++ Wrapper有以下几个优点:
   1. 不用调用element_init_G1(h, e)等代码来初始化元素,以及使用element_random(e)随机选取元素赋值给e,直接使用G1 h(e)直接完成了元素的定义、初始化、随机选取操作。
    2.使用运算符重载等类的机制,使得元素的运算变得直观,比如G2 public_key = g ^ secret_key,在原来的C版本的PBC库需要写成以下的形式:

 element_t public_key;
 element_init_G2(public_key, e);
 element_pow_zn(public_key, g, secret_key);

可见,一行C++代码顶替了三行的C版本代码,使得代码的易读性变强了不少。

    3.不用手动调用element_clear()释放变量的内存空间。由于所有的元素都是用使用类封装,一旦对象不再使用,析构函数会负责将元素的内存空间给释放掉,不用头疼内存管理的问题。

6.3 常用的API

    因为PBC C++ Wrapper对PBC Library中许多API都进行封装,所以调用起来特别简单。

6.3.1 配对的定义和初始化

调用Pairing类的构造器构造即可。
分析源码我们可以看到构造函数有以下几个:

Pairing(const char * buf, size_t len);
Pairing(const char * buf);
Pairing(const string &buf);
Pairing(const FILE * buf);

可以看到,配对的初始化不仅支持使用C语言的字符串,也支持C++的字符串std::string,以及FILE指针变量。

6.3.2 元素的定义和初始化

元素初始化前需要完成配对的初始化
我们以G1元素为例介绍元素的初始化:
G1元素的定义和初始化也是使用G1类的构造函数即可:

G1(const Pairing &e);
G1(const Pairing &e, bool identity);
G1(const Pairing &e, const unsigned char *data, unsigned short len, bool compressed = false, unsigned short base = 0);
G1(const Pairing &e, const void *data, unsigned short len);
G1(const G1 &h, bool identity=false):G(h,identity){}

    在C++ Wrapper中,构造器一步就完成了元素的定义初始化等操作,比PBC Library的调用要简洁的多。在第二个构造函数中,参数identity如果设置为true,则该元素设置为1,即调用了PBC Libraryelement_set1();如果设置为false,则该元素为随机选取,即相当于调用了element_random()
    第三个构造器则类同于C语言版本的element_from_hash()函数。

6.3.3 元素的加减乘除和指数运算

    由于使用运算符重载包装了C语言的API,所以我们可以在代码中直接使用运算符+、-、*、/^

6.3.4 配对运算

    同样很直观,如果我们将配对对象(即类Pairing的对象)的变量名声明为e,则使用诸如e(g, h)的形式即可进行配对运算,相比C语言版本的pairing_apply()函数要直观得多。

6.3.5 元素的比较

    元素的比较直接使用运算符==操作即可。

7.基于PBC库的LSSS算法实现

参考另一篇博客:

8.参考文献:

  1. https://blog.csdn.net/Drawlonely/article/details/124164242
  2. https://jeza-chen.com/2020/06/04/PBC-Library/#%E5%AE%89%E8%A3%85
  3. https://jeza-chen.com/2020/06/05/PBC-Cpp-Wrapper/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/718676.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity 使用TextMeshPro实现图文混排

最后实现出的效果是这样的 开始实现 准备两张图 选中图片右键->Create->TextMeshPro->Sprite Asset 然后文件夹内就会出现一个同名的这个文件 新建一个Text Inspector面板 点击最底下的Extra Settings 然后把刚刚创建的SpriteAsset拖过来 放到对应的地方 然后…

牛客周赛 E-茜茜的计算器

原题链接&#xff1a;E-茜茜的计算器​​​​​​ 题目大意&#xff1a;在计算器上显示的0~9十个数字&#xff0c;如果这个计算器有n个位置&#xff0c;可以显示n个数字&#xff0c;问能显示多少种不同的对称数字。只能横轴和竖轴对称。 思路&#xff1a;容斥&#xff0c;最终…

Docker(二)-Centos7安装Docker并配置镜像加速

系统用户为非root用户 1.安装条件 确定Centos版本是否是7及以上sudo vim /etc/redhat-release2.官网地址 https://docs.docker.com/engine/install/centos3.卸载已安装的旧版本 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-lates…

数字孪生定义及应用介绍

数字孪生定义及应用介绍 1 数字孪生&#xff08;Digital Twin, DT&#xff09;概述1.1 定义1.2 功能1.3 使用场景1.4 数字孪生三步走1.4.1 数字模型1.4.2 数字影子1.4.3 数字孪生 数字孪生地球平台Earth-2 参考 1 数字孪生&#xff08;Digital Twin, DT&#xff09;概述 数字孪…

项目(一)--高并发内存池项目简介

什么是高并发内存池 它是一个全球性大厂google(谷歌)的 开源项目,项目名字叫tcmalloc,全称是Thread-Caching Malloc,即线程缓存的malloc 作用&#xff1a; 我们知道C语言在堆上开辟空间和 释放使用的是malloc和free函数 并且C的动态内存管理new和delete 的底层实际上也调用了…

白酒行业数字化营销转型方向

白酒行业正站在数字化营销的新风口&#xff0c;随着科技的迅猛发展和消费者行为模式的变革&#xff0c;这一传统行业正迎来前所未有的发展机遇。数字化营销不仅为白酒企业打开了新的市场大门&#xff0c;更在重塑消费者与品牌之间的关系&#xff0c;推动行业向更智能、更个性化…

day02论文学习:能够使大语言模型产生带有引用的文章

1.主题&#xff1a;Enabling Large Language Models to Generate Text with Citations&#xff08;能够使大语言模型产生带有引用的文章&#xff09; 引用出处&#xff1a; Gao, T., Yen, H., Yu, J., & Chen, D. (2023). Enabling Large Language Models to Generate Tex…

05通讯录管理系统——添加联系人

功能描述&#xff1a;实现添加联系人功能&#xff0c;联系人上限为1000人&#xff0c;联系人信息包括姓名、性别、年龄、联系电话、家庭住址。 添加联系人实现步骤&#xff1a; 1.设计联系人结构体 2.设计通讯录结构体 3.main函数中创建通讯录 4.封装添加联系人函数 5.测…

2024-06-17 问AI: 在深度学习中,harmonic mean是什么?

文心一言 在深度学习中&#xff0c;**harmonic mean&#xff08;调和平均数&#xff09;**是一个用于评估模型性能的指标&#xff0c;特别是在处理不平衡的数据集或需要综合多个评估指标的场景中。以下是关于harmonic mean在深度学习中应用的详细解释&#xff1a; 定义&#…

多态深度剖析

前言 继承是多态的基础&#xff0c; 如果对于继承的知识还不够了解&#xff0c; 可以去阅读上一篇文章 继承深度剖析 基本概念与定义 概念&#xff1a; 通俗来说&#xff0c;就是多种形态。具体点就是去完成某个行为&#xff0c; 当不同的对象去完成时会产生出不同的状…

湿法消解石墨消解仪 应用化学分析领域石墨炉

石墨消解仪在化学实验中具有重要的作用。它是一种高级实验设备&#xff0c;广泛应用于化学分析领域&#xff0c;特别是在样品的前处理和测试前的样品制备过程中。 石墨消解仪采用高温高压技术&#xff0c;能够将固体样品中的有机和无机物质转化为可溶性的气体或液体形式。这种…

Aeron:两个代理之间的单向IPC(One-way IPC between two agents)

一、概述 本例展示了如何通过 IPC 在调度于不同线程的两个代理之间传输缓冲区。在继续学习本示例之前&#xff0c;最好先复习一下Simplest Full Example &#xff0c;因为该示例展示的是 IPC 通信&#xff0c;没有增加代理的复杂性。读者还应熟悉Media Driver 流程构建如下&…

结合Boosting理论与深度ResNet:ICML2018论文代码详解与实现

代码见&#xff1a;JordanAsh/boostresnet: A PyTorch implementation of BoostResNet 原始论文&#xff1a;Huang F, Ash J, Langford J, et al. Learning deep resnet blocks sequentially using boosting theory[C]//International Conference on Machine Learning. PMLR, 2…

英特尔 “AI” 科通:英特尔AI大模型应用前瞻

亲爱的科技探险家、前沿探索者、对未来深具好奇心的您&#xff0c; 身处人工智能引领的时代&#xff0c;我们目睹着行业的革命性变革。技术的创新不仅改变着我们的日常&#xff0c;更重新定义着我们对未来的期许。今天&#xff0c;怀着无限激情和期待&#xff0c;我们邀请您参…

国际数字影像产业园:建设与推动企业孵化与梯次培育

国际数字影像产业园在建设与推动企业孵化及梯次培育方面取得了显著成效。未来&#xff0c;随着技术的不断进步和市场的不断扩大&#xff0c;园区将继续发挥其在数字经济产业中的引领作用&#xff0c;为文化产业的发展贡献更多力量。 一、企业孵化与入驻 企业入驻情况&#xff…

物联边缘网关如何助力工厂实现智能化生产?以某智能制造工厂为例-天拓四方

随着工业4.0的深入推进&#xff0c;智能制造工厂成为了工业发展的重要方向。在这个背景下&#xff0c;物联边缘网关以其独特的优势在智能制造工厂中发挥着越来越重要的作用。以下将通过一个具体的智能制造工厂应用案例&#xff0c;来阐述物联边缘网关如何助力工厂实现智能化生产…

Milvus跨集群数据迁移

将 Milvus 数据从 A 集群&#xff08;K8S集群&#xff09;迁到 B 集群&#xff08;K8S集群&#xff09;&#xff0c;解决方案很多&#xff0c;这里提供一个使用官方 milvus-backup 工具进行数据迁移的方案。 注意&#xff1a;此方案为非实时同步方案&#xff0c;但借助 MinIO 客…

在3D视觉技术的帮助下,轻松实现纸箱拆码垛

在繁忙的物流仓库中&#xff0c;纸箱的拆码垛工作常常让人头疼不已。但是&#xff0c;现在有了富唯智能的3D视觉引导纸箱拆码垛解决方案&#xff0c;这一切都变得轻松简单&#xff01; 想象一下&#xff0c;那些堆积如山的纸箱&#xff0c;在3D视觉技术的帮助下&#xff0c;仿…

黄仁勋:下一波AI的浪潮是物理AI

B站&#xff1a;啥都会一点的研究生公众号&#xff1a;啥都会一点的研究生 最近AI圈又发生了啥&#xff1f; 快手视频生成大模型“可灵”开放邀测&#xff0c;效果对标 Sora 在OpenAl文生视频大模型Sora发布后&#xff0c;国内企业争相入局&#xff0c;快手视频生成大模型可…

Confluence安装

Confluence安装 1.安装 #下载confluence版本&#xff08;8.5.11&#xff09; https://www.atlassian.com/software/confluence/download-archives #修改权限 chmod x atlassian-confluence-8.5.11-x64.bin #执行安装 ./atlassian-confluence-8.5.11-x64.bin按照以下提示输入&…