Skip to content

公钥密码学

公钥密码学通过 私钥 (Private Key)公钥 (Public Key) 的配合,实现 SSH、HTTPS、数字签名、证书体系 等功能。


基本概念

  • 私钥 (Private Key):必须保密在自己电脑上,用于解密或签名
  • 公钥 (Public Key):可以公开签发给别人,用于加密或验证签名
  • 特点:私钥和公钥是一一对应的,不能从公钥反推出私钥

常见算法

  • RSA

    • 基于大整数因数分解难题
    • 常见密钥长度:2048 / 4096 位
    • 经典算法,兼容性最好
  • ECDSA

    • 基于椭圆曲线的签名算法
    • 比 RSA 短得多的密钥即可达到相同安全性
    • 被广泛用于区块链、TLS
  • Ed25519

    • 基于 Curve25519 椭圆曲线
    • 现代化、性能高、密钥短小
    • OpenSSH 默认推荐

生成方式

  • OpenSSH (ssh-keygen): SSH、Git

  • OpenSSL (openssl genpkey): TLS/HTTPS、证书

  • GPG/PGP (gpg --gen-key): 邮件加密、软件签名

  • 编程库 (Python, Go, Node.js): 应用内生成

  • 区块链钱包: 数字货币地址/账户

OpenSSL

OpenSSL 是一个用 C语言 实现的软件工具包 / 库,实现了各种密码学算法和 TLS 协议。它实现的算法包括:

  • 公钥密码学:RSAEd25519ECDSADHECDH

  • 对称加密:AES、ChaCha20、DES(已过时)

  • 哈希函数:SHA1/2/3、MD5、BLAKE2 等


Linux

安装方式

bash
sudo apt install openssl
sudo dnf install openssl
sudo pacman -S openssl

使用示例

假设要生成到 /home/workspace/resource/

  • RSA 2048 位
bash
# 带 -pkeyopt rsa_keygen_bits:2048 参数, 生成一把2048位的RSA 私钥, 叫 rsa_private.pem
openssl genpkey -algorithm RSA -out /home/workspace/resource/rsa_private.pem -pkeyopt rsa_keygen_bits:2048
# 从私钥里提取公钥 叫rsa_public.pem
openssl rsa -in /home/workspace/resource/rsa_private.pem -pubout -out /home/workspace/resource/rsa_public.pem
  • Ed25519
bash
# 生成一把 Ed25519 私钥, 不需要设置位数, 叫 ed25519_private.pem
openssl genpkey -algorithm Ed25519 -out /home/workspace/resource/ed25519_private.pem
# 从私钥里提取公钥 ed25519_public.pem
openssl pkey -in /home/workspace/resource/ed25519_private.pem -pubout -out /home/workspace/resource/ed25519_public.pem

Windows

安装方式

一般 Git for Windows 自带 OpenSSL, 例如我的路径在 "E:\DevTools\Git\usr\bin\openssl.exe"

使用示例

假设要生成到 E:\DevTools\ssh\

  • RSA 2048 位
powershell
# 带 -pkeyopt rsa_keygen_bits:2048 参数, 生成一把2048位的RSA 私钥, 叫 rsa_private.pem
openssl genpkey -algorithm RSA -out E:\DevTools\ssh\rsa_private.pem -pkeyopt rsa_keygen_bits:2048
# 从私钥里提取公钥 叫rsa_public.pem
openssl rsa -in E:\DevTools\ssh\rsa_private.pem -pubout -out E:\DevTools\ssh\rsa_public.pem
  • Ed25519
powershell
# 生成一把 Ed25519 私钥, 不需要设置位数, 叫 ed25519_private.pem
openssl genpkey -algorithm Ed25519 -out E:\DevTools\ssh\ed25519_private.pem
# 从私钥里提取公钥 ed25519_public.pem
openssl pkey -in E:\DevTools\ssh\ed25519_private.pem -pubout -out E:\DevTools\ssh\ed25519_public.pem

OpenSSH

OpenSSH 中有了详细的介绍