《OpenSSL 对称加密与 RSA 非对称加密》

《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 参考文档

阅读 — · 全站 —
🎸 我的歌单 0 首