密码学概览
现代密码学概览
从数千年前的最初尝试,到第一批成功用于开发实践、如今已退役的密码算法(如 MD5 和 DES),再到 SHA-3、Argon2 和 ChaCha20 等现代算法,密码学已经经历了漫长的演进。
我们先简要介绍开发者应当了解的基本密码学概念,包括密码学哈希函数(SHA-256、SHA3、RIPEMD 等)、HMAC(基于哈希的消息认证码)、基于密码的密钥派生函数(如 Scrypt)、Diffie-Hellman 密钥交换协议、对称密钥加密方案(如采用 CBC 和 CTR 分组模式的 AES 密码),以及使用公钥和私钥的非对称密钥加密方案(如 RSA 密码,以及基于椭圆曲线的密码学,即 ECC、secp256k1 曲线和 Ed25519 密码系统)。此外还会介绍数字签名与 ECDSA、熵的概念、安全随机数生成,以及抗量子密码学。
消息加密与解密——在线演示
我们以 AES 加密算法为例,简单演示消息的加密与解密。可以试用这个在线工具:https://aesencryption.net。

稍后我们会了解到,看似简单的 AES 加密背后其实隐藏着许多算法和设置,例如基于密码的密钥派生函数及其参数、分组密码工作模式、初始化向量(IV)、消息认证码等。
什么是密码学?
密码学是一门为信息提供安全与保护的科学。它无处不在:打开网站、发送电子邮件或连接 WiFi 网络时都会用到。因此,开发者至少应当基本理解密码学以及密码算法和密码学库的使用方法,了解哈希、对称和非对称密码及其加密方案,以及数字签名和支撑它们的密码系统与算法。
加密与密钥
密码学研究如何安全地存储和传输数据,使数据只能由预期接收者读取和处理。这可能涉及使用对称或非对称加密方案对数据进行加密和解密,其中使用一个或多个密钥将数据从明文形式转换为加密形式,再恢复为明文。
对称加密(如 AES、Twofish 和 ChaCha20)使用同一密钥加密和解密消息;非对称加密则使用 RSA 或 ECC 等公钥密码系统和一对密钥:公钥(加密密钥)及其对应的私钥(解密密钥)。加密算法经常组合成加密方案,例如 AES-256-CTR-HMAC-SHA-256、ChaCha20-Poly1305 或 ECIES-secp256k1-AES-128-GCM。
密码学会使用密钥(很大的秘密数值);在许多场景中,这些密钥通过密钥派生算法(如 PBKDF2 和 Scrypt)从数值、密码或口令短语派生而来。
数字签名与消息认证
密码学提供了对消息进行数字签名的方法,从而保证消息的真实性、完整性和不可否认性。大多数数字签名算法(如 DSA、ECDSA 和 EdDSA)使用非对称密钥对(私钥和公钥):用私钥对消息进行签名,再用对应的公钥验证签名。在银行系统中,数字签名用于签署和批准付款;在区块链中,经过签名的交易允许用户将区块链资产从一个地址转移到另一个地址。
密码学还研究消息认证算法(如 HMAC)和消息认证码(MAC),用来证明消息的真实性、完整性和来源。认证通常与加密配合使用,以确保通信安全。
安全随机数
密码学使用随机数,并研究熵(不可预测的随机性)和随机数的安全生成方式(例如使用 CSPRNG)。安全随机数本质上不可预测,开发者必须重视它,因为随机数生成器一旦失效,系统或应用就可能遭到入侵。
密钥交换
密码学定义了密钥交换算法(如 Diffie-Hellman 密钥交换和 ECDH)和密钥建立方案,用于在希望通过加密安全传输消息的双方之间安全地建立加密密钥。这类算法通常在双方建立新的安全连接时执行,例如打开现代网站或连接 WiFi 网络时。
密码学哈希与密码哈希
密码学提供密码学哈希函数(如 SHA-3 和 BLAKE2),它们将消息转换为固定长度的消息摘要(哈希)。摘要无法反向还原为原始消息,并且几乎可以唯一标识输入。例如,在区块链系统中,哈希用于生成区块链地址、交易 ID,并参与许多其他算法和协议;在 Git 中,密码学哈希用于为文件和提交生成唯一 ID。
密码哈希以及基于密码的密钥派生函数(如 Scrypt 和 Argon2),会从文本密码安全地派生哈希(或密钥),注入随机参数(盐),并使用大量迭代和计算资源来减慢密码破解,从而保护用户密码以及由密码加密的文档和数据。
密码学中的混淆与扩散
在密码学中,哈希算法、加密算法和随机数生成器遵循香农的混淆与扩散原则。混淆是指密码输出中的每一位都应依赖密钥和输入数据的多个部分,从而无法建立直接映射。扩散是指输入中一位的变化应使输出中大约一半的位发生变化。大多数哈希函数、MAC 算法、随机数生成器以及对称和非对称密码都融入了这些原则。
密码学库
开发者应当了解其编程语言和平台上的现代密码学库及其使用方法。使用密码学进行开发,必须先理解密码学概念。从互联网上复制粘贴代码,或照搬博客中的示例,可能造成不安全的设计和薄弱的安全性。密码学库非常有用,但应先理解概念,再选择合适的算法组合,并仔细调整其参数。