openssl使用-1

Openssl使用-1

这一章介绍一些基础的命令。openssl用的地方有点多,分两张写

openssl的安装和配置

Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions

下载地址

使用这里是别人配置好的安装包

下好之后点击安装,之后就傻瓜式点点点。

  • 配置环境变量

image-20250707002024482

image-20250707002030726

这样就配置好了

  • lunix下配置

Lunix配置比较简单这里就省略了嘿嘿。。。

使用教程

介绍

OpenSSL 是一个功能强大的开源工具,用于实现安全通信的加密协议。它提供了 加密算法、密钥生成、证书管理、SSL/TLS 协议实现 等一系列功能,广泛用于 Web 服务器、安全邮件、VPN、代码签名等领域。

基本命令

  1. 查看版本
1
2
C:\Users\24055>openssl version
OpenSSL 3.5.1 1 Jul 2025 (Library: OpenSSL 3.5.1 1 Jul 2025)
  1. 生成随机数

openssl rand 命令生成随机字节

1
2

openssl rand [选项] <字节数>

例如,生成 16 字节随机数据(以二进制输出):

1
2

openssl rand 16 > random.bin

生成 16 字节随机数据(以十六进制输出):

1
openssl rand -hex 16

生成 Base64 编码的随机数openssl rand -base64

输出类似:

1
t3jv5Q9Qs9k1J9YTqxBfGQ==
  1. 摘要函数
1
2
3
(openssl) fox@localhost:/mnt/c/Users/24055$ vi ms.txt
(openssl) fox@localhost:/mnt/c/Users/24055$ openssl dgst -SHA256 -hex ms.txt
SHA2-256(ms.txt)= e5e94ea36193df8f2b31f31cd50ab0db3affbf28cd8c0b6158355e5104a7b8d1

使用SHA-235将ms.txt内的文本进行摘要函数计算。之后进行hex编码尽管hex是默认的编码方式

1
2
(openssl) fox@localhost:/mnt/c/Users/24055$ openssl dgst -SHA256 -out dgst.d ms.txt
(openssl) fox@localhost:/mnt/c/Users/24055$ vi dgst.d

hash后的内容写入文件dgst.d中 -out 指定摘要输出文件

数字签名

  1. 生成rsa公钥和私钥
1
openssl genpkey -algorithm RSA -out rsa.key -pkeyopt rsa_keygen_bits:2048

openssl genpkey
OpenSSL 生成私钥的命令,是比旧命令 genrsa 更通用、推荐的新命令。

-algorithm RSA
指定生成的是 RSA 算法的密钥对。

-out rsa.key
将生成的私钥保存到名为 rsa.key 的文件中。

-pkeyopt rsa_keygen_bits:2048
私钥生成参数,指定密钥长度为 2048 位(2048-bit RSA 密钥)。

1
2
3
4
5
6
7
8
(openssl) fox@localhost:/mnt/c/Users/24055$ openssl dgst -sha256 -sign rsa.key -out signature.sign msg.txt
(openssl) fox@localhost:/mnt/c/Users/24055$ cat signature.sign
"�e�E��l4�tCyR�`�=@f
]��� ܔ�m�0�����٣�?-
����ے(�,&�␦5k�뾉��_h�-��,?&K��NO9��,s��7B��o��w�ڇv'������
T9*]`)�Z�N��d8*P_�0Y�BN5���ĸ
N�89��
�Q�U���|M���@�LYӺ��T7���8ulj֯�dh�M�@$�m/&���+�����O���F� B�P���oP���aI�_NB(openssl) (openssl) fox@localhost:/mnt/c/Users/24055$

我们用

1
(openssl) fox@localhost:/mnt/c/Users/24055$ openssl dgst -sha256 -sign rsa.key -out signature.sign msg.txt

加密签名。

1
2
3
(openssl) fox@localhost:/mnt/c/Users/24055$ openssl rsa -in rsa.key -pubout -out rsa_pu
b.key

生成对应的公钥在rsa_pub.key

然后用它验证签名。

1
2
(openssl) fox@localhost:/mnt/c/Users/24055$ openssl dgst -sha256 -verify rsa_pub.key -signature signature.sign msg.txt
Verified OK#验证成功显示

🔹 openssl

调用 OpenSSL 命令行工具。


🔹 dgst

是 OpenSSL 的“digest”子命令,用于处理哈希摘要相关操作,包括计算、签名、验证等。


🔹 -sha256

表示用 SHA-256 哈希算法对输入文件 msg.txt 进行摘要。
数字签名的流程中一般先做摘要,所以必须指定摘要算法(和签名时用的一致)。


🔹 -verify rsa_pub.key

表示使用 rsa_pub.key 这个文件中保存的RSA公钥进行验证。
公钥的作用是:验证签名是否合法(也就是验证这份签名是否是由私钥对 msg.txt 的 SHA256 摘要签的名)

对称加密算法

1
2
openssl enc -aes-128-cbc -e -a -p -pbkdf2 -in msg.txt -out
cipher.enc

🔹 enc

是 OpenSSL 的加密/解密模块,支持对称加密算法(AES、DES、BF 等)进行加密/解密操作。


🔹 -aes-128-cbc

指定加密算法为 AES(高级加密标准)128位密钥,使用 CBC 模式(Cipher Block Chaining)

  • 128:表示使用 128 位密钥(16 字节)。
  • cbc:表示使用“密文块链接模式”,需要 IV(初始化向量)。

🔹 -e

表示 加密模式(encrypt),相对应的解密是 -d


🔹 -a

表示对加密结果进行 Base64 编码,使输出是可打印字符(文本文件也能存储),否则默认是二进制格式。


🔹 -p

加上这个参数会在加密时打印出所用的 key 和 IV(以十六进制显示),用于调试或记录。


🔹 -pbkdf2

表示使用 PBKDF2 密钥派生函数从口令中派生出加密密钥(而不是旧版默认的 EVP_BytesToKey,它已经不安全了)。现代 OpenSSL 建议强烈加上这个选项

  • 简单来说,如果你输入口令 mypassword,OpenSSL 不会直接用它做密钥,而是用 PBKDF2 做拉伸(加盐 + 多轮 hash)来生成强密码。

在执行加密时,会让输入password,并不是实际加密的密钥。实际加密的密钥是根据输入的password,利用kdf算法(如pbkdf2)生成的。实际密钥和偏移值可以使用-p选项,在加密后输出。

同时,也可以通过-K key指定实际使用的密钥。

在加密的时候会默认加入随机值盐salt,使得每次加密的生成密钥和加密值不一致,增加爆破难度。可以使用-nosalt选项不使用盐,通过-p可以发现,password一致时,每次生成的key都一样的。

同样的,也可以使用-S salt指定使用的盐而不使用随机值。

1
2
openssl enc -aes-128-cbc -d -a -p -pbkdf2 -in cipher.enc -
out plain.d

现在我们使用-d来解密,解密过程中我们需要输入我们之前输入的。

image-20250707042323266

  • -aes-128-cbc指定解密算法。
  • -d表示解密
  • -a指定先进行base64解码,再进行解密。
  • -pbkdf2表示加密时的密钥使用pbkdf2算法生成。
  • -p表示解密后,输出实际使用的盐、密钥和偏移值到标准输出。

image-20250707042644981

密钥处理

  1. 生成rsa公私钥
1
openssl genrsa -out rsa.pem 1024
  • genrsa

表示生成rsa私钥

image-20250707043659450

1
openssl rsa -in rsa.pem -pubout -out rsa_pub.pem

导出公钥

  • -in指定输入的私钥文件。
  • -pubout:默认输出为私钥,利用该选项指定输出为公钥。

-in -out 默认都是私钥,当输入或输出为公钥时,要分别加上-pubin、-pubout。若输入已经加上-pubin时,若输出也为公钥-pubout一般不用加,因为输入为公钥,输出默认也为公钥。

该原则适用于以下所有openssl rsa指令。

  1. 密钥格式转化

默认生成和输入的都是Pem格式,他们之间咳哟转化

  1. PEM格式
  • 全称:Privacy-Enhanced Mail

  • 文件内容:是经过Base64编码的文本格式,内容是可打印的ASCII字符。

  • 结构:有明确的头尾标识,比如私钥通常是:

1
2
3
-----BEGIN RSA PRIVATE KEY-----
(Base64编码的数据)
-----END RSA PRIVATE KEY-----
  • 用途:广泛用于各种证书和密钥文件,尤其是在Linux、OpenSSL环境中常见。

  • 优点

  • 易于在文本文件中传输和阅读

  • 支持添加注释、分隔符

  • 文件扩展名.pem.crt.cer.key(不完全统一)


  1. DER格式
  • 全称:Distinguished Encoding Rules
  • 文件内容:二进制格式,没有经过Base64编码,直接存储二进制数据。
  • 结构:纯二进制,不能直接用文本编辑器打开阅读。
  • 用途:通常用于Java平台和某些二进制传输协议,或者Windows系统的某些证书。
  • 优点
  • 紧凑,不需要编码,文件体积较小
  • 文件扩展名.der.cer(也可能是.pem的二进制形式)
1
openssl rsa -pubin -in rsa_pub.pem -outform DER -out rsa_pub.der
1
openssl rsa -in rsa.pem -outform DER -out rsa.der

image-20250707044822133

  • -outform 指定输出格式。
  • -pubin:默认输入为私钥,利用该选项指定输入为公钥。
  1. 查看密钥参数

RSA私钥中的关键参数解释

参数名 含义与作用
Private-Key: (1024 bit, 2 primes) 表示这是一个1024位的RSA密钥,使用了两个大质数(RSA标准)
modulus (n) 模数 n = p × q,是RSA公钥和私钥的核心参数,所有加解密计算都围绕它进行。
publicExponent (e) 公钥指数 e,通常是 65537 (0x10001),是公钥加密和签名验证时使用的指数。
privateExponent (d) 私钥指数 d,用于私钥解密和签名,满足 (e × d) mod φ(n) = 1,其中φ是欧拉函数。
prime1 (p) 大质数 p,模数 n 的一个质因子。
prime2 (q) 大质数 q,模数 n 的另一个质因子。
exponent1 (d mod (p-1)) 私钥指数 d 对 p-1 取模的结果。用于加速私钥运算(中国剩余定理CRT优化)
exponent2 (d mod (q-1)) 私钥指数 d 对 q-1 取模的结果。也用于CRT优化,提高运算效率。
coefficient (q^(-1) mod p) q 关于 p 的模逆,即 q 的逆元 mod p。CRT计算时用到,用于组合两个模运算的结果,提升解密速度。

image-20250707045143443

  • -text指明输出密钥的组件
  • -noout指明不输出编码的密钥

非对称算法

这里以rsa为例子

  1. 加密
1
openssl pkeyutl -encrypt -in msg.txt -pubin -inkey rsa_pub.pem -out rsa_chiper.enc

pkeyutl 不仅支持rsa, OpenSSL 的公钥实用工具(用于公钥加密/解密等操作)

rsautl相比过于简单老旧

1
openssl pkeyutl -encrypt -in msg.txt -pubin -inkey rsa_pub.pem -out rsa_chiper.enc -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256

这里是加了新的填充方式和sha256

  • encrypt 表示加密
  • in 要加密的文件
  • pubin:默认输入私有密钥,表示输入密钥为公钥
  • inkey 指明加密的公钥文件
  • out输出的加密文件
  • -pkeyopt rsa_padding_mode:oaep指明填充模式为oaep
  • -pkeyopt rsa_oaep_md:sha256指明oaep使用的摘要算法为SHA256
  1. 解密
1
2
3
(openssl) fox@localhost:~/fox/text$ openssl pkeyutl -decrypt -in rsa_chiper.enc -inkey rsa.pem -out rsa_plain.d
(openssl) fox@localhost:~/fox/text$ cat rsa_plain.d
Icandoit
  • decrypt表示解密
  1. 签名

    1
    openssl dgst -sha256 -binary -out hash.dgst msg.txt

    先生成hash文件。这个要求验签的适合只能是binary格式o

    1
    openssl pkeyutl -sign -inkey rsa.pem -in hash.dgst -out signature.sign

    -sign

    表示签名操作

  2. 验签

1
2
openssl pkeyutl -verify -pubin -inkey rsa_pub.pem -in hash.dgst -sigfile signature.sign

  • verify

表示验签。


openssl使用-1
http://example.com/2025/07/06/openssl/
Aŭtoro
fox
Postigita
July 6, 2025
Lizenta