加密 vs 电子签名:公钥私钥的奇妙冒险
目录
- 一、轻松的解释下什么是加密,什么是签名
- 1. 加密(Encryption)——锁住秘密的魔法箱
- 2. 签名(Signature)——防伪认证的盖章术
- 二、什么是公钥,什么是私钥
- 1. 数学原理
- 2. 生成方法(看不懂没关系😁)
- 三、核心应用场景
- 1. 数据加密传输
- 2. 数字签名与认证
- 3. 密钥协商机制
- 4. 加密货币体系
- 四、Debian 11 和 Ubuntu 24.04 生成公钥与私钥的方法
- 1. SSH 密钥对生成(通用方法)
- 2. 查看生成的密钥
- 总结
一、轻松的解释下什么是加密,什么是签名
1. 加密(Encryption)——锁住秘密的魔法箱
场景: 你想偷偷给朋友发情书,但怕被隔壁老王偷看。
操作:
你要做的:用朋友的公钥(像一把公开的带锁的)把情书锁进箱子📦。其实这就是加密,是将明文转换为密文的过程,目的是保护数据的机密性,防止未授权方读取敏感信息。
朋友要做的:用TA的私钥(唯一钥匙)开箱读信🔑。其实就是解密,是使用自己的私钥解密数据还原明文。
关键点:公钥加密的数据,只有对应私钥能解开(注意这个只有,也就是唯一的意思哦),确保只有目标人能看!
2. 签名(Signature)——防伪认证的盖章术
场景: 你网上卖签名照,粉丝怕买到假货。
操作:
你要做的:用你的私钥给照片盖个加密章(签名)🏷️。
朋友要做的:用你的公钥验证章的真伪✅,确认是“正品”!
关键点:私钥签名只能由对应公钥验证,证明数据没被篡改+来源靠谱。从本质原理上说,公钥和私钥是一一对应的,但是有些场合我们需要一对多,这时候可通过主私钥派生多个子公钥,实现“一个私钥对应多个公钥”的效果。但这属于应用层扩展,并非底层算法的原生特性。
二、什么是公钥,什么是私钥
知道了加密和签名,大家很好奇公钥,私钥是什么了吧。公钥和私钥是非对称加密体系的核心组件,通过数学算法配对生成且互为加解密关系。公钥可公开分发,私钥必须严格保密。这对密钥的特性决定了其独特的安全机制:用公钥加密的数据只能由对应私钥解密,用私钥签名的数据可通过公钥验证来源。那么什么是非对称加密呢?非对称加密是相对对称加密来讲的。对称加密是通过单一密钥完成数据加密与解密的机制,加密方与解密方需共享同一密钥。而非对称加密是采用公钥(公开)+私钥(保密)配对机制(公钥私钥完全是两个东西),公钥加密数据需私钥解密,私钥签名(其实也是加密)数据需公钥验证(其实也是解密)。
1. 数学原理
非对称加密基础是基于数学难题构建单向函数,加密与解密互为逆运算。常见算法:
RSA: 依赖大整数质因数分解难题
ECC(椭圆曲线加密): 利用椭圆曲线上离散对数问题,同等密钥长度下安全性更高
ElGamal: 基于离散对数问题,常用于密钥交换
所谓的单向性指的是私钥包含解密必需的关键参数,可以推导出公钥,也就是有了私钥,你就能生成公钥,但是公钥无法逆向推算出私钥,也就是公钥不能生成私钥。
2. 生成方法(看不懂没关系😁)
RSA密钥生成典型流程包含:
- 随机选择两个大质数 p 和 q
- 计算 n = pq 和 φ(n) = (p-1)(q-1)
- 选择整数 e 满足 1 < e < φ(n) 且与 φ(n) 互质
- 计算 d 使得 (d*e) mod φ(n) = 1
- 公钥为 (e,n),私钥为 (d,n)
ECC密钥生成
基于椭圆曲线参数生成基点 G,私钥为随机整数 k,公钥计算为 k*G 的曲线点坐标。
ElGamal密钥生成
选择大素数p和生成元g
私钥x随机选择,公钥y = gˣ mod p
三、核心应用场景
1. 数据加密传输
发送方用接收方公钥加密数据,仅持有对应私钥的接收方可解密。例如:
- 电子邮件加密(PGP协议)
- TLS/SSL通信中的会话密钥传递,这里的密钥指的是对称密钥哈,后续大数据加密用的。
什么时候用非对称加密,什么时候用对称加密呢?我们有个经典用法:
- 先让非对称加密护送「对称加密的钥匙」
- 再用对称加密疯狂传输海量数据
我们加密世界的生存法则:
- 黄金组合:非对称护送对称密钥 + 对称密钥加密飙车传数据(HTTPS等协议的标准操作)
- 终极奥义:对称加密像「快餐」——方便但易胖(密钥泄露风险);非对称加密像「养生餐」——安全但费牙(计算成本高)
2. 数字签名与认证
签名者用私钥生成签名,验证者用公钥核实身份及数据完整性。典型场景:
- 软件代码签名验证
- 电子合同签署
- 区块链交易验证
3. 密钥协商机制
通过Diffie-Hellman等协议,在不安全信道中建立共享密钥。
4. 加密货币体系
私钥作为资产所有权凭证,公钥生成钱包地址,交易需私钥签名确认。
四、Debian 11 和 Ubuntu 24.04 生成公钥与私钥的方法
1. SSH 密钥对生成(通用方法)
使用 ssh-keygen 命令
适用于 SSH 登录、Git 认证等场景,支持 RSA、ECDSA 等算法:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
- -t rsa:指定密钥类型为 RSA(可选 ecdsa 或 ed25519)RSA 兼容性最佳,但 ECDSA 或 Ed25519 性能更优,密钥长度至少 2048 位,(RSA)或 256 位(ECC)
其中算法演进过程如下:
RSA → ECC:解决密钥过长问题,提升效率;
ECC → ECDSA:适配数字签名需求,但保留随机数依赖缺陷;
ECDSA → Ed25519:通过确定性签名和优化曲线设计,实现更高安全性与性能。 - -b 4096:设置密钥长度为 4096 位(安全性更高)
- -C:添加注释(通常为邮箱)
默认保存路径为 ~/.ssh/id_rsa(私钥)和 ~/.ssh/id_rsa.pub(公钥)
2. 查看生成的密钥
cat ~/.ssh/id_rsa.pub # 查看公钥
cat ~/.ssh/id_rsa # 查看私钥(需谨慎操作)
总结
本文简单介绍了加密与签名,我们简单总结下加密与签名:
加密 | 签名 | |
---|---|---|
目的 | 保护数据机密性 | 验证数据完整性和发送者身份 |
操作方向 | 公钥加密 → 私钥解密 | 私钥签名 → 公钥验证 |
密钥归属 | 接收者的公钥用于加密,私钥用于解密 | 发送者的私钥用于签名,公钥用于验证 |
适用角色 | 面向接收者(隐私保护) | 面向发送者(身份认证) |