openssl使用-1
Openssl使用-1
这一章介绍一些基础的命令。openssl用的地方有点多,分两张写
openssl的安装和配置
Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions
下载地址
使用这里是别人配置好的安装包
下好之后点击安装,之后就傻瓜式点点点。
- 配置环境变量
这样就配置好了
- lunix下配置
Lunix配置比较简单这里就省略了嘿嘿。。。
使用教程
介绍
OpenSSL 是一个功能强大的开源工具,用于实现安全通信的加密协议。它提供了 加密算法、密钥生成、证书管理、SSL/TLS 协议实现 等一系列功能,广泛用于 Web 服务器、安全邮件、VPN、代码签名等领域。
基本命令
- 查看版本
1 |
|
- 生成随机数
用 openssl rand
命令生成随机字节
1 |
|
例如,生成 16 字节随机数据(以二进制输出):
1 |
|
生成 16 字节随机数据(以十六进制输出):
1 |
|
生成 Base64 编码的随机数openssl rand -base64
输出类似:
1 |
|
- 摘要函数
1 |
|
使用SHA-235将ms.txt内的文本进行摘要函数计算。之后进行hex编码尽管hex是默认的编码方式
1 |
|
hash后的内容写入文件dgst.d中 -out
数字签名
- 生成rsa公钥和私钥
1 |
|
openssl genpkey
OpenSSL 生成私钥的命令,是比旧命令 genrsa
更通用、推荐的新命令。
-algorithm RSA
指定生成的是 RSA 算法的密钥对。
-out rsa.key
将生成的私钥保存到名为 rsa.key
的文件中。
-pkeyopt rsa_keygen_bits:2048
私钥生成参数,指定密钥长度为 2048 位(2048-bit RSA 密钥)。
1 |
|
我们用
1 |
|
加密签名。
1 |
|
生成对应的公钥在rsa_pub.key
然后用它验证签名。
1 |
|
🔹 openssl
调用 OpenSSL 命令行工具。
🔹 dgst
是 OpenSSL 的“digest”子命令,用于处理哈希摘要相关操作,包括计算、签名、验证等。
🔹 -sha256
表示用 SHA-256 哈希算法对输入文件 msg.txt
进行摘要。
数字签名的流程中一般先做摘要,所以必须指定摘要算法(和签名时用的一致)。
🔹 -verify rsa_pub.key
表示使用 rsa_pub.key
这个文件中保存的RSA公钥进行验证。
公钥的作用是:验证签名是否合法(也就是验证这份签名是否是由私钥对 msg.txt 的 SHA256 摘要签的名)
对称加密算法
1 |
|
🔹 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 |
|
现在我们使用-d来解密,解密过程中我们需要输入我们之前输入的。
- -aes-128-cbc指定解密算法。
- -d表示解密
- -a指定先进行base64解码,再进行解密。
- -pbkdf2表示加密时的密钥使用pbkdf2算法生成。
- -p表示解密后,输出实际使用的盐、密钥和偏移值到标准输出。
密钥处理
- 生成rsa公私钥
1 |
|
- genrsa
表示生成rsa私钥
1 |
|
导出公钥
- -in指定输入的私钥文件。
- -pubout:默认输出为私钥,利用该选项指定输出为公钥。
-in -out 默认都是私钥,当输入或输出为公钥时,要分别加上-pubin、-pubout。若输入已经加上-pubin时,若输出也为公钥-pubout一般不用加,因为输入为公钥,输出默认也为公钥。
该原则适用于以下所有openssl rsa指令。
- 密钥格式转化
默认生成和输入的都是Pem格式,他们之间咳哟转化
- PEM格式
全称:Privacy-Enhanced Mail
文件内容:是经过Base64编码的文本格式,内容是可打印的ASCII字符。
结构:有明确的头尾标识,比如私钥通常是:
1
2
3
-----BEGIN RSA PRIVATE KEY-----
(Base64编码的数据)
-----END RSA PRIVATE KEY-----
用途:广泛用于各种证书和密钥文件,尤其是在Linux、OpenSSL环境中常见。
优点:
易于在文本文件中传输和阅读
支持添加注释、分隔符
文件扩展名:
.pem
、.crt
、.cer
、.key
(不完全统一)
- DER格式
- 全称:Distinguished Encoding Rules
- 文件内容:二进制格式,没有经过Base64编码,直接存储二进制数据。
- 结构:纯二进制,不能直接用文本编辑器打开阅读。
- 用途:通常用于Java平台和某些二进制传输协议,或者Windows系统的某些证书。
- 优点:
- 紧凑,不需要编码,文件体积较小
- 文件扩展名:
.der
、.cer
(也可能是.pem的二进制形式)
1 |
|
1 |
|
- -outform 指定输出格式。
- -pubin:默认输入为私钥,利用该选项指定输入为公钥。
- 查看密钥参数
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计算时用到,用于组合两个模运算的结果,提升解密速度。 |
- -text指明输出密钥的组件
- -noout指明不输出编码的密钥
非对称算法
这里以rsa为例子
- 加密
1 |
|
pkeyutl 不仅支持rsa, OpenSSL 的公钥实用工具(用于公钥加密/解密等操作)
rsautl相比过于简单老旧
1 |
|
这里是加了新的填充方式和sha256
- encrypt 表示加密
- in 要加密的文件
- pubin:默认输入私有密钥,表示输入密钥为公钥
- inkey 指明加密的公钥文件
- out输出的加密文件
- -pkeyopt rsa_padding_mode:oaep指明填充模式为oaep
- -pkeyopt rsa_oaep_md:sha256指明oaep使用的摘要算法为SHA256
- 解密
1 |
|
- decrypt表示解密
签名
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
表示签名操作
验签
1 |
|
- verify
表示验签。