公钥密码学实际上是如何工作的
对称加密、密钥对和数字签名的实践演练,不涉及数学类比的手挥舞。
每次你SSH到一台服务器或加载HTTPS网站时,两个数学相关的密钥都在承担繁重工作。一个是公开的,一个是私密的,它们之间的关系正是在不可信网络上实现安全通信的基础。
基本概念
在对称加密中,一个密钥既加密又解密数据。如果双方已经共享一个秘密,这工作得很好,但安全地分发那个秘密是难点。公钥(非对称)密码学通过生成一个数学相关的密钥对来解决这个问题:一个公钥你可以分发给任何人,一个私钥你永远不要共享。
用公钥加密的数据只能用配对的私钥解密。用私钥签名的数据可以被任何持有公钥的人验证。这两个属性涵盖了我们为此使用的几乎所有内容:保密性和身份验证。
RSA,经典案例
RSA依赖于这样一个事实:将两个大素数相乘很快,但将乘积分解回这两个素数在规模上计算上很耗时。一个2048位的RSA密钥由大约各1024位的两个素数构成。公钥是(n, e)——n是素数的乘积,e是一个固定的指数如65537。私钥是使用n的欧拉函数派生的,涉及知道原始素数。
加密是模幂运算:c = m^e mod n。解密用私密指数d反向进行:m = c^d mod n。实际上没有人直接用RSA加密大型有效载荷——它很慢并且有与密钥长度相关的大小限制。相反,RSA通常包装一个对称会话密钥(例如AES-256),对称密码处理大量数据。这是TLS使用的混合方法。
椭圆曲线密码学及其为何占据主导
ECC以小得多的密钥为你提供与RSA等效的安全性。一个256位的ECC密钥(如曲线secp256r1或Curve25519)大致相当于3072位RSA密钥的强度。更小的密钥意味着更快的握手和更少的带宽,这就是为什么现代TLS配置、SSH实现和Signal协议都依赖ECC。
数学是不同的——它基于椭圆曲线上点的离散对数问题而不是整数分解——但公钥/私钥关系和保证在概念上是相同的。
数字签名:等式的另一半
加密保持数据保密。签名证明真实性和完整性。要签名一条消息,你对其进行哈希(通常是SHA-256)并用你的私钥加密该哈希。任何持有你公钥的人都可以自己对消息进行哈希,解密你的签名,并检查两个哈希是否匹配。
当你用GPG密钥运行git commit -S时,或当证书颁发机构签署TLS证书时,正是这种情况。CA的私钥签署你的证书;浏览器预装了CA的公钥,所以它们可以验证你的证书的真实性,无需直接与CA通信。
日常使用中这在哪里出现
SSH密钥认证是直接应用:ssh-keygen -t ed25519生成一个密钥对,你将公钥放入服务器上的~/.ssh/authorized_keys中,认证通过使用私钥的挑战-响应发生,密码从不传输。
TLS握手简要使用非对称密码,只是为了建立一个共享对称密钥(在现代设置中通过ECDHE密钥交换),然后切换到快速对称加密用于实际会话。PGP/GPG电子邮件加密也遵循混合模式——用随机AES密钥加密消息,然后用接收者的RSA或ECC公钥加密那个AES密钥。
实际中真正破裂的地方
RSA和ECC背后的数学还没有通过经典计算被破解。出问题的几乎总是实现:创建密钥时的弱随机数生成(2008年的Debian OpenSSL漏洞是教科书案例)、ECDSA签名中的重用nonce泄漏私钥,或针对实现不当的RSA的padding oracle攻击(Bleichenbacher对PKCS#1 v1.5 padding的攻击)。量子计算是长期的理论威胁——如果存在足够大的量子计算机,Shor算法会破解RSA和ECC——这就是为什么NIST已经为未来迁移标准化了ML-KEM(原为Kyber)等后量子算法。
如果你想深入了解这个,Korra Studio的密码学课程更深入地涵盖密钥交换协议和哈希函数内部,网络部分逐字节地讲解所有这些如何融入实际TLS握手。
本文由人工智能协助撰写,经 Michal Pilch(CISSP)审核并发布,Korra Studio。
这是来自 Korra Studio 知识库的笔记之一——该平台将每个主题与一对一指导相结合。
免费开始arrow_forward