《OpenSSL 对称加密与 RSA 非对称加密》
1 简介
OpenSSL 命令行可完成对称加密(如 AES-256-CBC)与非对称加密(RSA)的加解密。本文命令均经过验证,可直接执行。
2 对称加密 AES-256-CBC
2.1 用随机 key/iv 加密
-K 需要十六进制的 key(AES-256 为 32 字节 = 64 个 hex 字符),-iv 需要 16 字节 = 32 个 hex 字符:
# 生成随机的 key 与 iv(推荐用 rand -hex,不要用 md5 派生)
key=$(openssl rand -hex 32)
iv=$(openssl rand -hex 16)
echo "key=$key iv=$iv"
# 加密,输出二进制,再用 xxd 转为 hex
printf 'hello world' | openssl enc -e -aes-256-cbc -K "$key" -iv "$iv" | xxd -p
# 解密:hex -> 二进制 -> 解密
printf 'enc-output-hex' | xxd -r -p | openssl enc -d -aes-256-cbc -K "$key" -iv "$iv"
2.2 带 base64 输出
key=$(openssl rand -hex 32)
iv=$(openssl rand -hex 16)
# 加密为 base64
enc=$(printf 'hello world' | openssl enc -e -aes-256-cbc -base64 -A -K "$key" -iv "$iv")
echo "$enc"
# 解密(Linux 用 base64 -d,macOS 用 base64 -D)
printf '%s' "$enc" | base64 -d | openssl enc -d -aes-256-cbc -K "$key" -iv "$iv"
2.3 口令派生模式(带 salt)
不指定 -K/-iv、只给口令时,OpenSSL 会用 salt 自动派生密钥:
# 加密(自动加盐,输出带 salt 头)
echo "secret message" | openssl enc -aes-256-cbc -base64 -salt -pass pass:my-passphrase
# 解密
echo "base64-cipher" | openssl enc -d -aes-256-cbc -base64 -pass pass:my-passphrase
注意:
-K/HEXIV模式与口令模式不同源。原文中「-S salt同时配合-K/-iv」的写法已过时且易出错,建议使用上文 2.1 / 2.2 的标准写法。
3 xxd:hex 与字符串互转
printf 'hello' | xxd -p # str -> hex,如 68656c6c6f
printf '68656c6c6f' | xxd -r -p # hex -> str
4 RSA 非对称加密
4.1 生成密钥对与公钥
openssl genrsa -out rsa_key.pem 2048
openssl rsa -in rsa_key.pem -pubout -out rsa_pub.pem
4.2 公钥加密、私钥解密
printf 'hello rsa' | openssl pkeyutl -encrypt -pubin -inkey rsa_pub.pem \
| openssl pkeyutl -decrypt -inkey rsa_key.pem
# hello rsa
RSA 只适合加密小数据(如密钥/签名),批量加密应使用对称加密或混合加密(RSA 交换 AES 密钥)。
5 常见问题
5.1 bad decrypt / wrong final block length
- 确认
-K/-iv是 hex 且字节数正确(AES-256-CBC:key 32B、iv 16B); - 明确加密与解密时使用的模式、盐与口令完全一致;
- base64 解码时换行差异,
-A表示单行,与base64 -d(Linux)/base64 -D(macOS)配合。
6 参考文档
阅读 —
·
全站 —