GunPG使用教程(含密钥生成删除以及文件加密解密签名)

2023-11-01

GunPG是一个开源免费的加密解密的GPG软件,使用命令行,在Windows、Linux、macOS、Android等平台上都有。
如果Mac平台需要可视化的操作方式,那么可以使用GPGTools,是一款收费的商业软件,官网地址是:https://gpgtools.org

继续介绍GunPG,这里先列一下GunPG官网:https://www.gnupg.org,包含各种版本的GunPG以及使用手册。

下载GunPG

使用之前当然是获得GunPG,将其安装在自己的电脑上,方法有两种:官网下载以及命令行下载。
官网下载方法如下:
点击https://www.gnupg.org/download/index.html,进入官网下载界面。有源码、二进制文件以及安装包下载。
一般用户找到下图GnuPG binary releases部分:
在这里插入图片描述
Mac用户选择第二个“GunPG for OS X”下载安装即可。其他用户自行按照描述下载所需的版本即可。

Shell命令行下载方法如下:
Mac:brew install gpg
Linux:sudo apt install gnupg

初见GunPG

安装好之可以使用gpg --version来查看当前版本、简介、安装位置以及支持的加密算法等信息,如下:

gpg (GnuPG) 2.2.27
libgcrypt 1.8.7
Copyright (C) 2021 Free Software Foundation, Inc.
License GNU GPL-3.0-or-later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: /Users/username/.gnupg
Supported algorithms:
Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
        CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2

如果我们想知道更多但是简洁的信息,就可以使用gpg --help命令。显示如下:

gpg (GnuPG) 2.2.27
libgcrypt 1.8.7
Copyright (C) 2021 Free Software Foundation, Inc.
License GNU GPL-3.0-or-later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: /Users/username/.gnupg
Supported algorithms:
Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
        CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2

Syntax: gpg [options] [files]
Sign, check, encrypt or decrypt
Default operation depends on the input data

Commands:
 
 -s, --sign                  make a signature
     --clear-sign            make a clear text signature
 -b, --detach-sign           make a detached signature
 -e, --encrypt               encrypt data
 -c, --symmetric             encryption only with symmetric cipher
 -d, --decrypt               decrypt data (default)
     --verify                verify a signature
 -k, --list-keys             list keys
     --list-signatures       list keys and signatures
     --check-signatures      list and check key signatures
     --fingerprint           list keys and fingerprints
 -K, --list-secret-keys      list secret keys
     --generate-key          generate a new key pair
     --quick-generate-key    quickly generate a new key pair
     --quick-add-uid         quickly add a new user-id
     --quick-revoke-uid      quickly revoke a user-id
     --quick-set-expire      quickly set a new expiration date
     --full-generate-key     full featured key pair generation
     --generate-revocation   generate a revocation certificate
     --delete-keys           remove keys from the public keyring
     --delete-secret-keys    remove keys from the secret keyring
     --quick-sign-key        quickly sign a key
     --quick-lsign-key       quickly sign a key locally
     --quick-revoke-sig      quickly revoke a key signature
     --sign-key              sign a key
     --lsign-key             sign a key locally
     --edit-key              sign or edit a key
     --change-passphrase     change a passphrase
     --export                export keys
     --send-keys             export keys to a keyserver
     --receive-keys          import keys from a keyserver
     --search-keys           search for keys on a keyserver
     --refresh-keys          update all keys from a keyserver
     --import                import/merge keys
     --card-status           print the card status
     --edit-card             change data on a card
     --change-pin            change a card's PIN
     --update-trustdb        update the trust database
     --print-md              print message digests
     --server                run in server mode
     --tofu-policy VALUE     set the TOFU policy for a key

Options:
 
 -a, --armor                 create ascii armored output
 -r, --recipient USER-ID     encrypt for USER-ID
 -u, --local-user USER-ID    use USER-ID to sign or decrypt
 -z N                        set compress level to N (0 disables)
     --textmode              use canonical text mode
 -o, --output FILE           write output to FILE
 -v, --verbose               verbose
 -n, --dry-run               do not make any changes
 -i, --interactive           prompt before overwriting
     --openpgp               use strict OpenPGP behavior

(See the man page for a complete listing of all commands and options)

Examples:

 -se -r Bob [file]          sign and encrypt for user Bob
 --clear-sign [file]        make a clear text signature
 --detach-sign [file]       make a detached signature
 --list-keys [names]        show keys
 --fingerprint [names]      show fingerprints

Please report bugs to <https://bugs.gnupg.org>.

可以看到上半部分和version显示的一样,后面跟了一些常用的命令、选项的介绍以及例子。

如果想查询gpg相关的完整信息,使用man gpg查询。GunPG官网也提供了在线的man page:https://www.gnupg.org/documentation/manpage.html,不过与Shell中的man page略有不同。

生成密钥

生成密钥分完整模式和简洁模式。
完整模式的选项是--full-generate-key
简洁模式的选项是--generate-key或者简写--gen-key

我们先来看完整模式:
输入:gpg --full-generate-key,可以看到返回了(这里以Mac为例):

gpg (GnuPG) 2.2.27; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
  (14) Existing key from card
Your selection? 

前三段在是版本号等相关信息。
然后这里显示使用哪种密钥类型,一般选择默认,也就是输入1就可以了。按回车返回如下:

RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072)

这里显示RSA密钥可以在1024到4096位长度之间。我们想要多长的,一般使用2048或者后面括号里提示的就可以,安全性最高的就是4096了。这里我们输入括号里的3072,按回车返回:

Requested keysize is 3072 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 

第一行显示我们选择3072位长度。
然后让我们设置密钥的有效期,0表示永不过期,n表示几天,<n>w表示几周之后过期,例如2w就是2周之后过期,<n>m表示几个月之后过期,<n>y表示几年之后过期。
这里我们设置1年,输入1y,可以看到返回了:

Key expires at 四  4/14 21:28:27 2022 CST
Is this correct? (y/N) 

第一行显示了密钥过期日期“太平洋时间星期四 2022年4月14日21:28:27”,然后问我们确定吗,我们输入y确定。可以看到返回:

GnuPG needs to construct a user ID to identify your key.

Real name:

GunPG需要创建用户ID来定义密钥,这里需要我们输入真实姓名,输入完按回车出现:

Email address: 

这里需要输入自己的邮箱地址。输入完按回车:

Comment: 

这里是让我们备注该密钥,因为可能我们有很多密钥,为了不搞混,我们最好备注一下。我们输入First,假设是第一个。输入完按回车:

You selected this USER-ID:
    "Real_Name (First) <Real_Name@xx.com>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? 

这里第一段显示我们刚才输入的Real nameCommentEmail address组成的USER-ID,并且询问我们是否要更改其中哪个部分、确定无误或者退出生成密钥。这里输入o表示确认无误,继续。
这时候因为我们使用的是Mac,会跳出一个名为“Pinentry Mac”的软件,显示“Please enter the passphrase to protect your new key”,让我们设置一个密码,来保护这个密钥,设置完点击“OK”,可以看到Shell在滚动,并显示一堆信息,我们只需要看最后四行:

pub   rsa3072 2021-04-14 [SC] [expires: 2022-04-14]
      7DA8BCF2BB7BBD6013A4DC0A1C9DAB8F4EE8A951
uid              Real_Name (First) <Real_Name@xx.com>
sub   rsa3072 2021-04-14 [E] [expires: 2022-04-14]

生成密钥的时候其实是生成了两对密钥——“primary key”(又被称为“master key(主人密钥)”)和“subkey”。
可以看到,第一行pub表示主要公钥(public primary key),往右依次是:密钥类型RSA,密钥长度(有的地方叫密钥大小)为3072位,创建日期,过期类型。
第二行是密钥的指纹,是一组哈希值。可以替代User ID(用户ID),也就是下一行uid
第三行就是用户ID了。
第四行sub表示的是子公钥(public subkey),右边内容和pub几乎一样。
这里其实还生成了私钥,我们下一节和pub和sub的区别一起说。

简洁模式只是比完整模式少了设置密钥类型、密钥长度和过期日期的步骤,这里不再做赘述。

查看钥匙圈(密钥列表)

生成密钥的时候不仅生成公钥,还生成了私钥,但是我们现在只看到了公钥。要查看私钥,输入gpg --list-secret-key,可以看到返回了:

/Users/username/.gnupg/pubring.kbx
--------------------------------------
sec   rsa3072 2021-04-14 [SC] [expires: 2022-04-14]
      7DA8BCF2BB7BBD6013A4DC0A1C9DAB8F4EE8A951
uid           [ultimate] Real_Name (First) <Real_Name@xx.com>
ssb   rsa3072 2021-04-14 [E] [expires: 2022-04-14]

第一行是密钥存储的位置目录。
这里的结构和公钥差不多,这里只说一下sec,ssd的含义和区别,还有和公钥的联系。
sec表示主要私钥(secret primary key),与pub是一对密钥,ssb表示子私钥(secret subkey),与sub是一对密钥。
“primary key(主要密钥)”(又被称为“master key(主人密钥)”)和“subkey(子密钥)”区别在于:
主要密钥包含了一个或者更多的用户ID(名字和邮箱),而子密钥是主要密钥中一个用户ID注册的密钥。

想要查看存储的所有公钥,输入gpg --list-key,可以看到返回了:

gpg: checking the trustdb
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: next trustdb check due at 2022-04-14
/Users/username/.gnupg/pubring.kbx
--------------------------------------
pub   rsa3072 2021-04-14 [SC] [expires: 2022-04-14]
      7DA8BCF2BB7BBD6013A4DC0A1C9DAB8F4EE8A951
uid           [ultimate] Real_Name (First) <Real_Name@xx.com>
sub   rsa3072 2021-04-14 [E] [expires: 2022-04-14]

可以看到公钥存储目录为:/Users/username/.gnupg/pubring.kbx,下面就是我们之前生成的备注为First的密钥。

删除密钥

删除密钥有三个选项:--delete-keys--delete-secret-keys--delete-secret-and-public-key
--delete-keys表示从公钥钥匙圈上删除密钥,也就是一同删除公钥和对应的私钥。在分批模式(batch mode)下,密钥必须使用指纹表示,或者使用--yes选项。
--delete-secret-keys表示从私钥钥匙圈上删除密钥。
--delete-secret-and-public-key--delete-keys一样,但是如果私钥存在的话,会先移除私钥。在分批模式下,密钥必须使用指纹表示。

输出密钥

当我们需要和别人使用一套密钥的时候,我们就需要分享密钥,那么就要将OpenPGP二进制格式存储的公钥输出成ASCII码(也就是字母符号)。

输出公钥的话如下:

gpg --armor --output First_public_key.txt --export 7DA8BCF2BB7BBD6013A4DC0A1C9DAB8F4EE8A951

--armor选项是将OpenPGP二进制格式存储的文件按ASCII格式输出。--output First_public_key.txt表示将内容输出为名称为First_public_key.txt的文件。--export 7DA8BCF2BB7BBD6013A4DC0A1C9DAB8F4EE8A951输出密钥指纹对应密钥的公钥(这里如果知道用户ID也可以写用户ID)。
这里需要注意,不能把--output [密钥指纹/用户ID]写在最后,不然会输出文件失败,并把转换成的ASCII码打印在终端。

输出私钥的话如下:

gpg --armor --output First_secret_key.txt --export-secret-keys 7DA8BCF2BB7BBD6013A4DC0A1C9DAB8F4EE8A951

不过如果使用的是Mac的话,就需要我们使用之前设置的“Pinentry Mac”的“passphrase”。

输入密钥

我们有时候需要使用别人分享的密钥来加密,这时候我们就需要将别人分享的密钥添加到自己的钥匙圈上。方法如下:
使用nano或者vi等文本编辑软件新建一个后缀为.gpg的文件,将别人分享的ASCII码明文密钥复制粘贴进去,保存,这里保存完的文件名为other_key.gpg。然后使用以下命令导入:

gpg --import other_key.gpg

然后我们使用:gpg --list-key就可以看到我们刚才添加进去的密钥了。

加密(encrypt)和解密(decrypt)

在了解了密钥的一些知识之后,我们要进行我们本来想做的事情——加密和解密文件。
假设我们有一个文件名为before.txt的文件,这里我们使用以下方式加密文件:

gpg --recipient 7DA8BCF2BB7BBD6013A4DC0A1C9DAB8F4EE8A951 --output after.txt --encrypt before.txt

这里需要注意,格式应该为gpg [options] --encrypt [filename],选项--encrypt [filename]应该放在最后。--recipient选项后面跟密钥指纹,表示要用什么密钥加密解密文件。--encrypt表示加密,后面跟需要加密的文件。

解密的话使用以下命令:

gpg after.txt

然后显示:

gpg: WARNING: no command supplied.  Trying to guess what you mean ...
gpg: encrypted with 3072-bit RSA key, ID 9F9C425E3B989D0A, created 2021-04-14
      "Real_Name (First) <Real_Name@xx.com>"
gpg: after.txt: unknown suffix
Enter new filename [before.txt]: 1.txt

然后提示输入之前“Pinentry Mac”的“passphrase”,接着输入解密之后的文件名,就可以在“1.txt”文件中看到之前文本文件里的内容。

签名(sign)

有时候我们只需要说明这事我们发送的文件,这就需要对文件签名,表示文件的发送者。
可以使用以下命令签名:

gpg --sign before.txt

然后会生成一个名为before.txt.gpg文件,也是一个OpenPGP二进制格式文件,不可读,还原成可读文件也不是很方便,不推荐使用。
推荐使用以下方法:

gpg --clearsign before.txt 

这样会生成一个before.txt.asc的文件,使用less命令查看可见:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

nihao
woshini
wohenhao
-----BEGIN PGP SIGNATURE-----

iQGzBAEBCAAdFiEEfai88rt7vWATpNwKHJ2rj07oqVEFAmB3EE8ACgkQHJ2rj07o
qVE+zAv9HBSHZGy1GI3hjqw8om1iea4d63b5TsoAtcSMU4j7e6InYfUEfrOWnC6z
iCcVR2Gad6be4BhR59e7YadGHJdq3LTjOLCV1o+v4RDeot7CCwWnNSKW8Lk+PHMh
nFLuJSv95BHonAxHmL2n0pw7MjXOUgP/qzWjZ5UK1xWcr1rhHS0IDyP3T4f9dyYw
WWdwbixj1MQrfFet4EeQ5uq123123123WjHqjQ95zk9ot+vM1eciy6Yq1PmkkN9e
/w4vW2KgslVdePcXlzE2w1321kCbCFqJhvygNu4XQslOa+Uqf0y/+irD1L2CF5hG4hLK
9aZnwwYIJqIgwu4Y2yo7qxd6B384Vx9h13113N2Uu3LjfXYnWVKhNHxLt0Kmy43Z
fU94zSDHbvnBF+9aYwrB40UwHkxDJ0xof8bxMK6yQHY8BCwu7mbh5kzXUVjfNwee
l4TIVnD6A4WzknPsOlOW+BI+r87GvrmtdcrksvjlK8c55xoegDad4xGqlogegAkI
/mKiX2MD
=r4EJ
-----END PGP SIGNATURE-----

第一部分就是原本的文本,第二部分则是可读的ASCII码签名了。

但是我们要签名的不是文本文件,而是视频图片或者其他非ASCII码文件,这样也还是不可读,那么我们就需要生成单独的签名,将签名分开放置。我们就可以使用以下命令:

gpg --detach-sign test1.MP4

这样会生成一个名为test1.MP4.sig的签名文件。

如果我们又想加密又想签名,就使用以下命令:

gpg --local-user [签名用的密钥指纹/用户ID] --recipient [加密用的密钥指纹/用户ID] --armor --sign --encrypt [需要加密的文件]

这里我们举个例子:

gpg --local-user 7DA8BCF2BB7BBD6013A4DC0A1C9DAB8F4EE8A951 --recipient 7DA8BCF2BB7BBD6013A4DC0A1C9DAB8F4EE8A951 --armor --sign --encrypt test2.MP4

这时候会生成一个文件名为test2.MP4.asc

验证签名

签名有了,怎么验证呢?对不同类型的签名有不同的验证方式,比如说上一节单独生成的test1.MP4.sig签名文件,我们就可以使用以下命令:

gpg --verify test.MP4.sig

然后我们可以看到终端打印出:

gpg: Signature made 四  4/15 00:21:49 2021 CST
gpg:                using RSA key 7DA8BCF2BB7BBD6013A4DC0A1C9DAB8F4EE8A951
gpg: Good signature from "Real_Name (First) <Real_Name@xx.com>" [ultimate]

这样就可以对照验证签名,看出来谁是真正的发送者。

例如上一节我们使用加密并且签名生成的test2.MP4.asc文件,就需要解密再验证签名,可以直接使用gpg test2.MP4.asc解密,然后就可以看到解密之后会打印出上文同样的内容,因为虽然这个命令不正确,但是gpg会显示以下内容并且猜测你的意思,挺智能的。

gpg: WARNING: no command supplied.  Trying to guess what you mean ...

基础的就这些,更多功能就翻阅man page吧。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GunPG使用教程(含密钥生成删除以及文件加密解密签名) 的相关文章

随机推荐

  • springboot中的json、gson、fastjson如何使用与日期格式转换

    关于如何引用json gson fastjson srpngboot中默认用的是json格式 如果需要使用gson和fastjson其中一种格式的话 首先需要在pom文件中排除对json格式的依赖 再去引入你想要gson或者fastjson
  • CSS样式——div居中方法

    1 绝对居中 给div设置样式 div默认显示位置为body的左上方 width 400px height 300px background color orange 如下图所示 首先给div添加绝对定位 并设置上下左右边距为0 然后使用m
  • 【git国内镜像地址】【速度快】

    重申一下 此处说的是git客户端下载 而不是github网站 github网站请绕路 git官网地址 官网地址 大家可以打开试试 每秒几十或者只有几kb 下完要一个月 大家可以试试国内地址 5秒之内下载完成 git国内镜像地址 git国内镜
  • C++泛型基础

    1 泛型的基本思想 泛型编程 Generic Programming 是一种语言机制 通过它可以实现一个标准的容器库 像类一样 泛型也是一种抽象数据类型 但是泛型不属于面向对象 它是面向对象的补充和发展 在面向对象编程中 当算法与数据类型有
  • c语言fwrite函数的总结

    头文件 include
  • 华东地区响应最快的DNS服务排名

    223 5 5 5 阿里DNS 约 29 ms 114 114 115 115 114DNS 约 30 ms 114 114 115 119 114DNS 约 30 ms 114 114 114 114 114DNS 约 31 ms 114
  • OpenGL学习脚印: 环境搭建

    写在前面 如果你正在阅读本文 那么你和我一样可能喜欢图形学或者游戏编程 想尝试编写自己的图形App 图形学的初学者往往非常着急 希望能立即编写出丰富生动 逼真又富有交互性的3D应用 至少我是这样 笔者翻看了图形学教材 红宝书 3D数学基础等
  • 【Shiro】SpringBoot继承Shiro

    项目版本 springboot2 x shiro 1 3 2 Maven配置
  • 【OLAP(联机分析处理)】简单理解

    OnLine Analysis Processing 联机分析处理 功能 支持复杂的分析操作 侧重决策支持 并且提供直观易懂的查询结果 原理 OLAP联机分析首先是把数据预处理成数据立方 Cube 并把有可能的汇总都预先算出来 即预聚合处理
  • android卸载应用程序代码,android-关闭应用程序并从最近的应用程序中删除/

    我的解决方案基于上述的guest 以及下面的gilsaints88的评论 用于Android L兼容性 将此活动添加到您的AndroidManifest xml文件中 android name com example ExitActivit
  • Linux下安装mysql5.7.25,rpm安装方式保姆级教程!

    目录 前言 一 下载mysql5 7 25rpm安装压缩包 1 进入mysql官网的下载主页MySQL 2 进入社区下载 3 找到社区版服务器 4 进入历史版本库找到目标版本 二 检查并卸载已有的MySQL数据库 三 解压安装MySQL5
  • K8s(kubernetes)集群搭建及dashboard安装、基础应用部署

    基础介绍 概念 本质是一组服务器集群 在集群每个节点上运行特定的程序 来对节点中的容器进行管理 实现资源管理的自动化 功能 自我修复 弹性伸缩 服务发现 负载均衡 版本回退 存储编排 组件 控制节点 master 控制平面 APIserve
  • 解决VScode中无法激活conda虚拟环境的问题

    1 点击 终端 gt 新建终端 2 默认新建的终端是PowerShell 我们可以对其进行修改 3 此时进入cmd模式 就可以正常激活虚拟环境啦
  • 活动代码页简介

    代码页是字符集编码的别名 也有人称 内码表 早期 代码页是IBM称呼电脑BIOS本身支持的字符集编码的名称 当时通用的操作系统都是命令行界面系统 这些操作系统直接使用BIOS供应的VGA功能来显示字符 操作系统的编码支持也就依靠BIOS的编
  • 考虑设备动作损耗的配电网分布式电压无功优化(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 文献来源 摘要 电压无功控制是保证配电网经
  • Acwing 282. 石子合并

    区间DP循环一般是 区间长度从小到大来循环 然后再循环区间的左端点 然后再枚举我们的决策 f i j 表示将所有第i堆石子到第j堆石子合并成一堆石子的合并方式 这些方式中代价的最小值 我们可以以最后一次合并的分界线来划分集合 k i j 1
  • el-table使用时,获取index索引

    因为本人对vue不熟悉 特此记录开发时遇到的这个问题 1 获取表格列的索引 2 table选项卡点击事件
  • C++ Primer 学习笔记 第五章 语句

    C 中大多语句以分号 结束 一个表达式 如ival 5 末尾加上分号就变成了表达式语句 表达式语句的作用是执行表达式并丢弃掉求值结果 ival 5 一条没什么用的表达式语句 cout lt lt ival 一条有用的表达式语句 最简单的语句
  • PHPStudy介绍、下载与安装

    介绍 phpStudy是一个PHP调试环境的程序集成包 该程序包集成最新的 Apache PHP MySQL phpMyAdmin ZendOptimizer 一次性安装 无须配置即可使用 是非常方便 好用的PHP调试环境 下载地址 php
  • GunPG使用教程(含密钥生成删除以及文件加密解密签名)

    GunPG是一个开源免费的加密解密的GPG软件 使用命令行 在Windows Linux macOS Android等平台上都有 如果Mac平台需要可视化的操作方式 那么可以使用GPGTools 是一款收费的商业软件 官网地址是 https