033 《现代密码学原理与实践 (Modern Cryptography: Principles and Practice)》
🌟🌟🌟本文案由Gemini 2.0 Flash Thinking Experimental 01-21创作,用来辅助学习知识。🌟🌟🌟
书籍大纲
▮▮▮▮ 1. chapter 1: 密码学概论 (Introduction to Cryptography)
▮▮▮▮▮▮▮ 1.1 什么是密码学? (What is Cryptography?)
▮▮▮▮▮▮▮ 1.2 密码学的历史发展 (Historical Development of Cryptography)
▮▮▮▮▮▮▮ 1.3 密码学的基本概念 (Basic Concepts of Cryptography)
▮▮▮▮▮▮▮▮▮▮▮ 1.3.1 密码算法 (Cryptographic Algorithm)
▮▮▮▮▮▮▮▮▮▮▮ 1.3.2 密钥 (Key)
▮▮▮▮▮▮▮▮▮▮▮ 1.3.3 密码协议 (Cryptographic Protocol)
▮▮▮▮▮▮▮ 1.4 密码学的应用领域 (Applications of Cryptography)
▮▮▮▮▮▮▮ 1.5 密码学与信息安全 (Cryptography and Information Security)
▮▮▮▮ 2. chapter 2: 数学基础 (Mathematical Foundations)
▮▮▮▮▮▮▮ 2.1 数论基础 (Number Theory Basics)
▮▮▮▮▮▮▮▮▮▮▮ 2.1.1 整数与模运算 (Integers and Modular Arithmetic)
▮▮▮▮▮▮▮▮▮▮▮ 2.1.2 群、环、域 (Groups, Rings, Fields)
▮▮▮▮▮▮▮▮▮▮▮ 2.1.3 欧几里得算法与扩展欧几里得算法 (Euclidean Algorithm and Extended Euclidean Algorithm)
▮▮▮▮▮▮▮▮▮▮▮ 2.1.4 中国剩余定理 (Chinese Remainder Theorem)
▮▮▮▮▮▮▮▮▮▮▮ 2.1.5 素数与素性检验 (Prime Numbers and Primality Test)
▮▮▮▮▮▮▮ 2.2 代数结构 (Algebraic Structures)
▮▮▮▮▮▮▮▮▮▮▮ 2.2.1 有限域 (Finite Fields)
▮▮▮▮▮▮▮▮▮▮▮ 2.2.2 多项式环 (Polynomial Rings)
▮▮▮▮▮▮▮ 2.3 概率论基础 (Probability Theory Basics)
▮▮▮▮▮▮▮▮▮▮▮ 2.3.1 概率与条件概率 (Probability and Conditional Probability)
▮▮▮▮▮▮▮▮▮▮▮ 2.3.2 随机变量与概率分布 (Random Variables and Probability Distributions)
▮▮▮▮▮▮▮ 2.4 计算复杂性理论基础 (Computational Complexity Theory Basics)
▮▮▮▮▮▮▮▮▮▮▮ 2.4.1 P问题与NP问题 (P and NP Problems)
▮▮▮▮▮▮▮▮▮▮▮ 2.4.2 NP完全性 (NP-Completeness)
▮▮▮▮ 3. chapter 3: 对称密钥密码学 (Symmetric-key Cryptography)
▮▮▮▮▮▮▮ 3.1 经典密码算法 (Classical Ciphers)
▮▮▮▮▮▮▮▮▮▮▮ 3.1.1 替换密码 (Substitution Ciphers)
▮▮▮▮▮▮▮▮▮▮▮ 3.1.2 换位密码 (Transposition Ciphers)
▮▮▮▮▮▮▮▮▮▮▮ 3.1.3 维吉尼亚密码 (Vigenère Cipher)
▮▮▮▮▮▮▮▮▮▮▮ 3.1.4 弗纳姆密码与一次一密 (Vernam Cipher and One-Time Pad)
▮▮▮▮▮▮▮ 3.2 分组密码 (Block Ciphers)
▮▮▮▮▮▮▮▮▮▮▮ 3.2.1 数据加密标准 DES (Data Encryption Standard DES)
▮▮▮▮▮▮▮▮▮▮▮ 3.2.2 高级加密标准 AES (Advanced Encryption Standard AES)
▮▮▮▮▮▮▮▮▮▮▮ 3.2.3 分组密码的工作模式 (Modes of Operation for Block Ciphers)
▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮ 3.2.3.1 电子密码本模式 ECB (Electronic Codebook ECB)
▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮ 3.2.3.2 密码分组链接模式 CBC (Cipher Block Chaining CBC)
▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮ 3.2.3.3 计数器模式 CTR (Counter CTR)
▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮ 3.2.3.4 伽罗瓦/计数器模式 GCM (Galois/Counter Mode GCM)
▮▮▮▮▮▮▮ 3.3 流密码 (Stream Ciphers)
▮▮▮▮▮▮▮▮▮▮▮ 3.3.1 RC4
▮▮▮▮▮▮▮▮▮▮▮ 3.3.2 ChaCha20
▮▮▮▮▮▮▮ 3.4 分组密码与流密码的比较 (Comparison of Block Ciphers and Stream Ciphers)
▮▮▮▮ 4. chapter 4: 公钥密码学 (Public-key Cryptography)
▮▮▮▮▮▮▮ 4.1 公钥密码学概念 (Public-key Cryptography Concepts)
▮▮▮▮▮▮▮▮▮▮▮ 4.1.1 公钥与私钥 (Public Key and Private Key)
▮▮▮▮▮▮▮▮▮▮▮ 4.1.2 单向陷门函数 (Trapdoor One-way Function)
▮▮▮▮▮▮▮ 4.2 RSA 算法 (RSA Algorithm)
▮▮▮▮▮▮▮▮▮▮▮ 4.2.1 RSA 算法原理 (RSA Algorithm Principles)
▮▮▮▮▮▮▮▮▮▮▮ 4.2.2 RSA 密钥生成 (RSA Key Generation)
▮▮▮▮▮▮▮▮▮▮▮ 4.2.3 RSA 加密与解密 (RSA Encryption and Decryption)
▮▮▮▮▮▮▮▮▮▮▮ 4.2.4 RSA 的安全性分析 (Security Analysis of RSA)
▮▮▮▮▮▮▮ 4.3 Diffie-Hellman 密钥交换 (Diffie-Hellman Key Exchange)
▮▮▮▮▮▮▮▮▮▮▮ 4.3.1 Diffie-Hellman 密钥交换原理 (Diffie-Hellman Key Exchange Principles)
▮▮▮▮▮▮▮▮▮▮▮ 4.3.2 中间人攻击 (Man-in-the-Middle Attack)
▮▮▮▮▮▮▮ 4.4 椭圆曲线密码学 ECC (Elliptic Curve Cryptography ECC)
▮▮▮▮▮▮▮▮▮▮▮ 4.4.1 椭圆曲线基础 (Elliptic Curve Basics)
▮▮▮▮▮▮▮▮▮▮▮ 4.4.2 椭圆曲线上的离散对数问题 (Elliptic Curve Discrete Logarithm Problem ECDLP)
▮▮▮▮▮▮▮▮▮▮▮ 4.4.3 椭圆曲线 Diffie-Hellman 密钥交换 ECDH (Elliptic Curve Diffie-Hellman ECDH)
▮▮▮▮▮▮▮▮▮▮▮ 4.4.4 椭圆曲线数字签名算法 ECDSA (Elliptic Curve Digital Signature Algorithm ECDSA)
▮▮▮▮▮▮▮ 4.5 公钥密码算法的比较 (Comparison of Public-key Cryptographic Algorithms)
▮▮▮▮ 5. chapter 5: 哈希函数 (Hash Functions)
▮▮▮▮▮▮▮ 5.1 哈希函数概念 (Hash Function Concepts)
▮▮▮▮▮▮▮▮▮▮▮ 5.1.1 哈希函数的性质 (Properties of Hash Functions)
▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮ 5.1.1.1 单向性 (Preimage Resistance)
▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮ 5.1.1.2 抗碰撞性 (Collision Resistance)
▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮ 5.1.1.3 第二原像抗性 (Second Preimage Resistance)
▮▮▮▮▮▮▮ 5.2 常用哈希算法 (Common Hash Algorithms)
▮▮▮▮▮▮▮▮▮▮▮ 5.2.1 MD5
▮▮▮▮▮▮▮▮▮▮▮ 5.2.2 SHA-1
▮▮▮▮▮▮▮▮▮▮▮ 5.2.3 SHA-256, SHA-512 (SHA-2 Family)
▮▮▮▮▮▮▮▮▮▮▮ 5.2.4 SHA-3
▮▮▮▮▮▮▮ 5.3 哈希函数的应用 (Applications of Hash Functions)
▮▮▮▮▮▮▮▮▮▮▮ 5.3.1 消息摘要 (Message Digest)
▮▮▮▮▮▮▮▮▮▮▮ 5.3.2 数据完整性校验 (Data Integrity Check)
▮▮▮▮▮▮▮▮▮▮▮ 5.3.3 密码存储 (Password Storage)
▮▮▮▮ 6. chapter 6: 消息认证码与数字签名 (Message Authentication Codes and Digital Signatures)
▮▮▮▮▮▮▮ 6.1 消息认证码 MAC (Message Authentication Code MAC)
▮▮▮▮▮▮▮▮▮▮▮ 6.1.1 MAC 的概念与作用 (Concepts and Functions of MAC)
▮▮▮▮▮▮▮▮▮▮▮ 6.1.2 HMAC (基于哈希函数的消息认证码) (HMAC - Hash-based Message Authentication Code)
▮▮▮▮▮▮▮▮▮▮▮ 6.1.3 CMAC (基于密码分组的消息认证码) (CMAC - Cipher-based Message Authentication Code)
▮▮▮▮▮▮▮ 6.2 数字签名 (Digital Signatures)
▮▮▮▮▮▮▮▮▮▮▮ 6.2.1 数字签名的概念与作用 (Concepts and Functions of Digital Signatures)
▮▮▮▮▮▮▮▮▮▮▮ 6.2.2 RSA 数字签名 (RSA Digital Signature)
▮▮▮▮▮▮▮▮▮▮▮ 6.2.3 ECDSA 数字签名 (ECDSA Digital Signature)
▮▮▮▮▮▮▮ 6.3 数字签名标准 (Digital Signature Standard DSS)
▮▮▮▮▮▮▮ 6.4 消息认证码与数字签名的比较 (Comparison of MAC and Digital Signatures)
▮▮▮▮ 7. chapter 7: 密钥管理与密钥交换 (Key Management and Key Exchange)
▮▮▮▮▮▮▮ 7.1 密钥管理概述 (Overview of Key Management)
▮▮▮▮▮▮▮▮▮▮▮ 7.1.1 密钥生成 (Key Generation)
▮▮▮▮▮▮▮▮▮▮▮ 7.1.2 密钥分发 (Key Distribution)
▮▮▮▮▮▮▮▮▮▮▮ 7.1.3 密钥存储 (Key Storage)
▮▮▮▮▮▮▮▮▮▮▮ 7.1.4 密钥撤销 (Key Revocation)
▮▮▮▮▮▮▮ 7.2 密钥交换协议 (Key Exchange Protocols)
▮▮▮▮▮▮▮▮▮▮▮ 7.2.1 Diffie-Hellman 密钥交换 (Diffie-Hellman Key Exchange)
▮▮▮▮▮▮▮▮▮▮▮ 7.2.2 基于公钥加密的密钥交换 (Key Exchange based on Public-key Encryption)
▮▮▮▮▮▮▮▮▮▮▮ 7.2.3 密钥派生函数 KDF (Key Derivation Function KDF)
▮▮▮▮▮▮▮ 7.3 公钥基础设施 PKI (Public Key Infrastructure PKI)
▮▮▮▮▮▮▮▮▮▮▮ 7.3.1 数字证书 (Digital Certificates)
▮▮▮▮▮▮▮▮▮▮▮ 7.3.2 证书颁发机构 CA (Certificate Authority CA)
▮▮▮▮▮▮▮▮▮▮▮ 7.3.3 证书吊销列表 CRL (Certificate Revocation List CRL)
▮▮▮▮ 8. chapter 8: 密码协议与应用 (Cryptographic Protocols and Applications)
▮▮▮▮▮▮▮ 8.1 安全套接层协议 TLS/SSL (Transport Layer Security TLS/Secure Sockets Layer SSL)
▮▮▮▮▮▮▮▮▮▮▮ 8.1.1 TLS/SSL 协议概述 (Overview of TLS/SSL Protocol)
▮▮▮▮▮▮▮▮▮▮▮ 8.1.2 TLS/SSL 握手协议 (TLS/SSL Handshake Protocol)
▮▮▮▮▮▮▮▮▮▮▮ 8.1.3 TLS/SSL 记录协议 (TLS/SSL Record Protocol)
▮▮▮▮▮▮▮ 8.2 安全 Shell 协议 SSH (Secure Shell SSH)
▮▮▮▮▮▮▮ 8.3 IP 安全协议 IPsec (IP Security IPsec)
▮▮▮▮▮▮▮ 8.4 电子邮件安全协议 S/MIME, PGP (Secure/Multipurpose Internet Mail Extensions S/MIME, Pretty Good Privacy PGP)
▮▮▮▮▮▮▮ 8.5 区块链与密码学 (Blockchain and Cryptography)
▮▮▮▮▮▮▮▮▮▮▮ 8.5.1 区块链中的哈希函数应用 (Hash Function Applications in Blockchain)
▮▮▮▮▮▮▮▮▮▮▮ 8.5.2 区块链中的数字签名应用 (Digital Signature Applications in Blockchain)
▮▮▮▮ 9. chapter 9: 高级密码学专题 (Advanced Topics in Cryptography)
▮▮▮▮▮▮▮ 9.1 零知识证明 (Zero-Knowledge Proofs)
▮▮▮▮▮▮▮ 9.2 同态加密 (Homomorphic Encryption)
▮▮▮▮▮▮▮ 9.3 多方安全计算 MPC (Secure Multi-Party Computation MPC)
▮▮▮▮▮▮▮ 9.4 属性基加密 ABE (Attribute-Based Encryption ABE)
▮▮▮▮▮▮▮ 9.5 后量子密码学 (Post-Quantum Cryptography)
▮▮▮▮▮▮▮▮▮▮▮ 9.5.1 量子计算与密码学的挑战 (Quantum Computing and Cryptographic Challenges)
▮▮▮▮▮▮▮▮▮▮▮ 9.5.2 抗量子密码算法 (Quantum-resistant Cryptographic Algorithms)
▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮ 9.5.2.1 格密码 (Lattice-based Cryptography)
▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮ 9.5.2.2 编码密码 (Code-based Cryptography)
▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮ 9.5.2.3 多变量密码 (Multivariate Cryptography)
▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮ 9.5.2.4 哈希密码 (Hash-based Cryptography)
▮▮▮▮ 10. chapter 10: 密码分析与安全性评估 (Cryptanalysis and Security Evaluation)
▮▮▮▮▮▮▮ 10.1 密码分析概述 (Overview of Cryptanalysis)
▮▮▮▮▮▮▮▮▮▮▮ 10.1.1 密码分析的目标 (Goals of Cryptanalysis)
▮▮▮▮▮▮▮▮▮▮▮ 10.1.2 常见的密码分析方法 (Common Cryptanalysis Methods)
▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮ 10.1.2.1 穷举攻击 (Brute-force Attack)
▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮ 10.1.2.2 统计分析 (Statistical Analysis)
▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮ 10.1.2.3 差分密码分析 (Differential Cryptanalysis)
▮▮▮▮▮▮▮▮▮▮▮▮▮▮▮ 10.1.2.4 线性密码分析 (Linear Cryptanalysis)
▮▮▮▮▮▮▮ 10.2 对称密码的密码分析 (Cryptanalysis of Symmetric Ciphers)
▮▮▮▮▮▮▮ 10.3 公钥密码的密码分析 (Cryptanalysis of Public-key Ciphers)
▮▮▮▮▮▮▮ 10.4 哈希函数的密码分析 (Cryptanalysis of Hash Functions)
▮▮▮▮▮▮▮ 10.5 密码系统的安全性评估 (Security Evaluation of Cryptographic Systems)
▮▮▮▮▮▮▮▮▮▮▮ 10.5.1 安全性需求分析 (Security Requirements Analysis)
▮▮▮▮▮▮▮▮▮▮▮ 10.5.2 威胁建模 (Threat Modeling)
▮▮▮▮▮▮▮▮▮▮▮ 10.5.3 安全性测试与评估方法 (Security Testing and Evaluation Methods)
▮▮▮▮ 11. chapter 11: 密码学工程实践 (Cryptography Engineering Practice)
▮▮▮▮▮▮▮ 11.1 密码算法库的使用 (Using Cryptographic Algorithm Libraries)
▮▮▮▮▮▮▮▮▮▮▮ 11.1.1 OpenSSL
▮▮▮▮▮▮▮▮▮▮▮ 11.1.2 Libsodium
▮▮▮▮▮▮▮▮▮▮▮ 11.1.3 Bouncy Castle
▮▮▮▮▮▮▮ 11.2 安全随机数生成 (Secure Random Number Generation)
▮▮▮▮▮▮▮ 11.3 密钥管理最佳实践 (Key Management Best Practices)
▮▮▮▮▮▮▮ 11.4 密码学在软件开发中的应用 (Cryptography in Software Development)
▮▮▮▮▮▮▮ 11.5 密码学硬件加速 (Cryptography Hardware Acceleration)
▮▮▮▮ 12. chapter 12: 密码学的未来趋势与展望 (Future Trends and Prospects of Cryptography)
▮▮▮▮▮▮▮ 12.1 量子计算对密码学的影响 (Impact of Quantum Computing on Cryptography)
▮▮▮▮▮▮▮ 12.2 人工智能与密码学 (Artificial Intelligence and Cryptography)
▮▮▮▮▮▮▮ 12.3 隐私计算技术 (Privacy-preserving Computation Technologies)
▮▮▮▮▮▮▮ 12.4 轻量级密码学 (Lightweight Cryptography)
▮▮▮▮▮▮▮ 12.5 密码学标准化与发展 (Cryptography Standardization and Development)
1. chapter 1: 密码学概论 (Introduction to Cryptography)
1.1 什么是密码学? (What is Cryptography?)
密码学 (Cryptography) 是一门古老而又充满活力的学科,它研究如何在存在敌手 (adversary) 的情况下实现安全通信和信息保护。从本质上讲,密码学是关于秘密 (secrets) 的科学。它不仅仅关注如何加密信息使其不被未授权者读取,还涵盖了认证 (authentication)、完整性 (integrity) 和 不可否认性 (non-repudiation) 等多个方面,旨在构建安全可靠的信息系统。
简单来说,密码学可以回答以下几个核心问题:
① 如何在不安全的信道上安全地传递信息,使得只有预期的接收者才能理解信息的内容?
② 如何验证信息的发送者身份,确保信息不是伪造的?
③ 如何确保信息在传输过程中没有被篡改?
④ 如何防止发送者事后否认发送过某条信息?
为了解决这些问题,密码学运用数学、计算机科学、信息理论等多种学科的知识,设计和分析各种密码算法 (cryptographic algorithm) 和 密码协议 (cryptographic protocol)。这些算法和协议是构建现代信息安全体系的基石,广泛应用于互联网通信、数据存储、身份认证、电子支付等领域。
密码学并非仅仅是一系列复杂的数学公式和算法,更是一种思维方式 (mindset)。它要求我们从对抗性 (adversarial) 的角度思考问题,预见潜在的安全威胁,并设计相应的防御机制。学习密码学,不仅能够掌握保护信息安全的技术手段,更能培养严谨的逻辑思维和解决复杂问题的能力。
1.2 密码学的历史发展 (Historical Development of Cryptography)
密码学的历史几乎与文明史一样悠久。早在几千年前,人类就有了保护军事和政治机密的需求,密码学的萌芽也由此产生。密码学的发展历程可以大致划分为以下几个阶段:
① 古典密码时期 (Classical Cryptography Era):从古代到 20 世纪初,这一时期的密码学主要依赖手工加密和解密,算法相对简单,安全性较低。
⚝ 早期的密码:例如古埃及的象形文字加密、古希腊的 斯巴达密码棒 (scytale) 等,都属于早期的密码形式。这些方法主要通过简单的替换或换位来实现加密。
⚝ 替换密码 (Substitution Cipher):凯撒密码 (Caesar cipher) 是最著名的替换密码之一,通过将字母表中的每个字母向后(或向前)移动固定数量的位置来进行加密。
⚝ 换位密码 (Transposition Cipher):换位密码不改变字母本身,而是改变字母的排列顺序。例如,将明文按行写入矩阵,然后按列读出,形成密文。
⚝ 维吉尼亚密码 (Vigenère Cipher):这是一种多表替换密码,使用密钥来决定每个字母的替换规则,提高了密码的强度,在很长一段时间内被认为是不可破解的。
② 近代密码时期 (Modern Cryptography Era) (20世纪初 - 1970年代):随着电子计算机的出现,密码学进入了一个新的时代。数学和计算机科学开始在密码学中扮演越来越重要的角色。
⚝ 香农 (Claude Shannon) 与信息论:香农将信息论引入密码学,提出了完善保密性 (perfect secrecy) 的概念,并证明了 一次一密 (one-time pad) 是唯一具有完善保密性的密码系统。香农的工作为现代密码学奠定了理论基础。
⚝ 密码分析的发展:计算机的出现也使得密码分析技术得到了极大的发展,例如 差分密码分析 (differential cryptanalysis) 和 线性密码分析 (linear cryptanalysis) 等强大的分析方法被提出,用于评估和破解密码算法。
⚝ 数据加密标准 DES (Data Encryption Standard DES):1970 年代,美国国家标准局 (NBS,即现在的 NIST) 发布了 DES,这是第一个公开的、标准化的分组密码算法,标志着现代密码学的开端。DES 的出现极大地推动了密码学的应用和发展。
③ 现代密码学时期 (Contemporary Cryptography Era) (1970年代至今):公钥密码学的诞生是现代密码学发展史上的一个里程碑,它彻底改变了密钥管理的方式,并催生了数字签名、密钥交换协议等一系列重要的密码学应用。
⚝ 公钥密码学的诞生:1976 年,Diffie (Whitfield Diffie) 和 Hellman (Martin Hellman) 提出了 公钥密码 (public-key cryptography) 的概念,随后 RSA 算法 (RSA algorithm) 和 Diffie-Hellman 密钥交换 (Diffie-Hellman key exchange) 等公钥密码算法被发明出来。公钥密码学的出现解决了密钥分发难题,使得在开放网络环境下进行安全通信成为可能。
⚝ 椭圆曲线密码学 ECC (Elliptic Curve Cryptography ECC):ECC 是一种基于椭圆曲线数学的公钥密码学,相比 RSA 等传统公钥密码算法,ECC 在相同安全强度下可以使用更短的密钥长度,具有更高的效率和安全性,在移动设备和资源受限的环境中得到广泛应用。
⚝ 后量子密码学 (Post-Quantum Cryptography):随着量子计算机的发展,传统的公钥密码算法面临被破解的风险。后量子密码学旨在研究能够抵抗量子计算机攻击的密码算法,例如 格密码 (lattice-based cryptography)、编码密码 (code-based cryptography)、多变量密码 (multivariate cryptography) 和 哈希密码 (hash-based cryptography) 等。后量子密码学是当前密码学研究的热点和前沿领域。
密码学的历史发展是一部不断演进和创新的历史。从最初的简单替换和换位,到现代密码学的数学理论和复杂算法,密码学始终在应对新的安全挑战,并为信息安全保驾护航。
1.3 密码学的基本概念 (Basic Concepts of Cryptography)
密码学涉及许多基本概念,理解这些概念是深入学习密码学的关键。以下介绍密码学中几个最重要的基本概念:
1.3.1 密码算法 (Cryptographic Algorithm)
密码算法 (cryptographic algorithm),也常称为 密码 (cipher),是用于实现加密和解密操作的一组数学规则或程序。密码算法是密码学的核心组成部分,其安全性直接决定了密码系统的安全性。根据密钥的使用方式,密码算法可以分为两大类:
① 对称密钥密码算法 (Symmetric-key Cryptographic Algorithm):对称密钥密码算法在加密和解密过程中使用相同的密钥 (key)。发送方和接收方必须在安全信道上预先协商好密钥,然后才能使用该密钥进行加密通信。
⚝ 优点:加密和解密速度快,效率高。
⚝ 缺点:密钥管理和分发困难,尤其是在大规模网络环境中。
⚝ 常见的对称密钥密码算法:DES (Data Encryption Standard), AES (Advanced Encryption Standard), RC4, ChaCha20 等。
② 公钥密码算法 (Public-key Cryptographic Algorithm):公钥密码算法使用一对密钥 (key pair),即 公钥 (public key) 和 私钥 (private key)。公钥可以公开给任何人,而私钥必须由密钥持有者秘密保管。
⚝ 加密过程:发送方使用接收方的公钥对明文进行加密,生成密文。
⚝ 解密过程:接收方使用自己的私钥对密文进行解密,恢复出明文。
⚝ 优点:解决了密钥分发难题,适用于开放网络环境。
⚝ 缺点:加密和解密速度相对较慢,效率较低。
⚝ 常见的公钥密码算法:RSA, 椭圆曲线密码算法 (ECC), Diffie-Hellman 密钥交换 等。
除了加密和解密算法,密码算法还包括 哈希函数 (hash function)、消息认证码 (message authentication code, MAC) 和 数字签名 (digital signature) 等。这些算法在信息安全中扮演着不同的角色,共同构建了完整的密码学体系。
1.3.2 密钥 (Key)
密钥 (key) 是密码算法的核心参数,用于控制加密和解密的过程。密钥的保密性是密码系统安全性的关键所在。如果密钥泄露,即使密码算法再复杂,也无法保证信息的安全。
① 密钥的类型:
⚝ 对称密钥 (Symmetric Key):用于对称密钥密码算法,加密和解密使用同一个密钥。对称密钥必须保密。
⚝ 公钥 (Public Key):用于公钥密码算法,可以公开给任何人,用于加密或验证签名。
⚝ 私钥 (Private Key):用于公钥密码算法,必须由密钥持有者秘密保管,用于解密或生成签名。
② 密钥的长度:密钥的长度决定了密码算法的安全性。一般来说,密钥长度越长,破解难度越大,安全性越高。密钥长度通常以 比特 (bit) 为单位。例如,AES-128 使用 128 比特的密钥,AES-256 使用 256 比特的密钥。随着计算能力的提升,建议使用更长的密钥长度以提高安全性。
③ 密钥的管理:密钥的管理是密码学应用中非常重要且复杂的问题,包括 密钥生成 (key generation)、密钥分发 (key distribution)、密钥存储 (key storage)、密钥更新 (key update) 和 密钥撤销 (key revocation) 等环节。安全可靠的密钥管理机制是保证密码系统安全运行的基础。
1.3.3 密码协议 (Cryptographic Protocol)
密码协议 (cryptographic protocol),也称为 安全协议 (security protocol),是使用密码算法来实现特定安全目标的步骤和规则的集合。密码协议定义了参与方之间交换的消息格式、顺序和处理逻辑,以完成诸如身份认证、密钥交换、安全通信等安全任务。
① 密码协议的要素:
⚝ 参与方 (Participants):协议的参与者,例如客户端、服务器、用户等。
⚝ 消息 (Messages):参与方之间交换的数据单元,通常包含加密数据、签名、密钥等信息。
⚝ 步骤 (Steps):协议执行的顺序和流程。
⚝ 规则 (Rules):协议参与方必须遵守的约定和操作规范。
⚝ 安全目标 (Security Goals):协议要达成的安全目标,例如保密性、认证性、完整性等。
② 常见的密码协议:
⚝ 密钥交换协议 (Key Exchange Protocol):例如 Diffie-Hellman 密钥交换,用于在通信双方之间安全地协商共享密钥。
⚝ 认证协议 (Authentication Protocol):例如 Kerberos,用于验证用户或实体的身份。
⚝ 安全通信协议 (Secure Communication Protocol):例如 TLS/SSL (Transport Layer Security/Secure Sockets Layer), SSH (Secure Shell), IPsec (IP Security),用于在网络上建立安全通信信道。
⚝ 数字签名协议 (Digital Signature Protocol):例如 RSA 数字签名, ECDSA 数字签名,用于实现数字签名的生成和验证。
密码协议是密码算法的应用和扩展,它将各种密码算法组合起来,解决实际应用中的安全问题。设计和分析密码协议需要综合考虑安全性、效率和实用性等因素。
1.4 密码学的应用领域 (Applications of Cryptography)
密码学作为信息安全的核心技术,其应用领域非常广泛,几乎渗透到现代生活的方方面面。以下列举一些密码学的主要应用领域:
① 信息保密 (Confidentiality):这是密码学最基本也是最重要的应用之一。通过加密技术,可以保护敏感信息不被未授权者访问和泄露。
⚝ 数据加密存储:对存储在计算机系统、数据库或云端的数据进行加密,防止数据泄露。
⚝ 通信加密:对网络通信数据进行加密,例如 HTTPS (HTTP Secure) 使用 TLS/SSL 协议对网页浏览进行加密,VPN (Virtual Private Network) 使用密码学技术建立安全的网络隧道。
⚝ 文件加密:对本地文件或电子邮件进行加密,保护个人隐私和商业机密。
② 身份认证 (Authentication):密码学可以用于验证用户、设备或系统的身份,防止身份冒充和欺诈行为。
⚝ 密码登录:用户使用密码进行身份验证,系统通过哈希函数存储密码的哈希值,而不是明文密码。
⚝ 数字证书:X.509 数字证书 用于验证网站、服务器或个人的身份,是 PKI (Public Key Infrastructure) 的核心组成部分。
⚝ 生物特征识别:指纹识别、人脸识别等生物特征识别技术也常常结合密码学技术,例如使用数字签名保护生物特征模板的完整性和真实性。
③ 数据完整性 (Data Integrity):密码学可以用于检测数据是否被篡改,保证数据的完整性和可靠性。
⚝ 消息摘要 (Message Digest):使用 哈希函数 生成消息的摘要值,用于验证消息的完整性。
⚝ 数字签名:数字签名不仅可以实现身份认证,还可以保证数据的完整性和不可否认性。
⚝ 区块链技术:区块链技术广泛使用哈希函数和数字签名技术,保证交易记录的不可篡改性和可追溯性。
④ 不可否认性 (Non-repudiation):数字签名技术可以实现不可否认性,防止发送者事后否认发送过某条信息或进行过某项操作。
⚝ 电子合同:使用数字签名签署电子合同,确保合同的法律效力,防止任何一方抵赖。
⚝ 电子交易:在电子交易中使用数字签名,保证交易的真实性和不可否认性。
⚝ 审计日志:对系统操作日志进行数字签名,防止日志被篡改,实现安全审计。
⑤ 访问控制 (Access Control):密码学可以用于实现细粒度的访问控制,限制用户对资源的访问权限。
⚝ 基于角色的访问控制 (Role-Based Access Control, RBAC):根据用户的角色分配不同的访问权限。
⚝ 属性基加密 (Attribute-Based Encryption, ABE):基于用户的属性进行访问控制,只有满足特定属性的用户才能解密数据。
⚝ 策略执行点 (Policy Enforcement Point, PEP) 和 策略决策点 (Policy Decision Point, PDP):访问控制系统中的关键组件,通常使用密码学技术保证策略执行和决策的安全性。
⑥ 电子支付 (Electronic Payment):密码学是电子支付系统的核心安全技术,保障交易的安全性和可靠性。
⚝ 支付协议:例如 SET (Secure Electronic Transaction), 3D Secure 等支付协议使用密码学技术保护支付信息的安全。
⚝ 数字货币:例如 比特币 (Bitcoin) 等数字货币使用密码学技术实现交易的匿名性、安全性和去中心化。
⚝ 移动支付:例如 NFC (Near Field Communication) 支付、二维码支付等移动支付方式也广泛使用密码学技术。
除了以上列举的应用领域,密码学还在 云计算 (cloud computing)、物联网 (Internet of Things, IoT)、人工智能 (Artificial Intelligence, AI)、大数据 (Big Data) 等新兴技术领域发挥着越来越重要的作用。随着信息技术的不断发展,密码学的应用前景将更加广阔。
1.5 密码学与信息安全 (Cryptography and Information Security)
密码学是信息安全 (information security) 的基石和核心技术。信息安全是一个更广泛的概念,它涵盖了保护信息资产的 保密性 (confidentiality)、完整性 (integrity) 和 可用性 (availability) (即 CIA 三元组) 以及 认证性 (authentication)、不可否认性 (non-repudiation) 等安全属性。密码学为实现这些安全属性提供了关键的技术手段。
① 密码学在信息安全中的作用:
⚝ 提供安全机制:密码学提供了各种安全机制,例如加密、解密、哈希、数字签名、消息认证码等,用于保护信息的安全。
⚝ 构建安全系统:密码学是构建安全信息系统的核心技术,各种安全协议、安全产品和安全应用都离不开密码学的支持。
⚝ 应对安全威胁:密码学可以帮助应对各种信息安全威胁,例如数据泄露、数据篡改、身份冒充、网络攻击等。
⚝ 支撑安全策略:密码学可以支撑信息安全策略的实施,例如访问控制策略、数据保护策略、安全审计策略等。
② 信息安全不仅仅是密码学:
虽然密码学在信息安全中至关重要,但信息安全不仅仅是密码学。信息安全是一个系统工程,除了密码学技术,还包括 物理安全 (physical security)、管理安全 (management security)、人员安全 (personnel security)、应用安全 (application security)、网络安全 (network security) 等多个方面。
⚝ 物理安全:保护计算机设备、网络设备等物理资产的安全,防止物理损坏、盗窃等。
⚝ 管理安全:建立和执行安全策略、安全规章制度,进行风险评估、安全审计等管理活动。
⚝ 人员安全:对人员进行安全培训、背景调查,提高人员的安全意识和责任感。
⚝ 应用安全:开发和部署安全的应用软件,防止软件漏洞和安全缺陷。
⚝ 网络安全:部署防火墙、入侵检测系统、安全扫描工具等网络安全设备和技术,保护网络安全。
③ 密码学与信息安全的协同发展:
密码学和信息安全是相互依存、协同发展的关系。密码学的发展为信息安全提供了更强大的技术支撑,而信息安全的需求又推动了密码学不断创新和发展。随着信息技术的快速发展,信息安全面临的挑战也越来越严峻,密码学作为信息安全的核心技术,其重要性将更加凸显。未来,密码学将继续在保障信息安全、维护网络空间安全、促进数字经济发展等方面发挥不可替代的作用。
2. chapter 2: 数学基础 (Mathematical Foundations)
2.1 数论基础 (Number Theory Basics)
2.1.1 整数与模运算 (Integers and Modular Arithmetic)
整数 (integers) 是数学中最基本的概念之一,密码学中的许多算法都建立在整数的性质之上。模运算 (modular arithmetic) 是一种在整数集合上进行的算术运算系统,它在密码学中扮演着至关重要的角色。
① 整数 (Integers):
整数集合 \(\mathbb{Z}\) 包括所有正整数、负整数和零,即 \(\mathbb{Z} = \{..., -2, -1, 0, 1, 2, ...\}\)。
⚝ 整数具有加法、减法和乘法运算的封闭性,即两个整数的和、差或积仍然是整数。
⚝ 除法在整数集合中不总是封闭的,例如,\(5 \div 2\) 不是整数。
② 整除性 (Divisibility):
如果整数 \(a\) 可以被整数 \(b\) 整除,且余数为零,则称 \(b\) 整除 \(a\),记作 \(b \mid a\)。
⚝ 例如,\(3 \mid 12\),因为 \(12 \div 3 = 4\) 余数为 0。
⚝ 如果 \(b\) 不整除 \(a\),则记作 \(b \nmid a\)。
③ 模运算 (Modular Arithmetic):
模运算考虑的是整数除以一个正整数 \(n\) 后的余数。正整数 \(n\) 称为模数 (modulus)。
⚝ 对于整数 \(a\) 和正整数 \(n\),\(a \pmod{n}\) 表示 \(a\) 除以 \(n\) 的余数。余数的范围是 \(0, 1, 2, ..., n-1\)。
⚝ 例如,\(17 \pmod{5} = 2\),因为 \(17 = 3 \times 5 + 2\)。
⚝ 如果 \(a \pmod{n} = b \pmod{n}\),则称 \(a\) 和 \(b\) 模 \(n\) 同余 (congruent modulo \(n\)),记作 \(a \equiv b \pmod{n}\)。
⚝ 例如,\(17 \equiv 2 \pmod{5}\)。
④ 模运算的性质 (Properties of Modular Arithmetic):
模运算具有许多与普通算术运算相似的性质,这些性质在密码学中非常有用。
⚝ 同余关系是一种等价关系 (Congruence relation is an equivalence relation):
▮▮▮▮ⓐ 自反性 (Reflexivity):\(a \equiv a \pmod{n}\)。
▮▮▮▮ⓑ 对称性 (Symmetry):如果 \(a \equiv b \pmod{n}\),则 \(b \equiv a \pmod{n}\)。
▮▮▮▮ⓒ 传递性 (Transitivity):如果 \(a \equiv b \pmod{n}\) 且 \(b \equiv c \pmod{n}\),则 \(a \equiv c \pmod{n}\)。
⚝ 模运算与加法、减法和乘法的兼容性 (Compatibility of modular arithmetic with addition, subtraction, and multiplication):
▮▮▮▮如果 \(a \equiv b \pmod{n}\) 且 \(c \equiv d \pmod{n}\),则:
▮▮▮▮ⓐ \(a + c \equiv b + d \pmod{n}\)
▮▮▮▮ⓑ \(a - c \equiv b - d \pmod{n}\)
▮▮▮▮ⓒ \(a \times c \equiv b \times d \pmod{n}\)
⚝ 模逆元 (Modular Inverse):
▮▮▮▮如果存在整数 \(x\) 使得 \(ax \equiv 1 \pmod{n}\),则称 \(x\) 是 \(a\) 模 \(n\) 的逆元 (inverse)。
▮▮▮▮模逆元存在的条件是 \(a\) 和 \(n\) 互素 (coprime),即它们的最大公约数 (greatest common divisor, GCD) 为 1,\(\gcd(a, n) = 1\)。
▮▮▮▮可以使用扩展欧几里得算法 (Extended Euclidean Algorithm) 来计算模逆元。
模运算是许多密码学算法的基础,例如 RSA 算法和 Diffie-Hellman 密钥交换算法都大量使用了模运算。理解整数和模运算的性质是学习密码学的先决条件。
2.1.2 群、环、域 (Groups, Rings, Fields)
群 (groups)、环 (rings) 和域 (fields) 是抽象代数 (abstract algebra) 中的基本概念,它们为密码学提供了理论基础。密码学中使用的许多密码算法和协议都建立在这些代数结构之上。
① 群 (Group):
群是一个集合 \(G\) 以及定义在 \(G\) 上的二元运算 \(*\),满足以下四个公理:
⚝ 封闭性 (Closure):对于任意 \(a, b \in G\),\(a * b \in G\)。
⚝ 结合律 (Associativity):对于任意 \(a, b, c \in G\),\((a * b) * c = a * (b * c)\)。
⚝ 单位元 (Identity Element):存在一个元素 \(e \in G\),使得对于任意 \(a \in G\),\(e * a = a * e = a\)。单位元通常记为 \(e\) 或 \(1\)(在乘法群中)或 \(0\)(在加法群中)。
⚝ 逆元 (Inverse Element):对于任意 \(a \in G\),存在一个元素 \(a^{-1} \in G\),使得 \(a * a^{-1} = a^{-1} * a = e\)。逆元通常记为 \(a^{-1}\)(在乘法群中)或 \(-a\)(在加法群中)。
如果群 \(G\) 还满足交换律 (commutativity),即对于任意 \(a, b \in G\),\(a * b = b * a\),则称 \(G\) 为阿贝尔群 (Abelian group) 或交换群 (commutative group)。
常见的群的例子 (Examples of Groups):
⚝ 整数加法群 (\(\mathbb{Z}, +\)): 整数集合 \(\mathbb{Z}\) 在加法运算下构成一个阿贝尔群。单位元是 0,元素 \(a\) 的逆元是 \(-a\)。
⚝ 实数乘法群 (\(\mathbb{R} \setminus \{0\}, \times\)): 非零实数集合在乘法运算下构成一个阿贝尔群。单位元是 1,元素 \(a\) 的逆元是 \(1/a\)。
⚝ 模 \(n\) 剩余类加法群 (\(\mathbb{Z}_n, +\)): 模 \(n\) 剩余类集合 \(\mathbb{Z}_n = \{0, 1, 2, ..., n-1\}\) 在模 \(n\) 加法运算下构成一个阿贝尔群。单位元是 0,元素 \(a\) 的逆元是 \(-a \pmod{n}\)。
⚝ 模 \(n\) 既约剩余类乘法群 (\(\mathbb{Z}_n^*, \times\)): 与 \(n\) 互素的模 \(n\) 剩余类集合 \(\mathbb{Z}_n^*\) 在模 \(n\) 乘法运算下构成一个阿贝尔群。单位元是 1,元素 \(a\) 的逆元是 \(a^{-1} \pmod{n}\) (模逆元)。例如,\(\mathbb{Z}_{10}^* = \{1, 3, 7, 9\}\)。
② 环 (Ring):
环是一个集合 \(R\) 以及定义在 \(R\) 上的两个二元运算,加法 \(+\) 和乘法 \(\times\),满足以下公理:
⚝ \((R, +)\) 是一个阿贝尔群 (加法群)。
⚝ \((R, \times)\) 满足封闭性和结合律 (乘法半群)。
⚝ 乘法对加法满足分配律 (Distributive Laws):对于任意 \(a, b, c \in R\),\(a \times (b + c) = (a \times b) + (a \times c)\) 和 \((b + c) \times a = (b \times a) + (c \times a)\)。
如果环 \(R\) 的乘法还满足交换律,则称 \(R\) 为交换环 (commutative ring)。如果环 \(R\) 存在乘法单位元 (multiplicative identity element) \(1\),使得对于任意 \(a \in R\),\(1 \times a = a \times 1 = a\),则称 \(R\) 为含幺环 (ring with unity)。
常见的环的例子 (Examples of Rings):
⚝ 整数环 (\(\mathbb{Z}, +, \times\)): 整数集合 \(\mathbb{Z}\) 在加法和乘法运算下构成一个交换含幺环。
⚝ 模 \(n\) 剩余类环 (\(\mathbb{Z}_n, +, \times\)): 模 \(n\) 剩余类集合 \(\mathbb{Z}_n\) 在模 \(n\) 加法和模 \(n\) 乘法运算下构成一个交换含幺环。
⚝ 多项式环 \(R[x]\): 系数在环 \(R\) 中的多项式集合构成一个环。
③ 域 (Field):
域是一个集合 \(F\) 以及定义在 \(F\) 上的两个二元运算,加法 \(+\) 和乘法 \(\times\),满足以下公理:
⚝ \((F, +, \times)\) 是一个交换含幺环。
⚝ 对于 \(F\) 中的每个非零元素,都存在乘法逆元 (multiplicative inverse)。即 \((F \setminus \{0\}, \times)\) 是一个阿贝尔群 (乘法群)。
换句话说,域是一个可以进行加、减、乘、除 (除以非零元素) 运算的代数结构。
常见的域的例子 (Examples of Fields):
⚝ 有理数域 (\(\mathbb{Q}, +, \times\)): 有理数集合 \(\mathbb{Q}\) 在加法和乘法运算下构成一个域。
⚝ 实数域 (\(\mathbb{R}, +, \times\)): 实数集合 \(\mathbb{R}\) 在加法和乘法运算下构成一个域。
⚝ 复数域 (\(\mathbb{C}, +, \times\)): 复数集合 \(\mathbb{C}\) 在加法和乘法运算下构成一个域。
⚝ 有限域 (Finite Field) 或伽罗瓦域 (Galois Field) \(GF(p)\) 或 \(\mathbb{F}_p\): 当 \(p\) 是素数时,模 \(p\) 剩余类环 \(\mathbb{Z}_p\) 是一个域。有限域在密码学中非常重要。
群、环、域是构建现代密码学算法的基石。例如,分组密码 (block ciphers) 和流密码 (stream ciphers) 的设计和分析涉及到有限域的理论;公钥密码学 (public-key cryptography) 如 RSA 和椭圆曲线密码学 (Elliptic Curve Cryptography, ECC) 依赖于群论和数论的知识。
2.1.3 欧几里得算法与扩展欧几里得算法 (Euclidean Algorithm and Extended Euclidean Algorithm)
欧几里得算法 (Euclidean Algorithm) 和扩展欧几里得算法 (Extended Euclidean Algorithm) 是数论中两个非常重要的算法,它们用于计算两个整数的最大公约数 (GCD) 以及求解模线性方程。在密码学中,这两个算法有着广泛的应用,尤其是在密钥生成和模逆元计算等方面。
① 欧几里得算法 (Euclidean Algorithm):
欧几里得算法用于计算两个整数 \(a\) 和 \(b\) 的最大公约数 \(\gcd(a, b)\)。其基本思想是利用以下性质:
⚝ \(\gcd(a, b) = \gcd(b, a \pmod{b})\) 如果 \(b \neq 0\)
⚝ \(\gcd(a, 0) = |a|\)
算法步骤如下 (假设 \(a \ge b \ge 0\)):
1. 如果 \(b = 0\),则 \(\gcd(a, b) = a\),算法结束。
2. 否则,计算 \(r = a \pmod{b}\)。
3. 令 \(a = b\),\(b = r\),返回步骤 1。
示例:计算 \(\gcd(48, 18)\)
1. \(\gcd(48, 18) = \gcd(18, 48 \pmod{18}) = \gcd(18, 12)\)
2. \(\gcd(18, 12) = \gcd(12, 18 \pmod{12}) = \gcd(12, 6)\)
3. \(\gcd(12, 6) = \gcd(6, 12 \pmod{6}) = \gcd(6, 0)\)
4. \(\gcd(6, 0) = 6\)
因此,\(\gcd(48, 18) = 6\)。
② 扩展欧几里得算法 (Extended Euclidean Algorithm):
扩展欧几里得算法不仅可以计算 \(\gcd(a, b)\),还可以找到整数 \(x\) 和 \(y\),使得满足贝祖等式 (Bézout's identity):
\[ ax + by = \gcd(a, b) \]
当 \(\gcd(a, b) = 1\) 时,即 \(a\) 和 \(b\) 互素时,贝祖等式变为 \(ax + by = 1\)。此时,\(x\) 是 \(a\) 模 \(b\) 的逆元,\(y\) 是 \(b\) 模 \(a\) 的逆元。这对于计算模逆元非常重要。
扩展欧几里得算法的递归过程如下:
假设要计算 \(\gcd(a, b)\) 以及 \(x\) 和 \(y\) 满足 \(ax + by = \gcd(a, b)\)。
1. 基准情况:如果 \(b = 0\),则 \(\gcd(a, b) = a\)。此时,取 \(x = 1\),\(y = 0\),则 \(a \times 1 + 0 \times 0 = a = \gcd(a, 0)\)。
2. 递归步骤:如果 \(b \neq 0\),计算 \(r = a \pmod{b}\),然后递归调用扩展欧几里得算法计算 \(\gcd(b, r)\),并得到 \(x'\) 和 \(y'\) 使得 \(bx' + ry' = \gcd(b, r)\)。
由于 \(r = a \pmod{b} = a - \lfloor \frac{a}{b} \rfloor b\),代入上式得到:
\[ bx' + (a - \lfloor \frac{a}{b} \rfloor b)y' = \gcd(b, r) \]
\[ ay' + bx' - \lfloor \frac{a}{b} \rfloor by' = \gcd(b, r) \]
\[ ay' + b(x' - \lfloor \frac{a}{b} \rfloor y') = \gcd(b, r) \]
由于 \(\gcd(a, b) = \gcd(b, r)\),所以 \(\gcd(a, b) = ay' + b(x' - \lfloor \frac{a}{b} \rfloor y')\)。
因此,可以取 \(x = y'\) 和 \(y = x' - \lfloor \frac{a}{b} \rfloor y'\)。
算法步骤:
输入:整数 \(a\) 和 \(b\)。
输出:\(\gcd(a, b)\) 以及满足 \(ax + by = \gcd(a, b)\) 的整数 \(x\) 和 \(y\)。
1
function extended_gcd(a, b)
2
if b == 0 then
3
return a, 1, 0 // gcd(a, 0) = a, ax + by = a => x = 1, y = 0
4
end if
5
gcd, x1, y1 = extended_gcd(b, a mod b)
6
x = y1
7
y = x1 - floor(a / b) * y1
8
return gcd, x, y
9
end function
示例:计算 \(\gcd(48, 18)\) 以及 \(x\) 和 \(y\) 满足 \(48x + 18y = \gcd(48, 18)\)。
1. extended_gcd(48, 18)
:
▮▮▮▮⚝ extended_gcd(18, 48 mod 18 = 12)
返回 \(\gcd(18, 12) = 6\),\(x_1 = -1\),\(y_1 = 2\) (\(18 \times (-1) + 12 \times 2 = 6\))
▮▮▮▮⚝ \(x = y_1 = 2\)
▮▮▮▮⚝ \(y = x_1 - \lfloor 48 / 18 \rfloor \times y_1 = -1 - 2 \times 2 = -5\)
▮▮▮▮⚝ 返回 \(\gcd = 6\),\(x = 2\),\(y = -5\)
▮▮▮▮⚝ 验证:\(48 \times 2 + 18 \times (-5) = 96 - 90 = 6\)
扩展欧几里得算法在密码学中主要用于:
⚝ 计算模逆元:当 \(\gcd(a, n) = 1\) 时,扩展欧几里得算法可以找到 \(x\) 和 \(y\) 使得 \(ax + ny = 1\)。此时,\(ax \equiv 1 \pmod{n}\),所以 \(x\) 是 \(a\) 模 \(n\) 的逆元。在 RSA 算法的密钥生成过程中,需要计算模逆元。
⚝ 求解线性同余方程:形如 \(ax \equiv b \pmod{n}\) 的方程可以使用扩展欧几里得算法求解。
2.1.4 中国剩余定理 (Chinese Remainder Theorem)
中国剩余定理 (Chinese Remainder Theorem, CRT) 是数论中的一个重要定理,它描述了如何求解一组同余方程组。在密码学中,CRT 在 RSA 算法的加速解密和一些秘密共享方案中有着应用。
定理描述:
设 \(n_1, n_2, ..., n_k\) 是两两互素 (pairwise coprime) 的正整数,即对于任意 \(i \neq j\),\(\gcd(n_i, n_j) = 1\)。给定整数 \(a_1, a_2, ..., a_k\),则同余方程组
\[ \begin{cases} x \equiv a_1 \pmod{n_1} \\ x \equiv a_2 \pmod{n_2} \\ ... \\ x \equiv a_k \pmod{n_k} \end{cases} \]
模 \(N = n_1 n_2 ... n_k\) 有唯一解。
解法:
1. 计算 \(N = n_1 n_2 ... n_k\)。
2. 对于每个 \(i = 1, 2, ..., k\),计算 \(N_i = \frac{N}{n_i} = n_1 ... n_{i-1} n_{i+1} ... n_k\)。
3. 对于每个 \(i = 1, 2, ..., k\),找到 \(N_i\) 模 \(n_i\) 的逆元 \(M_i\),即解同余方程 \(N_i M_i \equiv 1 \pmod{n_i}\)。可以使用扩展欧几里得算法计算 \(M_i\)。
4. 方程组的解为 \(x \equiv \sum_{i=1}^{k} a_i N_i M_i \pmod{N}\)。
示例:求解同余方程组
\[ \begin{cases} x \equiv 2 \pmod{3} \\ x \equiv 3 \pmod{5} \\ x \equiv 2 \pmod{7} \end{cases} \]
1. \(n_1 = 3\),\(n_2 = 5\),\(n_3 = 7\)。\(N = n_1 n_2 n_3 = 3 \times 5 \times 7 = 105\)。
2. \(N_1 = \frac{N}{n_1} = \frac{105}{3} = 35\),\(N_2 = \frac{N}{n_2} = \frac{105}{5} = 21\),\(N_3 = \frac{N}{n_3} = \frac{105}{7} = 15\)。
3. 计算逆元:
▮▮▮▮⚝ \(N_1 M_1 \equiv 1 \pmod{n_1} \Rightarrow 35 M_1 \equiv 1 \pmod{3} \Rightarrow 2 M_1 \equiv 1 \pmod{3}\)。\(M_1 = 2\) 是一个解,因为 \(2 \times 2 = 4 \equiv 1 \pmod{3}\)。
▮▮▮▮⚝ \(N_2 M_2 \equiv 1 \pmod{n_2} \Rightarrow 21 M_2 \equiv 1 \pmod{5} \Rightarrow M_2 \equiv 1 \pmod{5}\)。\(M_2 = 1\) 是一个解,因为 \(21 \times 1 = 21 \equiv 1 \pmod{5}\)。
▮▮▮▮⚝ \(N_3 M_3 \equiv 1 \pmod{n_3} \Rightarrow 15 M_3 \equiv 1 \pmod{7} \Rightarrow M_3 \equiv 1 \pmod{7}\)。\(M_3 = 1\) 是一个解,因为 \(15 \times 1 = 15 \equiv 1 \pmod{7}\)。
4. 解为 \(x \equiv \sum_{i=1}^{3} a_i N_i M_i = a_1 N_1 M_1 + a_2 N_2 M_2 + a_3 N_3 M_3 = 2 \times 35 \times 2 + 3 \times 21 \times 1 + 2 \times 15 \times 1 = 140 + 63 + 30 = 233\)。
5. \(x \equiv 233 \pmod{105}\)。\(233 \pmod{105} = 23\)。所以 \(x \equiv 23 \pmod{105}\)。
6. 验证:
▮▮▮▮⚝ \(23 \pmod{3} = 2\)
▮▮▮▮⚝ \(23 \pmod{5} = 3\)
▮▮▮▮⚝ \(23 \pmod{7} = 2\)
中国剩余定理在密码学中的应用:
⚝ RSA 算法加速:在 RSA 解密时,可以使用 CRT 加速计算 \(m = c^d \pmod{N}\),其中 \(N = pq\) 是两个大素数的乘积。可以分别计算 \(m_p = c^d \pmod{p}\) 和 \(m_q = c^d \pmod{q}\),然后使用 CRT 合并 \(m_p\) 和 \(m_q\) 得到 \(m \pmod{N}\)。由于 \(p\) 和 \(q\) 比 \(N\) 小得多,计算 \(c^d \pmod{p}\) 和 \(c^d \pmod{q}\) 比直接计算 \(c^d \pmod{N}\) 更快。
⚝ 秘密共享 (Secret Sharing):CRT 可以用于构造一些秘密共享方案,将秘密分成多个部分,只有当足够多的部分组合起来时才能恢复秘密。
2.1.5 素数与素性检验 (Prime Numbers and Primality Test)
素数 (prime numbers) 是指大于 1 且只能被 1 和自身整除的正整数。素数在数论和密码学中都占有核心地位。许多公钥密码算法,如 RSA 和 Diffie-Hellman 密钥交换,都依赖于大素数的性质。素性检验 (primality test) 是判断一个给定的整数是否为素数的过程。
① 素数的定义 (Definition of Prime Numbers):
一个大于 1 的整数 \(p\) 是素数,如果它除了 1 和 \(p\) 之外没有正因子。否则,称 \(p\) 为合数 (composite number)。
⚝ 例如,2, 3, 5, 7, 11, 13, ... 是素数。4, 6, 8, 9, 10, 12, ... 是合数。
⚝ 1 既不是素数也不是合数。2 是最小的素数,也是唯一的偶素数。
② 素数的性质 (Properties of Prime Numbers):
⚝ 算术基本定理 (Fundamental Theorem of Arithmetic):任何大于 1 的整数都可以唯一地分解为素数的乘积,不考虑素因子的顺序。例如,\(12 = 2^2 \times 3\),\(30 = 2 \times 3 \times 5\)。
⚝ 素数有无穷多个 (Infinitude of Primes):素数有无穷多个,这是欧几里得在公元前 300 年左右证明的。
⚝ 素数定理 (Prime Number Theorem):素数定理描述了素数在整数中的分布密度。它指出,当 \(x\) 趋于无穷大时,小于或等于 \(x\) 的素数的个数 \(\pi(x)\) 近似于 \(\frac{x}{\ln(x)}\)。
③ 素性检验 (Primality Test):
素性检验算法用于判断一个给定的整数 \(n\) 是否为素数。对于小整数,可以使用试除法 (trial division) 进行检验,即尝试用小于 \(\sqrt{n}\) 的所有素数去除 \(n\),如果都不能整除,则 \(n\) 是素数。但对于大整数,试除法效率太低。因此,需要更高效的素性检验算法。
常见的素性检验算法:
⚝ 试除法 (Trial Division):
▮▮▮▮对于给定的整数 \(n\),尝试用从 2 到 \(\sqrt{n}\) 的所有整数去除 \(n\)。如果存在能整除 \(n\) 的整数,则 \(n\) 是合数;否则,\(n\) 是素数。
▮▮▮▮试除法的复杂度为 \(O(\sqrt{n})\),对于小整数适用,但对于大整数效率很低。
⚝ 费马素性检验 (Fermat Primality Test):
▮▮▮▮基于费马小定理 (Fermat's Little Theorem):如果 \(p\) 是素数,且 \(a\) 是任何与 \(p\) 互素的整数,则 \(a^{p-1} \equiv 1 \pmod{p}\)。
▮▮▮▮费马素性检验算法:
▮▮▮▮ⓐ 随机选择一个整数 \(a\),\(1 < a < n\)。
▮▮▮▮ⓑ 计算 \(a^{n-1} \pmod{n}\)。
▮▮▮▮ⓒ 如果 \(a^{n-1} \not\equiv 1 \pmod{n}\),则 \(n\) 是合数。
▮▮▮▮ⓓ 如果 \(a^{n-1} \equiv 1 \pmod{n}\),则 \(n\) 很可能是素数(但可能是伪素数)。
▮▮▮▮费马素性检验是一种概率性算法,可能会将合数误判为素数(伪素数,Carmichael 数)。为了提高准确性,可以多次随机选择不同的基 \(a\) 进行检验。
⚝ 米勒-拉宾素性检验 (Miller-Rabin Primality Test):
▮▮▮▮米勒-拉宾素性检验是一种更强大的概率性素性检验算法,它在费马素性检验的基础上进行了改进,降低了误判率。
▮▮▮▮算法步骤:
▮▮▮▮ⓐ 将 \(n-1\) 写成 \(2^s \cdot d\) 的形式,其中 \(d\) 是奇数,\(s \ge 0\)。
▮▮▮▮ⓑ 随机选择一个整数 \(a\),\(1 < a < n\)。
▮▮▮▮ⓒ 计算 \(x = a^d \pmod{n}\)。
▮▮▮▮ⓓ 如果 \(x \equiv 1 \pmod{n}\) 或 \(x \equiv n-1 \pmod{n}\),则 \(n\) 很可能是素数,进行下一步迭代。
▮▮▮▮ⓔ 否则,重复 \(r\) 从 1 到 \(s-1\):计算 \(x = x^2 \pmod{n}\)。如果 \(x \equiv n-1 \pmod{n}\),则 \(n\) 很可能是素数,进行下一步迭代。
▮▮▮▮ⓕ 如果经过 \(s\) 次平方后,\(x\) 仍然不等于 \(n-1\),则 \(n\) 是合数。
▮▮▮▮米勒-拉宾素性检验的错误概率非常低,通过多次迭代可以进一步降低错误概率。在实际应用中,米勒-拉宾素性检验被广泛使用。
⚝ 确定性素性检验算法:
▮▮▮▮例如 AKS 素性检验算法 (Agrawal–Kayal–Saxena primality test) 是一种确定性素性检验算法,可以在多项式时间内判断一个数是否为素数。但 AKS 算法在实际应用中效率不如概率性算法。
在密码学中,通常使用概率性素性检验算法(如米勒-拉宾素性检验)来生成大素数。生成的“素数”实际上是伪素数,但通过足够多次的检验,其为合数的概率可以忽略不计。
2.2 代数结构 (Algebraic Structures)
2.2.1 有限域 (Finite Fields)
有限域 (finite fields),也称为伽罗瓦域 (Galois fields),是仅含有有限个元素的域。有限域在密码学中扮演着极其重要的角色,许多现代密码算法,如 AES、椭圆曲线密码学和一些后量子密码算法,都建立在有限域的理论之上。
① 有限域的存在性与唯一性 (Existence and Uniqueness of Finite Fields):
⚝ 对于每个素数 \(p\) 和正整数 \(n\),都存在一个阶 (order) 为 \(p^n\) 的有限域,记作 \(GF(p^n)\) 或 \(\mathbb{F}_{p^n}\)。
⚝ 对于给定的阶 \(p^n\),有限域 \(GF(p^n)\) 在同构意义下是唯一的。当 \(n = 1\) 时,\(GF(p) = \mathbb{Z}_p\),即模 \(p\) 剩余类域。
② 有限域的构造 (Construction of Finite Fields):
⚝ 素数域 \(GF(p)\):当 \(p\) 是素数时,模 \(p\) 剩余类集合 \(\mathbb{Z}_p = \{0, 1, 2, ..., p-1\}\) 在模 \(p\) 加法和模 \(p\) 乘法运算下构成一个有限域 \(GF(p)\)。
⚝ 扩域 \(GF(p^n)\):当 \(n > 1\) 时,阶为 \(p^n\) 的有限域 \(GF(p^n)\) 是素数域 \(GF(p)\) 的扩域。可以通过多项式环 (polynomial ring) 构造扩域。
▮▮▮▮ⓐ 选择一个在 \(GF(p)\) 上不可约 (irreducible) 的 \(n\) 次多项式 \(f(x)\)。
▮▮▮▮ⓑ 构造商环 \(GF(p)[x] / (f(x))\),其中 \((f(x))\) 是由 \(f(x)\) 生成的理想 (ideal)。
▮▮▮▮ⓒ 商环 \(GF(p)[x] / (f(x))\) 就是有限域 \(GF(p^n)\)。它的元素可以表示为次数小于 \(n\) 的多项式,系数在 \(GF(p)\) 中。
▮▮▮▮ⓓ 域中的加法和乘法运算是多项式加法和乘法,结果再模 \(f(x)\) 取余。
示例:构造有限域 \(GF(2^2) = GF(4)\)。
1. 素数域为 \(GF(2) = \mathbb{Z}_2 = \{0, 1\}\)。
2. 选择 \(GF(2)\) 上的一个 2 次不可约多项式,例如 \(f(x) = x^2 + x + 1\)。
3. \(GF(4) = GF(2)[x] / (x^2 + x + 1)\)。\(GF(4)\) 的元素可以表示为 \(ax + b\),其中 \(a, b \in GF(2) = \{0, 1\}\)。
4. \(GF(4) = \{0, 1, x, x+1\}\)。
5. 加法运算:例如,\((x+1) + x = 2x + 1 = 1\) (因为 \(2 \equiv 0 \pmod{2}\))。
6. 乘法运算:例如,\((x+1) \times x = x^2 + x\)。由于 \(x^2 + x + 1 = 0\) 在 \(GF(4)\) 中,所以 \(x^2 = -x - 1 = x + 1\) (因为 \(-1 \equiv 1 \pmod{2}\))。因此,\((x+1) \times x = x^2 + x = (x+1) + x = 2x + 1 = 1\)。
③ 有限域的性质 (Properties of Finite Fields):
⚝ 特征 (Characteristic):有限域 \(GF(p^n)\) 的特征为 \(p\)。这意味着在域中,\(p\) 个单位元 \(1\) 相加等于零,即 \(\underbrace{1 + 1 + ... + 1}_{p \text{ times}} = 0\)。
⚝ 乘法群 (Multiplicative Group):有限域 \(GF(p^n)\) 的非零元素在乘法运算下构成一个循环群 (cyclic group),记作 \(GF(p^n)^*\)。循环群意味着存在一个生成元 (generator) \(g\),使得 \(GF(p^n)^* = \{g^0, g^1, g^2, ..., g^{p^n-2}\}\)。
⚝ 弗罗贝尼乌斯自同构 (Frobenius Automorphism):在特征为 \(p\) 的域 \(F\) 中,映射 \(\phi: F \to F\),\(\phi(a) = a^p\) 是一个域自同构 (field automorphism),称为弗罗贝尼乌斯自同构。
④ 有限域在密码学中的应用 (Applications of Finite Fields in Cryptography):
⚝ AES 算法:高级加密标准 (AES) 使用有限域 \(GF(2^8)\) 进行 S-盒 (S-box) 的构造和 MixColumns 变换。
⚝ 椭圆曲线密码学 ECC:椭圆曲线密码学是在有限域上定义的椭圆曲线上建立的密码系统。常用的有限域包括 \(GF(p)\) (素数域) 和 \(GF(2^m)\) (二元域)。
⚝ 编码密码学 (Code-based Cryptography):一些后量子密码算法,如 McEliece 密码系统,使用了基于纠错码的密码方案,其中使用了有限域的理论。
⚝ 哈希函数 (Hash Functions) 和 消息认证码 MAC:一些哈希函数和 MAC 算法的设计也使用了有限域的运算。
2.2.2 多项式环 (Polynomial Rings)
多项式环 (polynomial rings) 是由系数在一个环 \(R\) 中的多项式构成的环。多项式环在抽象代数和密码学中都有重要的应用,特别是在有限域的构造和编码理论中。
① 多项式的定义 (Definition of Polynomials):
设 \(R\) 是一个环。一个系数在 \(R\) 中的多项式 \(f(x)\) 可以表示为:
\[ f(x) = a_n x^n + a_{n-1} x^{n-1} + ... + a_1 x + a_0 \]
其中 \(a_i \in R\) 是多项式的系数,\(x\) 是变量,\(n\) 是多项式的次数 (degree),如果 \(a_n \neq 0\)。
② 多项式环 \(R[x]\) (Polynomial Ring \(R[x]\)):
系数在环 \(R\) 中的所有多项式构成的集合,记作 \(R[x]\)。在 \(R[x]\) 上定义加法和乘法运算,使其成为一个环。
⚝ 多项式加法:
如果 \(f(x) = \sum_{i=0}^{n} a_i x^i\) 和 \(g(x) = \sum_{i=0}^{m} b_i x^i\),则
\[ (f+g)(x) = \sum_{i=0}^{\max(n, m)} (a_i + b_i) x^i \]
其中,如果 \(i > n\),则 \(a_i = 0\),如果 \(i > m\),则 \(b_i = 0\)。
⚝ 多项式乘法:
\[ (f \cdot g)(x) = \sum_{k=0}^{n+m} c_k x^k \]
其中 \(c_k = \sum_{i+j=k} a_i b_j = \sum_{i=0}^{k} a_i b_{k-i}\)。
如果 \(R\) 是交换环,则 \(R[x]\) 也是交换环。如果 \(R\) 是含幺环,则 \(R[x]\) 也是含幺环,单位元是常数多项式 1。
③ 多项式环的性质 (Properties of Polynomial Rings):
⚝ 整环 (Integral Domain):如果 \(R\) 是整环,则 \(R[x]\) 也是整环。整环是指没有非零零因子的交换环。
⚝ 唯一分解环 (Unique Factorization Domain, UFD):如果 \(R\) 是域,则 \(R[x]\) 是唯一分解环。这意味着 \(R[x]\) 中的每个非零多项式都可以唯一地分解为不可约多项式的乘积。
⚝ 欧几里得环 (Euclidean Domain):如果 \(F\) 是域,则 \(F[x]\) 是欧几里得环。这意味着在 \(F[x]\) 中可以进行多项式除法,类似于整数的欧几里得算法。
④ 多项式环在密码学中的应用 (Applications of Polynomial Rings in Cryptography):
⚝ 有限域的构造:如前所述,有限域 \(GF(p^n)\) 可以通过在素数域 \(GF(p)\) 上的多项式环 \(GF(p)[x]\) 中取商环 \(GF(p)[x] / (f(x))\) 构造,其中 \(f(x)\) 是 \(GF(p)\) 上的 \(n\) 次不可约多项式。
⚝ 编码理论 (Coding Theory):多项式环在纠错码 (error-correcting codes) 的构造和分析中起着重要作用,例如循环码 (cyclic codes) 和 BCH 码 (Bose-Chaudhuri-Hocquenghem codes)。编码理论与密码学密切相关,特别是在数据完整性和认证方面。
⚝ 格密码学 (Lattice-based Cryptography):一些后量子密码算法,如 NTRU (Nth Degree Truncated Polynomial Ring Units),使用了多项式环的性质。NTRU 密码系统基于在多项式环中求解格问题的困难性。
⚝ 流密码 (Stream Ciphers):线性反馈移位寄存器 (Linear Feedback Shift Register, LFSR) 生成的伪随机序列可以用多项式环的理论进行分析。
2.3 概率论基础 (Probability Theory Basics)
2.3.1 概率与条件概率 (Probability and Conditional Probability)
概率论 (probability theory) 是研究随机现象规律的数学分支。在密码学中,概率论被广泛应用于分析密码算法的安全性,例如评估密钥猜测的成功概率、分析密码算法的抗攻击能力等。
① 概率的基本概念 (Basic Concepts of Probability):
⚝ 样本空间 (Sample Space) \(\Omega\): 随机实验所有可能结果的集合。
⚝ 事件 (Event) \(A\): 样本空间 \(\Omega\) 的子集,即某些结果的集合。
⚝ 概率 (Probability) \(P(A)\): 事件 \(A\) 发生的可能性大小,满足以下公理:
▮▮▮▮ⓐ 非负性 (Non-negativity):对于任意事件 \(A\),\(P(A) \ge 0\)。
▮▮▮▮ⓑ 归一性 (Normalization):样本空间 \(\Omega\) 的概率为 1,\(P(\Omega) = 1\)。
▮▮▮▮ⓒ 可加性 (Additivity):如果 \(A_1, A_2, ...\) 是一系列互不相容 (mutually exclusive) 的事件(即 \(A_i \cap A_j = \emptyset\) 对于 \(i \neq j\)),则 \(P(\bigcup_{i=1}^{\infty} A_i) = \sum_{i=1}^{\infty} P(A_i)\)。
对于有限样本空间,如果所有基本结果是等可能发生的,则事件 \(A\) 的概率可以定义为:
\[ P(A) = \frac{\text{事件 } A \text{ 包含的结果数}}{\text{样本空间 } \Omega \text{ 包含的结果数}} \]
② 条件概率 (Conditional Probability):
条件概率是指在已知事件 \(B\) 发生的条件下,事件 \(A\) 发生的概率,记作 \(P(A|B)\)。
⚝ 定义:如果 \(P(B) > 0\),则事件 \(A\) 在事件 \(B\) 条件下的条件概率定义为:
\[ P(A|B) = \frac{P(A \cap B)}{P(B)} \]
⚝ 乘法公式 (Multiplication Rule):从条件概率的定义可以得到乘法公式:
\[ P(A \cap B) = P(A|B) P(B) = P(B|A) P(A) \]
对于多个事件 \(A_1, A_2, ..., A_n\),乘法公式可以推广为:
\[ P(A_1 \cap A_2 \cap ... \cap A_n) = P(A_1) P(A_2|A_1) P(A_3|A_1 \cap A_2) ... P(A_n|A_1 \cap A_2 \cap ... \cap A_{n-1}) \]
③ 全概率公式与贝叶斯公式 (Law of Total Probability and Bayes' Theorem):
⚝ 全概率公式 (Law of Total Probability):设 \(B_1, B_2, ..., B_n\) 是样本空间 \(\Omega\) 的一个划分 (partition),即 \(B_1, B_2, ..., B_n\) 互不相容且 \(\bigcup_{i=1}^{n} B_i = \Omega\),且 \(P(B_i) > 0\) 对于所有 \(i\)。则对于任意事件 \(A\),有:
\[ P(A) = \sum_{i=1}^{n} P(A \cap B_i) = \sum_{i=1}^{n} P(A|B_i) P(B_i) \]
⚝ 贝叶斯公式 (Bayes' Theorem):在全概率公式的条件下,如果 \(P(A) > 0\),则对于任意 \(j = 1, 2, ..., n\),有:
\[ P(B_j|A) = \frac{P(A|B_j) P(B_j)}{P(A)} = \frac{P(A|B_j) P(B_j)}{\sum_{i=1}^{n} P(A|B_i) P(B_i)} \]
贝叶斯公式描述了在已知结果 \(A\) 发生的条件下,导致结果 \(A\) 发生的各种原因 \(B_j\) 的概率。
④ 概率在密码学中的应用 (Applications of Probability in Cryptography):
⚝ 密钥空间大小 (Key Space Size):评估密钥空间大小,例如,如果密钥长度为 \(n\) 比特,则密钥空间大小为 \(2^n\)。暴力破解攻击 (brute-force attack) 的成功概率与密钥空间大小有关。
⚝ 碰撞概率 (Collision Probability):在哈希函数中,需要分析碰撞 (collision) 发生的概率。生日悖论 (birthday paradox) 描述了哈希函数输出碰撞的概率。
⚝ 错误率分析 (Error Rate Analysis):在某些密码协议中,需要分析错误发生的概率,例如在噪声信道上的密钥协商协议。
⚝ 密码分析 (Cryptanalysis):密码分析中经常使用统计分析方法,例如频率分析 (frequency analysis) 和差分密码分析 (differential cryptanalysis),这些方法都基于概率论的原理。
⚝ 随机数生成 (Random Number Generation):密码学中需要高质量的随机数,概率论用于评估随机数生成器的随机性。
2.3.2 随机变量与概率分布 (Random Variables and Probability Distributions)
随机变量 (random variables) 是将随机实验的结果数值化的工具,概率分布 (probability distributions) 描述了随机变量取值的概率规律。在密码学中,随机变量和概率分布用于建模和分析密码系统的随机性行为。
① 随机变量的定义 (Definition of Random Variables):
随机变量 \(X\) 是一个定义在样本空间 \(\Omega\) 上的实值函数 \(X: \Omega \to \mathbb{R}\)。
⚝ 离散型随机变量 (Discrete Random Variable):取值是可数的随机变量。例如,抛掷硬币的正面次数、消息的长度等。
⚝ 连续型随机变量 (Continuous Random Variable):取值是不可数的随机变量,通常取值于一个区间。例如,密钥生成的时间、噪声信号的强度等。
② 概率分布 (Probability Distribution):
概率分布描述了随机变量取值的概率规律。
⚝ 离散型随机变量的概率质量函数 (Probability Mass Function, PMF):对于离散型随机变量 \(X\),其概率质量函数 \(p(x) = P(X = x)\) 描述了 \(X\) 取每个可能值 \(x\) 的概率。PMF 满足 \(\sum_{x} p(x) = 1\) 和 \(p(x) \ge 0\)。
⚝ 连续型随机变量的概率密度函数 (Probability Density Function, PDF):对于连续型随机变量 \(X\),其概率密度函数 \(f(x)\) 描述了 \(X\) 在某点附近取值的相对可能性。\(X\) 在区间 \([a, b]\) 内取值的概率为 \(P(a \le X \le b) = \int_{a}^{b} f(x) dx\)。PDF 满足 \(\int_{-\infty}^{\infty} f(x) dx = 1\) 和 \(f(x) \ge 0\)。
⚝ 累积分布函数 (Cumulative Distribution Function, CDF):对于任意随机变量 \(X\),其累积分布函数 \(F(x) = P(X \le x)\) 描述了 \(X\) 取值小于等于 \(x\) 的概率。CDF 是一个非递减函数,且 \(\lim_{x \to -\infty} F(x) = 0\),\(\lim_{x \to \infty} F(x) = 1\)。
③ 常见的概率分布 (Common Probability Distributions):
⚝ 离散型分布:
▮▮▮▮ⓐ 伯努利分布 (Bernoulli Distribution):描述一次伯努利试验 (Bernoulli trial) 的结果,取值 0 或 1,概率分别为 \(1-p\) 和 \(p\)。例如,一次密钥猜测是否成功。
▮▮▮▮ⓑ 二项分布 (Binomial Distribution):描述 \(n\) 次独立伯努利试验中成功的次数。例如,在多次密钥猜测中成功的次数。
▮▮▮▮ⓒ 泊松分布 (Poisson Distribution):描述单位时间或空间内稀有事件发生的次数。例如,网络攻击事件发生的次数。
▮▮▮▮ⓓ 均匀分布 (Discrete Uniform Distribution):在有限个可能取值上,每个取值概率相等。例如,随机选择密钥时,密钥在密钥空间上均匀分布。
⚝ 连续型分布:
▮▮▮▮ⓐ 均匀分布 (Continuous Uniform Distribution):在某个区间 \([a, b]\) 上,概率密度函数为常数。例如,随机数生成器输出的随机数在 \([0, 1]\) 区间上均匀分布。
▮▮▮▮ⓑ 正态分布 (Normal Distribution) 或高斯分布 (Gaussian Distribution):自然界中最常见的分布之一,具有钟形曲线。例如,噪声信号的强度。
▮▮▮▮ⓒ 指数分布 (Exponential Distribution):描述独立事件发生的时间间隔。例如,两次网络攻击之间的时间间隔。
④ 随机变量的数字特征 (Numerical Characteristics of Random Variables):
⚝ 期望 (Expectation) \(E[X]\) 或均值 (Mean) \(\mu\): 随机变量取值的平均水平。
▮▮▮▮对于离散型随机变量 \(X\),\(E[X] = \sum_{x} x p(x)\)。
▮▮▮▮对于连续型随机变量 \(X\),\(E[X] = \int_{-\infty}^{\infty} x f(x) dx\)。
⚝ 方差 (Variance) \(Var(X)\) 或 \(\sigma^2\): 随机变量取值偏离期望的程度。
▮▮▮▮\(Var(X) = E[(X - E[X])^2] = E[X^2] - (E[X])^2\)。
⚝ 标准差 (Standard Deviation) \(\sigma\): 方差的平方根,\(\sigma = \sqrt{Var(X)}\)。
⑤ 概率分布在密码学中的应用 (Applications of Probability Distributions in Cryptography):
⚝ 密钥生成:密钥通常从密钥空间中随机均匀选取,密钥的概率分布为离散均匀分布。
⚝ 密码算法安全性分析:分析密码算法抵抗各种攻击的能力时,需要计算攻击成功的概率,例如暴力破解攻击的成功概率、差分密码分析的成功概率等。
⚝ 随机数生成器评估:评估随机数生成器的随机性时,需要分析生成序列的概率分布是否接近理想的均匀分布。
⚝ 信息论 (Information Theory):信息论中的熵 (entropy) 概念与概率分布密切相关,熵用于度量随机变量的不确定性,在密码学中用于评估密钥的随机性和密码系统的安全性。
2.4 计算复杂性理论基础 (Computational Complexity Theory Basics)
2.4.1 P问题与NP问题 (P and NP Problems)
计算复杂性理论 (computational complexity theory) 是理论计算机科学的一个分支,研究算法解决计算问题的效率和资源消耗。在密码学中,计算复杂性理论用于分析密码算法的安全性,特别是基于计算困难性假设的密码系统,如公钥密码学。
① 算法与问题 (Algorithms and Problems):
⚝ 算法 (Algorithm):解决特定计算问题的一系列明确指令。
⚝ 问题 (Problem):需要解决的一类计算任务。例如,排序问题、搜索问题、判定问题等。
⚝ 判定问题 (Decision Problem):输出结果只有“是” (Yes) 或“否” (No) 的问题。例如,“给定一个整数 \(n\),判断 \(n\) 是否为素数?”。
② 时间复杂度 (Time Complexity):
时间复杂度是衡量算法执行时间随输入规模增长而增长的速率。通常使用大 O 符号 (Big O notation) 表示时间复杂度。
⚝ 多项式时间算法 (Polynomial-time Algorithm):时间复杂度为 \(O(n^k)\) 的算法,其中 \(n\) 是输入规模,\(k\) 是常数。多项式时间算法被认为是高效的算法。
⚝ 指数时间算法 (Exponential-time Algorithm):时间复杂度为 \(O(c^n)\) 或 \(O(n!)\) 等的算法,其中 \(c > 1\) 是常数。指数时间算法被认为是低效的算法,当输入规模增大时,执行时间会急剧增长。
③ P问题 (P Problems):
P (Polynomial time) 问题是指可以在多项式时间内被确定型图灵机 (Deterministic Turing Machine, DTM) 解决的判定问题。
⚝ 直观理解:P 问题是“容易”解决的问题,存在高效算法。
⚝ 例子:
▮▮▮▮ⓐ 排序问题 (Sorting):可以使用归并排序、快速排序等 \(O(n \log n)\) 时间复杂度的算法解决。
▮▮▮▮ⓑ 图的连通性判断 (Graph Connectivity):可以使用深度优先搜索 (DFS) 或广度优先搜索 (BFS) 等线性时间复杂度的算法解决。
▮▮▮▮ⓒ 素性检验 (Primality Test - 某些概率性算法在实际应用中接近多项式时间):例如,米勒-拉宾素性检验在实际应用中被认为是高效的。
④ NP问题 (NP Problems):
NP (Non-deterministic Polynomial time) 问题是指可以在多项式时间内被非确定型图灵机 (Non-deterministic Turing Machine, NTM) 验证解的判定问题。
⚝ 非确定型图灵机:可以进行“猜测”和“验证”的抽象计算模型。
⚝ 验证解:对于一个 NP 问题的实例,如果给出一个可能的解 (certificate),可以在多项式时间内验证这个解是否正确。
⚝ 直观理解:NP 问题是“难以求解,但容易验证”的问题。
⚝ 例子:
▮▮▮▮ⓐ 合数判定问题 (Compositeness Testing):给定一个整数 \(n\),判断 \(n\) 是否为合数。如果给出 \(n\) 的一个非平凡因子,可以很容易验证 \(n\) 是合数。
▮▮▮▮ⓑ 旅行商问题 (Traveling Salesperson Problem, TSP):给定一组城市和城市之间的距离,是否存在一条访问所有城市并返回起点的路径,其总距离不超过某个给定值。如果给出一条路径,可以很容易验证路径长度是否满足条件。
▮▮▮▮ⓒ 子集和问题 (Subset Sum Problem):给定一个整数集合 \(S\) 和一个目标值 \(t\),是否存在 \(S\) 的一个子集,其元素之和等于 \(t\)。如果给出一个子集,可以很容易验证子集元素之和是否等于 \(t\)。
▮▮▮▮ⓓ 图着色问题 (Graph Coloring):给定一个图 \(G\) 和一个颜色数 \(k\),是否可以使用 \(k\) 种颜色对图 \(G\) 的顶点进行着色,使得相邻顶点颜色不同。如果给出一种着色方案,可以很容易验证是否满足条件。
⑤ P与NP的关系 (Relationship between P and NP):
⚝ P ⊆ NP:所有 P 问题都是 NP 问题。因为如果一个问题可以在多项式时间内求解,那么显然也可以在多项式时间内验证解(直接求解即可)。
⚝ P = NP?:P 是否等于 NP 是理论计算机科学中最重要和最著名的未解决问题之一。大多数计算机科学家相信 P ≠ NP,但至今没有被证明。
⚝ 如果 P = NP,则意味着所有 NP 问题都存在多项式时间算法,许多目前被认为是计算上不可行的密码系统将变得可破解。
⚝ 如果 P ≠ NP,则意味着存在 NP 问题,不存在多项式时间算法,这为基于计算困难性假设的密码系统提供了理论基础。
2.4.2 NP完全性 (NP-Completeness)
NP完全性 (NP-Completeness) 是 NP 问题中“最难”问题的概念。NP完全问题 (NP-complete problems) 是一类特殊的 NP 问题,如果能够找到任何一个 NP完全问题的多项式时间算法,那么所有 NP 问题都可以在多项式时间内解决,即 P = NP。
① 多项式时间归约 (Polynomial-time Reduction):
问题 A 可以多项式时间归约到问题 B,记作 \(A \le_P B\),如果存在一个多项式时间算法,可以将问题 A 的任何实例转换为问题 B 的一个实例,使得问题 A 的实例的解与问题 B 的实例的解相同。
⚝ 意义:如果 \(A \le_P B\) 且问题 B 是 P 问题,则问题 A 也是 P 问题。反之,如果 \(A \le_P B\) 且问题 A 是 NP 难问题 (NP-hard),则问题 B 也是 NP 难问题。
② NP完全问题的定义 (Definition of NP-Complete Problems):
一个判定问题 C 是 NP完全问题,如果满足以下两个条件:
⚝ C ∈ NP:C 是一个 NP 问题。
⚝ 对于所有 NP 问题 A,都有 \(A \le_P C\):所有 NP 问题都可以多项式时间归约到 C。
③ 第一个NP完全问题:CNF-SAT问题 (The First NP-Complete Problem: CNF-SAT):
库克-列文定理 (Cook-Levin Theorem) 证明了 CNF-SAT问题 (Boolean Satisfiability Problem in Conjunctive Normal Form) 是第一个 NP完全问题。
⚝ CNF-SAT问题:给定一个布尔公式,以合取范式 (Conjunctive Normal Form, CNF) 表示,判断是否存在一组变量赋值,使得公式为真 (满足)。
④ NP完全问题的性质 (Properties of NP-Complete Problems):
⚝ 等价性:所有 NP完全问题在多项式时间归约意义下是等价的。如果找到一个 NP完全问题的多项式时间算法,则所有 NP完全问题都是 P 问题,从而 P = NP。
⚝ NP难问题 (NP-hard Problems):如果一个问题 C 满足第二个条件(对于所有 NP 问题 A,都有 \(A \le_P C\),但不一定满足第一个条件(C ∈ NP),则称 C 为 NP 难问题。NP 难问题至少与 NP完全问题一样难,甚至可能更难(不一定是判定问题)。
⑤ 常见的NP完全问题 (Common NP-Complete Problems):
在 CNF-SAT 问题被证明是 NP完全问题之后,通过多项式时间归约,人们陆续证明了许多其他问题也是 NP完全问题,例如:
⚝ 3-SAT问题 (3-Satisfiability Problem):CNF-SAT 问题的特殊形式,每个子句 (clause) 最多包含 3 个文字 (literal)。
⚝ 团问题 (Clique Problem):给定一个图 \(G\) 和一个整数 \(k\),判断 \(G\) 中是否存在大小为 \(k\) 的团 (完全子图)。
⚝ 顶点覆盖问题 (Vertex Cover Problem):给定一个图 \(G\) 和一个整数 \(k\),判断 \(G\) 中是否存在大小为 \(k\) 的顶点覆盖 (一个顶点集合,使得每条边至少有一个端点在这个集合中)。
⚝ 哈密顿回路问题 (Hamiltonian Cycle Problem):给定一个图 \(G\),判断 \(G\) 中是否存在哈密顿回路 (经过每个顶点恰好一次的回路)。
⚝ 子集和问题 (Subset Sum Problem)。
⚝ 整数规划问题 (Integer Programming Problem)。
⚝ 旅行商问题 (Traveling Salesperson Problem, TSP) (判定版本)。
⑥ NP完全性在密码学中的应用 (Applications of NP-Completeness in Cryptography):
⚝ 计算困难性假设 (Computational Hardness Assumptions):许多密码系统的安全性基于某些计算问题的困难性假设,例如,假设大整数分解问题 (Integer Factorization Problem) 和离散对数问题 (Discrete Logarithm Problem) 是计算上困难的。这些困难性假设通常与 NP 问题的计算复杂性有关。
⚝ 单向函数 (One-way Functions):单向函数是一种易于计算正向函数值,但难以计算反向函数的函数。单向函数的存在性与 P ≠ NP 问题密切相关。如果 P ≠ NP,则可能存在单向函数,而单向函数是构建许多密码系统的基础。
⚝ 零知识证明 (Zero-Knowledge Proofs):零知识证明协议的安全性分析也涉及到计算复杂性理论,例如,证明者需要证明某个 NP 命题为真,但不泄露任何额外信息。
⚝ 密码算法设计:在设计新的密码算法时,需要考虑算法的计算复杂性,以确保算法的安全性。例如,公钥密码算法通常基于 NP 难问题或其变体的困难性。
理解 P 问题、NP 问题和 NP完全性的概念,对于理解现代密码学的理论基础和安全性分析至关重要。密码学中许多重要的密码系统都建立在假设某些问题是 NP 难问题或其相关问题的基础上。
3. chapter 3: 对称密钥密码学 (Symmetric-key Cryptography)
对称密钥密码学 (Symmetric-key Cryptography),又称私钥密码学 (Private-key Cryptography) 或单密钥密码学 (Single-key Cryptography),是密码学中的一个重要分支。在对称密钥密码体制中,加密和解密使用相同的密钥,或者从一个密钥可以很容易地推导出另一个密钥。这种密码体制的优点是加解密速度快,效率高,适合于加密大量数据。然而,其密钥管理较为复杂,尤其是在需要与多个通信方进行安全通信时,密钥的分发和保管成为一个挑战。
3.1 经典密码算法 (Classical Ciphers)
经典密码算法 (Classical Ciphers) 是现代密码学的基石。虽然这些算法在现代密码分析技术面前显得脆弱,但它们为理解密码学的基本概念和原理提供了重要的历史视角和理论基础。经典密码算法主要分为两大类:替换密码 (Substitution Ciphers) 和换位密码 (Transposition Ciphers)。
3.1.1 替换密码 (Substitution Ciphers)
替换密码 (Substitution Ciphers) 是一种将明文中的每个字符替换成另一个字符、数字或符号的加密方法。替换过程基于一个固定的替换规则,这个规则构成了密钥的一部分。
① 单表替换密码 (Monoalphabetic Substitution Ciphers):
单表替换密码是最简单的替换密码形式,它使用固定的替换表来替换明文中的每个字符。这意味着明文中的同一个字符在密文中总是被替换成同一个字符。
⚝ 凯撒密码 (Caesar Cipher):
凯撒密码是最著名的单表替换密码之一。它将字母表中的每个字母向后(或向前)移动固定数量的位置。例如,当偏移量为 3 时,字母 'A' 被替换为 'D','B' 被替换为 'E',以此类推,'Z' 被替换为 'C'。
1
明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ
2
密文字母表(偏移量为3):DEFGHIJKLMNOPQRSTUVWXYZABC
加密过程:将明文中的每个字母在明文字母表中找到,然后用密文字母表中对应位置的字母替换。
解密过程:将密文中的每个字母在密文字母表中找到,然后用明文字母表中对应位置的字母替换。
例如,明文 "HELLO" 使用凯撒密码(偏移量为 3)加密后变为 "KHOOR"。
凯撒密码的密钥就是偏移量。由于密钥空间非常小(只有 25 个可能的偏移量,如果考虑包括偏移量为0,则是26个),很容易通过穷举攻击 (Brute-force Attack) 破解。
⚝ 移位密码 (Shift Cipher):
移位密码是凯撒密码的推广。它允许使用任意整数作为偏移量,而不仅仅是 1 到 25。然而,本质上,移位密码与凯撒密码的安全性相当,仍然容易受到穷举攻击。
⚝ 仿射密码 (Affine Cipher):
仿射密码是一种更复杂的单表替换密码。它使用一个仿射函数来加密每个字母。对于字母表大小为 \(n\) (例如,对于英文字母,\(n=26\)),仿射密码的加密函数通常形式为:
\[ E(x) = (ax + b) \pmod{n} \]
其中,\(x\) 是明文字母在字母表中的数值表示(例如,A=0, B=1, ..., Z=25),\(a\) 和 \(b\) 是密钥,且 \(a\) 和 \(n\) 必须互质(即 \(\gcd(a, n) = 1\)),以保证存在解密函数。解密函数的形式为:
\[ D(y) = a^{-1}(y - b) \pmod{n} \]
其中,\(a^{-1}\) 是 \(a\) 在模 \(n\) 意义下的乘法逆元。
例如,对于英文字母表,选择 \(a=5\), \(b=8\)。加密函数为 \(E(x) = (5x + 8) \pmod{26}\)。
如果要加密字母 'H' (数值表示为 7),则 \(E(7) = (5 \times 7 + 8) \pmod{26} = 43 \pmod{26} = 17\),数值 17 对应字母 'R'。
仿射密码的密钥是数对 \((a, b)\)。虽然密钥空间比凯撒密码大,但仍然相对较小,容易受到频率分析 (Frequency Analysis) 和穷举攻击等方法破解。
② 多表替换密码 (Polyalphabetic Substitution Ciphers):
为了增强单表替换密码的安全性,人们提出了多表替换密码。多表替换密码使用多个替换表,并在加密过程中轮流使用这些表。这样做的目的是为了平滑密文中字符频率的分布,从而抵抗频率分析。
⚝ 维吉尼亚密码 (Vigenère Cipher):
维吉尼亚密码是最著名的多表替换密码。它使用一个密钥词 (keyword) 来决定使用哪个替换表。维吉尼亚密码由多个凯撒密码组成,每个凯撒密码使用密钥词中对应位置的字母作为偏移量。
假设密钥词为 "KEY",明文为 "HELLO WORLD"。
- 将密钥词重复书写在明文上方,直到与明文长度一致:
1
密钥词:KEYKEYKEYKE
2
明文 :HELLOWORLD
- 对于明文的每个字母,使用密钥词中对应位置的字母作为凯撒密码的偏移量进行加密。例如,密钥字母 'K' 对应偏移量 10 (因为 'A' 对应 0, 'B' 对应 1, ..., 'K' 对应 10)。
加密过程可以使用维吉尼亚方阵 (Vigenère Square) 或直接计算。使用直接计算,对于明文字母 \(P_i\) 和密钥字母 \(K_i\),密文字母 \(C_i\) 可以计算为:
\[ C_i = (P_i + K_i) \pmod{26} \]
其中,字母都转换为数值表示 (A=0, B=1, ..., Z=25)。
例如,加密 "HELLO WORLD" 使用密钥 "KEY":
⚝ 'H' + 'K' -> (7 + 10) mod 26 = 17 -> 'R'
⚝ 'E' + 'E' -> (4 + 4) mod 26 = 8 -> 'I'
⚝ 'L' + 'Y' -> (11 + 24) mod 26 = 9 -> 'J'
⚝ 'L' + 'K' -> (11 + 10) mod 26 = 21 -> 'V'
⚝ 'O' + 'E' -> (14 + 4) mod 26 = 18 -> 'S'
⚝ 'W' + 'K' -> (22 + 10) mod 26 = 6 -> 'G'
⚝ 'O' + 'E' -> (14 + 4) mod 26 = 18 -> 'S'
⚝ 'R' + 'Y' -> (17 + 24) mod 26 = 15 -> 'P'
⚝ 'L' + 'K' -> (11 + 10) mod 26 = 21 -> 'V'
⚝ 'D' + 'E' -> (3 + 4) mod 26 = 7 -> 'H'
密文为 "RIJV S GSPVH"。
维吉尼亚密码的安全性比单表替换密码高,因为它使用了多个替换表,使得频率分析变得更加复杂。然而,维吉尼亚密码仍然可以被破解,例如使用 Kasiski 试验 (Kasiski Examination) 和 Friedman 试验 (Friedman Test) 来估计密钥长度,然后对每个凯撒密码进行频率分析。
3.1.2 换位密码 (Transposition Ciphers)
换位密码 (Transposition Ciphers) 不替换明文中的字符,而是通过改变明文字符的顺序来加密信息。换位密码也称为置换密码 (Permutation Ciphers)。
① 列换位密码 (Columnar Transposition Cipher):
列换位密码是最常见的换位密码之一。它将明文写入一个固定列数的矩阵中,然后按列的顺序读出,形成密文。列的顺序由密钥决定。
例如,假设密钥为 "4132",明文为 "HELLO WORLD"。
- 将明文按行写入一个 4 列的矩阵:
1
H E L L
2
O W O
3
R L D
如果明文长度不是列数的整数倍,需要填充填充字符(例如 'X')以补全矩阵。这里为了简化例子,假设明文长度恰好适合。
- 根据密钥 "4132" 确定列的读取顺序。密钥 "4132" 表示第一列按第 4 个顺序读取,第二列按第 1 个顺序读取,第三列按第 3 个顺序读取,第四列按第 2 个顺序读取。正确的理解是:密钥指示了列的读取顺序,密钥中的数字表示读取的列的序号。所以,密钥 "4132" 表示读取顺序为:第 2 列,第 4 列,第 3 列,第 1 列。
按照密钥 "4132" (读取顺序为 2, 4, 3, 1) 读取矩阵的列:
⚝ 第 2 列:E L
⚝ 第 4 列:L D
⚝ 第 3 列:L O
⚝ 第 1 列:H O R
连接读取的列,得到密文 "ELLDLOHOR"。
解密过程需要知道密钥和列数。接收者将密文按列数分成若干段,然后根据密钥的逆序将这些段按列放回矩阵中,最后按行读出明文。
列换位密码的安全性取决于密钥的长度和明文的长度。简单的列换位密码容易受到频率分析和字典攻击等方法破解。
② 周期换位密码 (Period Transposition Cipher):
周期换位密码是对列换位密码的扩展。它使用一个周期性的换位规则,而不是固定的列数。
换位密码可以单独使用,也可以与替换密码结合使用,以提高密码的安全性。例如,先使用替换密码加密,再使用换位密码加密,形成乘积密码 (Product Cipher)。
3.1.3 维吉尼亚密码 (Vigenère Cipher)
维吉尼亚密码 (Vigenère Cipher) 已经在 3.1.1 节的多表替换密码中详细介绍。这里再次强调其重要性,因为它代表了经典密码学中相对较高级别的加密技术。维吉尼亚密码通过使用密钥词来控制多个凯撒密码的轮换使用,有效地抵抗了简单的频率分析。然而,如前所述,维吉尼亚密码并非牢不可破,仍然存在破解方法。
3.1.4 弗纳姆密码与一次一密 (Vernam Cipher and One-Time Pad)
① 弗纳姆密码 (Vernam Cipher):
弗纳姆密码是由吉尔伯特·弗纳姆 (Gilbert Vernam) 在 1918 年发明的。它是一种流密码,使用密钥流 (keystream) 与明文流进行异或 (XOR) 运算来加密。弗纳姆密码最初使用纸带作为密钥流。
加密过程:将明文比特流与密钥比特流逐位进行异或运算,得到密文比特流。
解密过程:将密文比特流与相同的密钥比特流逐位进行异或运算,即可恢复明文比特流。
\[ C_i = P_i \oplus K_i \]
\[ P_i = C_i \oplus K_i \]
其中,\(P_i\) 是明文比特,\(K_i\) 是密钥比特,\(C_i\) 是密文比特,\(\oplus\) 表示异或运算。
弗纳姆密码的关键在于密钥流的生成和管理。如果密钥流是真随机的,并且与明文长度相同或更长,且密钥仅使用一次,那么弗纳姆密码就变成了理论上不可破解的一次一密。
② 一次一密 (One-Time Pad):
一次一密 (One-Time Pad, OTP) 是弗纳姆密码的一个特例,也是理论上最安全的加密方法。一次一密要求密钥满足以下条件:
- 真随机性 (Truly Random):密钥必须是完全随机生成的。
- 密钥长度 (Key Length):密钥的长度必须至少等于明文的长度。
- 一次性使用 (One-Time Use):每个密钥只能使用一次,绝对不能重复使用。
- 安全保管 (Securely Kept):密钥必须安全地保管,不能泄露给任何未授权的人。
如果满足以上条件,一次一密在理论上是不可破解的,即具有完善保密性 (Perfect Secrecy)。这是由香农 (Claude Shannon) 证明的。即使攻击者拥有无限的计算资源,也无法从密文中获取任何关于明文的信息。
一次一密的完善保密性证明 (简述):
假设明文 \(P\) 和密文 \(C\) 都是二元的随机变量。密钥 \(K\) 是与明文和密文独立的、均匀分布的随机变量,且长度与明文相同。加密过程为 \(C = P \oplus K\)。要证明一次一密具有完善保密性,需要证明在已知密文 \(C\) 的条件下,关于明文 \(P\) 的后验概率与先验概率相同,即 \(P(P|C) = P(P)\)。
由于密钥 \(K\) 是真随机的,且与明文独立,对于任何给定的密文 \(C\),都存在唯一的密钥 \(K = P \oplus C\) 可以将明文 \(P\) 加密成 \(C\)。由于密钥是均匀分布的,所以对于任何可能的明文 \(P\),生成密文 \(C\) 的概率都是相同的,与明文本身无关。因此,观察到密文 \(C\) 并不能提供关于明文 \(P\) 的任何额外信息。
一次一密的缺点:
尽管一次一密在理论上是完美的,但在实际应用中面临严重的挑战:
- 密钥生成与分发 (Key Generation and Distribution):生成真随机密钥非常困难,尤其是在大规模应用中。密钥的分发和安全保管也是一个巨大的难题,特别是当通信双方需要频繁通信时。
- 密钥长度 (Key Length):密钥长度必须至少等于明文长度,这使得密钥管理变得非常复杂和不实用,尤其是在需要加密大量数据时。
由于这些实际限制,一次一密主要用于对极少数、极高机密性的信息进行加密,例如国家元首之间的热线通信等。在大多数实际应用场景中,更倾向于使用其他更实用的密码算法,如分组密码和流密码。
3.2 分组密码 (Block Ciphers)
分组密码 (Block Ciphers) 是现代密码学中最重要的对称密钥密码算法之一。分组密码将明文分成固定大小的数据块(例如 64 比特、128 比特),然后对每个数据块进行加密变换。加密变换通常使用复杂的轮函数 (round function) 和密钥编排 (key schedule) 机制,以实现混淆 (confusion) 和扩散 (diffusion) 的效果,从而提高密码的安全性。
3.2.1 数据加密标准 DES (Data Encryption Standard DES)
数据加密标准 (Data Encryption Standard, DES) 是由 IBM 公司在 20 世纪 70 年代初开发的,并于 1977 年被美国国家标准局 (NBS, 今 NIST) 采纳为联邦信息处理标准 (FIPS)。DES 曾经是最广泛使用的分组密码算法之一,对现代密码学的发展产生了深远的影响。
① DES 算法概述:
⚝ 分组大小 (Block Size):64 比特。
⚝ 密钥长度 (Key Length):56 比特(实际密钥长度为 64 比特,其中 8 比特用于奇偶校验,不参与加密)。
⚝ 轮数 (Number of Rounds):16 轮。
⚝ Feistel 结构 (Feistel Structure):DES 采用 Feistel 结构,这是一种分组密码的设计模式,其特点是将加密过程分为多轮迭代,每一轮使用轮函数对数据块的一部分进行处理,并将结果与另一部分进行异或运算。Feistel 结构的优点是加密和解密过程结构相似,只需要轮函数和密钥编排的逆过程即可实现解密。
② DES 算法流程:
1. 初始置换 (Initial Permutation, IP):
64 比特的明文分组首先经过一个固定的初始置换 IP,重新排列比特的顺序。初始置换本身不提供任何密码学上的安全性,其目的是为了方便硬件实现。
- 16 轮迭代 (16 Rounds):
经过初始置换后的 64 比特数据块被分成左右两半,各 32 比特,分别记为 \(L_0\) 和 \(R_0\)。然后进行 16 轮迭代运算。在每一轮 \(i\) (\(i = 1, 2, ..., 16\)) 中,执行以下操作:
\[ L_i = R_{i-1} \]
\[ R_i = L_{i-1} \oplus f(R_{i-1}, K_i) \]
其中,\(f\) 是轮函数,\(K_i\) 是第 \(i\) 轮的子密钥,由主密钥通过密钥编排算法生成。轮函数 \(f\) 的主要组成部分包括:
▮▮▮▮⚝ 扩展置换 (Expansion Permutation, E-box):将 32 比特的输入扩展为 48 比特。
▮▮▮▮⚝ 与子密钥异或 (XOR with Subkey):将扩展后的 48 比特数据与 48 比特的子密钥 \(K_i\) 进行异或运算。
▮▮▮▮⚝ S盒替换 (S-box Substitution):将异或结果分成 8 个 6 比特的小组,每个小组经过一个 S 盒 (Substitution Box) 进行非线性替换,输出 4 比特。8 个 S 盒共输出 32 比特。S 盒是 DES 算法中唯一的非线性部件,也是安全性的关键所在。
▮▮▮▮⚝ P盒置换 (Permutation Box, P-box):将 S 盒的 32 比特输出进行一个固定的置换 P,重新排列比特的顺序。
左右交换 (Swap):
在 16 轮迭代结束后,左右两半 \(L_{16}\) 和 \(R_{16}\) 被交换,得到 \(R_{16} || L_{16}\) (表示左右连接)。逆初始置换 (Inverse Initial Permutation, IP-1):
将交换后的 64 比特数据经过一个固定的逆初始置换 IP-1,它是初始置换 IP 的逆运算。输出结果即为 64 比特的密文分组。
③ 密钥编排 (Key Schedule):
DES 的密钥编排算法将 56 比特的主密钥扩展生成 16 个 48 比特的子密钥 \(K_1, K_2, ..., K_{16}\),供每一轮迭代使用。密钥编排过程主要包括:
⚝ 密钥置换选择 1 (Permuted Choice 1, PC-1):从 56 比特密钥中选择 56 比特,并进行置换,分为左右两半 \(C_0\) 和 \(D_0\),各 28 比特。
⚝ 轮循环左移 (Left Shift):在每一轮 \(i\) (\(i = 1, 2, ..., 16\)),根据轮数将 \(C_{i-1}\) 和 \(D_{i-1}\) 分别循环左移 1 位或 2 位,得到 \(C_i\) 和 \(D_i\)。
⚝ 密钥置换选择 2 (Permuted Choice 2, PC-2):将 \(C_i\) 和 \(D_i\) 合并成 56 比特,然后从中选择 48 比特,并进行置换,得到第 \(i\) 轮的子密钥 \(K_i\)。
④ DES 的安全性:
DES 在 20 世纪 70 年代和 80 年代被认为是安全的,但随着计算能力的提高和密码分析技术的发展,DES 的安全性逐渐受到挑战。主要的安全缺陷包括:
⚝ 密钥长度过短 (Short Key Length):56 比特的密钥长度使得穷举攻击成为可能。在现代计算条件下,可以在相对较短的时间内穷举所有可能的密钥。
⚝ S 盒的设计可能存在缺陷 (Potential Weakness in S-box Design):虽然 S 盒的设计经过精心考虑,但有研究表明,S 盒的设计可能存在一定的弱点,使得差分密码分析 (Differential Cryptanalysis) 和线性密码分析 (Linear Cryptanalysis) 等攻击方法能够有效地攻击 DES。
由于 DES 的安全性问题,以及更高效、更安全的 AES 的出现,DES 已经逐渐被淘汰。但其设计思想和结构仍然对现代分组密码学具有重要的参考价值。
⑤ 三重 DES (Triple DES, 3DES):
为了延长 DES 的使用寿命,并提高其安全性,人们提出了三重 DES (3DES) 算法。3DES 通过使用三个 DES 密钥,对数据进行三次 DES 加密或解密操作。常见的 3DES 模式是 EDE (Encrypt-Decrypt-Encrypt) 模式:
⚝ 加密 (Encryption):\(C = DES_K3(DES^{-1}_{K2}(DES_{K1}(P)))\)
⚝ 解密 (Decryption):\(P = DES^{-1}_{K1}(DES_{K2}(DES^{-1}_{K3}(C)))\)
其中,\(DES_{K}(P)\) 表示使用密钥 \(K\) 对明文 \(P\) 进行 DES 加密,\(DES^{-1}_{K}(C)\) 表示使用密钥 \(K\) 对密文 \(C\) 进行 DES 解密。\(K_1\), \(K_2\), \(K_3\) 是三个 DES 密钥。
3DES 的密钥长度可以是 112 比特(当 \(K_1 = K_3\) 时)或 168 比特(当 \(K_1\), \(K_2\), \(K_3\) 互不相同时)。3DES 的安全性比单 DES 高得多,能够抵抗穷举攻击。然而,3DES 的加解密速度相对较慢,效率较低。随着 AES 的普及,3DES 也逐渐被更高效、更安全的 AES 所取代。
3.2.2 高级加密标准 AES (Advanced Encryption Standard AES)
高级加密标准 (Advanced Encryption Standard, AES) 是为了取代 DES 而设计的下一代分组密码算法。NIST 于 1997 年启动 AES 评选,最终在 2000 年选择了 Rijndael 算法作为 AES 标准,并于 2001 年正式发布为 FIPS 197。AES 具有更高的安全性、更高的效率和更好的灵活性,已成为当今最广泛使用的分组密码算法。
① AES 算法概述:
⚝ 分组大小 (Block Size):128 比特(AES 标准支持 128, 192, 256 比特的分组大小,但最常用的是 128 比特)。
⚝ 密钥长度 (Key Length):128, 192, 256 比特(对应 AES-128, AES-192, AES-256)。
⚝ 轮数 (Number of Rounds):10 轮 (AES-128), 12 轮 (AES-192), 14 轮 (AES-256)。
⚝ SPN 结构 (Substitution-Permutation Network Structure):AES 采用 SPN 结构,与 DES 的 Feistel 结构不同。SPN 结构的特点是在每一轮迭代中,数据块经过替换层 (Substitution Layer) 和置换层 (Permutation Layer) 的处理,实现混淆和扩散。
② AES 算法流程:
1. 初始轮密钥加 (AddRoundKey):
将 128 比特的明文分组与初始轮密钥进行异或运算。
多轮迭代 (Rounds):
进行多轮迭代运算,轮数取决于密钥长度(10, 12 或 14 轮)。每一轮迭代包括以下四个步骤:
▮▮▮▮⚝ 字节替换 (SubBytes):对状态矩阵 (state matrix) 中的每个字节进行 S 盒替换。AES 使用一个 256 字节的 S 盒,提供非线性变换和混淆效果。
▮▮▮▮⚝ 行移位 (ShiftRows):对状态矩阵的每一行进行循环左移。第 0 行不移位,第 1 行循环左移 1 个字节,第 2 行循环左移 2 个字节,第 3 行循环左移 3 个字节。行移位操作实现扩散效果。
▮▮▮▮⚝ 列混合 (MixColumns):对状态矩阵的每一列进行线性变换,使用一个固定的矩阵与每一列进行矩阵乘法运算。列混合操作进一步增强扩散效果。
▮▮▮▮⚝ 轮密钥加 (AddRoundKey):将状态矩阵与本轮的轮密钥进行异或运算。最终轮 (Final Round):
最后一轮迭代与普通轮迭代略有不同,它省略了列混合 (MixColumns) 步骤,只包括字节替换 (SubBytes)、行移位 (ShiftRows) 和轮密钥加 (AddRoundKey)。输出 (Output):
最后一轮迭代的输出即为 128 比特的密文分组。
③ 密钥编排 (Key Schedule):
AES 的密钥编排算法将输入的密钥扩展生成多轮迭代所需的轮密钥。密钥编排过程包括:
⚝ 密钥扩展 (Key Expansion):将输入的密钥扩展成一个密钥序列,密钥序列的长度取决于轮数和分组大小。
⚝ 轮密钥选择 (Round Key Selection):从密钥序列中选择每一轮所需的轮密钥。
AES 的密钥编排算法设计精巧,能够有效地抵抗相关密钥攻击 (Related-Key Attack)。
④ AES 的安全性:
AES 具有很高的安全性,被认为是目前最安全的分组密码算法之一。主要的安全优势包括:
⚝ 密钥长度足够长 (Sufficient Key Length):AES 支持 128, 192, 256 比特的密钥长度,能够有效抵抗穷举攻击。
⚝ SPN 结构的安全性 (Security of SPN Structure):AES 的 SPN 结构设计精良,经过多年的密码分析,尚未发现有效的攻击方法。
⚝ 抵抗多种密码分析方法 (Resistance to Various Cryptanalysis Methods):AES 能够抵抗差分密码分析、线性密码分析、代数攻击 (Algebraic Attack) 等多种已知的密码分析方法。
由于 AES 的高安全性、高效率和灵活性,它已经成为各种应用场景中的首选分组密码算法,例如 TLS/SSL 协议、IPsec 协议、文件加密、磁盘加密等。
3.2.3 分组密码的工作模式 (Modes of Operation for Block Ciphers)
分组密码只能加密固定长度的数据块。对于需要加密任意长度的数据,需要使用分组密码的工作模式 (Modes of Operation)。工作模式定义了如何使用分组密码算法来加密和解密较长的数据,以及如何处理最后一个可能不足一个分组长度的数据块。常见的分组密码工作模式包括电子密码本模式 (ECB)、密码分组链接模式 (CBC)、计数器模式 (CTR) 和伽罗瓦/计数器模式 (GCM) 等。
3.2.3.1 电子密码本模式 ECB (Electronic Codebook ECB)
电子密码本模式 (Electronic Codebook, ECB) 是最简单的工作模式。ECB 模式将明文分成若干个分组,每个分组独立地使用相同的密钥和分组密码算法进行加密。
加密过程 (Encryption):
对于明文分组 \(P_1, P_2, ..., P_n\),密文分组 \(C_i\) 计算为:
\[ C_i = E_K(P_i) \]
其中,\(E_K\) 表示使用密钥 \(K\) 的分组密码加密算法。
解密过程 (Decryption):
对于密文分组 \(C_1, C_2, ..., C_n\),明文分组 \(P_i\) 计算为:
\[ P_i = D_K(C_i) \]
其中,\(D_K\) 表示使用密钥 \(K\) 的分组密码解密算法。
ECB 模式的优缺点:
⚝ 优点:
▮▮▮▮⚝ 简单易实现。
▮▮▮▮⚝ 可以并行加密和解密每个分组,效率较高。
⚝ 缺点:
▮▮▮▮⚝ 安全性差 (Poor Security):相同的明文分组会被加密成相同的密文分组。这使得 ECB 模式容易受到密码本攻击 (Codebook Attack) 和模式识别攻击 (Pattern Recognition Attack)。如果明文中存在重复的模式,密文中也会暴露出相同的模式。
▮▮▮▮⚝ 不适合加密长消息或结构化数据。
ECB 模式的应用场景:
ECB 模式通常不建议用于加密长消息或结构化数据。它可能适用于加密少量随机数据,例如密钥或初始化向量 (Initialization Vector, IV)。但在大多数情况下,应避免使用 ECB 模式,而选择更安全的工作模式。
3.2.3.2 密码分组链接模式 CBC (Cipher Block Chaining CBC)
密码分组链接模式 (Cipher Block Chaining, CBC) 是一种比 ECB 模式更安全的工作模式。CBC 模式在加密每个明文分组之前,先将其与前一个密文分组进行异或运算。为了加密第一个明文分组,需要使用一个初始化向量 (IV)。
加密过程 (Encryption):
1. 生成一个随机的初始化向量 IV。
2. 对于第一个明文分组 \(P_1\),计算密文分组 \(C_1\):
\[ C_1 = E_K(P_1 \oplus IV) \]
3. 对于后续的明文分组 \(P_i\) (\(i > 1\)),计算密文分组 \(C_i\):
\[ C_i = E_K(P_i \oplus C_{i-1}) \]
密文序列为 \(IV, C_1, C_2, ..., C_n\)。初始化向量 IV 通常会附加在密文的前面一起传输。
解密过程 (Decryption):
1. 从接收到的密文中获取初始化向量 IV 和密文分组 \(C_1, C_2, ..., C_n\)。
2. 对于第一个密文分组 \(C_1\),计算明文分组 \(P_1\):
\[ P_1 = D_K(C_1) \oplus IV \]
3. 对于后续的密文分组 \(C_i\) (\(i > 1\)),计算明文分组 \(P_i\):
\[ P_i = D_K(C_i) \oplus C_{i-1} \]
CBC 模式的优缺点:
⚝ 优点:
▮▮▮▮⚝ 安全性较高 (Improved Security):即使明文中存在相同的分组,由于每个分组都与前一个密文分组进行了异或运算,因此相同的明文分组会被加密成不同的密文分组。CBC 模式能够抵抗密码本攻击和模式识别攻击。
▮▮▮▮⚝ 广泛应用于各种安全协议和应用中。
⚝ 缺点:
▮▮▮▮⚝ 串行加密 (Sequential Encryption):加密过程是串行的,无法并行加密多个分组,效率相对较低。
▮▮▮▮⚝ 错误传播 (Error Propagation):如果一个密文分组在传输过程中发生错误,错误会影响到当前分组和后续分组的解密。
▮▮▮▮⚝ 需要初始化向量 IV,IV 的安全管理也很重要。IV 应该是随机的或不可预测的,但不需要保密,可以公开传输。
CBC 模式的应用场景:
CBC 模式适用于需要加密长消息或结构化数据的场景,例如文件加密、网络通信加密等。在 TLS/SSL 协议和 IPsec 协议中,CBC 模式也是常用的工作模式之一。
3.2.3.3 计数器模式 CTR (Counter CTR)
计数器模式 (Counter, CTR) 是一种将分组密码转换为流密码的工作模式。CTR 模式通过使用一个计数器 (counter) 来生成密钥流,然后将密钥流与明文进行异或运算来加密。
加密过程 (Encryption):
1. 选择一个初始计数器值 \(CTR_0\),通常是一个随机数或nonce。
2. 对于第 \(i\) 个明文分组 \(P_i\),计算密钥流分组 \(K_i\):
\[ K_i = E_K(CTR_{i-1}) \]
其中,\(CTR_{i-1}\) 是前一个计数器值,\(CTR_0\) 是初始计数器值。计数器值通常以固定的步长递增,例如每次递增 1。
3. 计算密文分组 \(C_i\):
\[ C_i = P_i \oplus K_i \]
密文序列为 \(CTR_0, C_1, C_2, ..., C_n\)。初始计数器值 \(CTR_0\) 通常会附加在密文的前面一起传输。
解密过程 (Decryption):
解密过程与加密过程类似,只是将密文与密钥流进行异或运算:
1. 从接收到的密文中获取初始计数器值 \(CTR_0\) 和密文分组 \(C_1, C_2, ..., C_n\)。
2. 对于第 \(i\) 个密文分组 \(C_i\),计算密钥流分组 \(K_i\):
\[ K_i = E_K(CTR_{i-1}) \]
3. 计算明文分组 \(P_i\):
\[ P_i = C_i \oplus K_i \]
CTR 模式的优缺点:
⚝ 优点:
▮▮▮▮⚝ 并行加密和解密 (Parallel Encryption and Decryption):CTR 模式可以并行加密和解密多个分组,效率很高。
▮▮▮▮⚝ 随机访问 (Random Access):可以随机访问密文的任何分组进行解密,无需解密前面的分组。
▮▮▮▮⚝ 没有错误传播 (No Error Propagation):一个密文分组的错误不会影响到其他分组的解密。
▮▮▮▮⚝ 可以将分组密码转换为流密码,适用于流式数据加密。
⚝ 缺点:
▮▮▮▮⚝ 需要保证计数器值的唯一性 (Counter Uniqueness):必须保证计数器值在加密过程中不会重复使用,否则会破坏安全性。通常使用 nonce 或随机数作为初始计数器值,并确保计数器递增步长足够小,以避免重复。
▮▮▮▮⚝ 需要初始计数器值 \(CTR_0\),\(CTR_0\) 的安全管理也很重要。\(CTR_0\) 应该是随机的或nonce,但不需要保密,可以公开传输。
CTR 模式的应用场景:
CTR 模式适用于对效率要求较高,需要并行处理或随机访问的场景,例如高速网络通信、磁盘加密、流媒体加密等。在 TLS/SSL 协议和 IPsec 协议中,CTR 模式也得到了广泛应用。
3.2.3.4 伽罗瓦/计数器模式 GCM (Galois/Counter Mode GCM)
伽罗瓦/计数器模式 (Galois/Counter Mode, GCM) 是一种提供认证加密 (Authenticated Encryption) 的工作模式。GCM 模式在 CTR 模式的基础上,增加了消息认证码 (Message Authentication Code, MAC) 的功能,可以同时提供加密和数据完整性保护。
GCM 模式的组成:
GCM 模式由两部分组成:
1. CTR 模式加密 (CTR Mode Encryption):使用 CTR 模式对明文进行加密,生成密文。
2. 伽罗瓦认证 (Galois Authentication):使用伽罗瓦域 (Galois Field) 运算生成认证标签 (Authentication Tag),用于数据完整性校验。
加密过程 (Encryption):
1. 选择一个初始计数器值 \(CTR_0\),通常是一个随机数或nonce。
2. 使用 CTR 模式加密明文分组 \(P_1, P_2, ..., P_n\),生成密文分组 \(C_1, C_2, ..., C_n\)。
3. 计算认证标签 Tag:GCM 使用 GHASH 函数计算认证标签。GHASH 函数基于伽罗瓦域 \(GF(2^{128})\) 上的多项式运算。GHASH 的输入包括密文分组 \(C_1, C_2, ..., C_n\),附加认证数据 (Additional Authenticated Data, AAD),以及一个密钥 \(H\)(由加密密钥 \(K\) 派生而来)。
4. 将认证标签 Tag 附加到密文后面,形成最终的输出。
解密过程 (Decryption):
1. 使用 CTR 模式解密密文分组 \(C_1, C_2, ..., C_n\),恢复明文分组 \(P_1, P_2, ..., P_n\)。
2. 使用 GHASH 函数重新计算接收到的密文和 AAD 的认证标签 Tag'。
3. 将计算出的认证标签 Tag' 与接收到的认证标签 Tag 进行比较。如果两者一致,则数据完整性校验通过,解密后的明文是可信的;否则,数据可能被篡改,解密后的明文不可信。
GCM 模式的优缺点:
⚝ 优点:
▮▮▮▮⚝ 认证加密 (Authenticated Encryption):GCM 模式同时提供加密和数据完整性保护,能够抵抗机密性攻击和完整性攻击。
▮▮▮▮⚝ 高性能 (High Performance):CTR 模式的并行加密和解密特性,以及 GHASH 函数的高效实现,使得 GCM 模式具有很高的性能。
▮▮▮▮⚝ 广泛应用 (Widely Used):GCM 模式已成为现代安全协议和应用的首选认证加密模式,例如 TLS 1.3, IPsec, SSH, AEAD_AES_GCM 密码套件等。
⚝ 缺点:
▮▮▮▮⚝ 实现复杂度较高 (Implementation Complexity):GCM 模式的实现相对复杂,需要正确实现 CTR 模式和 GHASH 函数,并注意防止侧信道攻击 (Side-Channel Attack)。
▮▮▮▮⚝ Nonce 管理 (Nonce Management):GCM 模式对 nonce 的管理要求严格。nonce 必须是唯一的,且不能重复使用相同的 nonce 和密钥加密不同的消息。nonce 的错误管理可能导致严重的安全漏洞。
GCM 模式的应用场景:
GCM 模式适用于对安全性、性能和数据完整性都有较高要求的场景,例如安全网络通信、云存储、数据备份等。在需要认证加密的场合,GCM 模式通常是最佳选择。
3.3 流密码 (Stream Ciphers)
流密码 (Stream Ciphers) 是另一类重要的对称密钥密码算法。流密码将明文按比特或字节逐位加密,而不是像分组密码那样按固定大小的分组加密。流密码通过密钥流生成器 (keystream generator) 生成一个伪随机密钥流,然后将密钥流与明文流进行异或运算来加密。
3.3.1 RC4
RC4 (Rivest Cipher 4) 是一种广泛使用的流密码算法,由 Ron Rivest 在 1987 年设计。RC4 曾经是 SSL/TLS 协议和 WEP/WPA 无线加密协议的重要组成部分。然而,由于 RC4 存在多个安全漏洞,已被现代安全标准逐渐淘汰。
① RC4 算法概述:
⚝ 密钥长度 (Key Length):可变长度,通常使用 40 比特到 2048 比特的密钥长度。
⚝ 密钥流生成器 (Keystream Generator):RC4 的核心是一个伪随机数生成器 (PRNG),它基于一个 256 字节的状态数组 S 和两个索引 i 和 j。
⚝ 简单高效 (Simple and Efficient):RC4 算法结构简单,易于实现,加解密速度快。
② RC4 算法流程:
1. 密钥调度算法 KSA (Key Scheduling Algorithm):
KSA 初始化状态数组 S,并根据密钥对 S 进行混洗 (shuffle)。
▮▮▮▮⚝ 初始化状态数组 S:将 S[0] 到 S[255] 分别赋值为 0 到 255。
▮▮▮▮⚝ 使用密钥 K 混洗 S:
1
j = 0
2
for i = 0 to 255:
3
j = (j + S[i] + K[i mod keylen]) mod 256
4
swap(S[i], S[j])
其中,K 是密钥,keylen 是密钥长度。
- 伪随机数生成器 PRGA (Pseudo-Random Generation Algorithm):
PRGA 生成密钥流的每个字节。
▮▮▮▮⚝ 初始化索引 i = 0, j = 0。
▮▮▮▮⚝ 循环生成密钥流字节:
1
i = (i + 1) mod 256
2
j = (j + S[i]) mod 256
3
swap(S[i], S[j])
4
K = S[(S[i] + S[j]) mod 256] // 生成密钥流字节 K
输出密钥流字节 K,并重复循环生成后续的密钥流字节。
- 加密和解密 (Encryption and Decryption):
将明文流与密钥流进行异或运算,得到密文流。由于异或运算的自反性,加密和解密过程相同。
\[ C_i = P_i \oplus K_i \]
\[ P_i = C_i \oplus K_i \]
③ RC4 的安全性:
RC4 算法在早期被认为是安全的,但随着时间的推移,研究人员发现了 RC4 存在多个安全漏洞,主要包括:
⚝ 初始密钥流偏差 (Initial Keystream Bias):RC4 生成的初始密钥流存在统计偏差,某些字节出现的概率高于其他字节。这使得攻击者可以通过统计分析来区分密钥流和真随机序列。
⚝ 弱密钥 (Weak Keys):存在一些弱密钥,使用这些弱密钥生成的密钥流更容易被预测。
⚝ 重用密钥攻击 (Key Reuse Attack):如果使用相同的密钥加密多条消息,RC4 容易受到重用密钥攻击。
由于这些安全漏洞,RC4 已被认为是不安全的,不应再用于新的安全系统。现代安全协议和应用已经逐渐淘汰 RC4,并转向更安全的流密码算法,如 ChaCha20。
3.3.2 ChaCha20
ChaCha20 是 Daniel J. Bernstein 设计的一种高性能、高安全的流密码算法。ChaCha20 算法在 Google Chrome 浏览器、Android 操作系统等广泛应用,并被 IETF 采纳为 RFC 7539 标准。ChaCha20 被认为是 RC4 的安全替代品。
① ChaCha20 算法概述:
⚝ 密钥长度 (Key Length):256 比特。
⚝ Nonce 长度 (Nonce Length):96 比特。
⚝ 计数器长度 (Counter Length):32 比特。
⚝ 轮数 (Number of Rounds):20 轮 (ChaCha20), 12 轮 (ChaCha12), 8 轮 (ChaCha8)。通常使用 ChaCha20。
⚝ ARX 设计 (Addition-Rotation-XOR Design):ChaCha20 基于 ARX 设计原则,只使用加法、循环移位和异或运算,易于硬件和软件实现,且具有良好的性能。
② ChaCha20 算法流程:
1. 状态初始化 (State Initialization):
ChaCha20 的状态是一个 4x4 的 128 比特矩阵,共 512 比特。状态矩阵的初始化包括:
▮▮▮▮⚝ 常量 (Constants):固定常量 "expand 32-byte k"。
▮▮▮▮⚝ 密钥 (Key):256 比特密钥。
▮▮▮▮⚝ 计数器 (Counter):32 比特计数器,初始值为 0。
▮▮▮▮⚝ Nonce (Nonce):96 比特 nonce。
轮函数 (Round Function):
ChaCha20 的核心是轮函数,轮函数对状态矩阵进行多轮迭代变换。ChaCha20 使用 20 轮迭代,每轮迭代包括 4 个 quarter-round 操作。quarter-round 操作是对状态矩阵的四分之一进行变换。密钥流生成 (Keystream Generation):
经过 20 轮迭代后,将初始状态矩阵与迭代后的状态矩阵进行逐元素相加,得到密钥流块。ChaCha20 每次生成 512 比特的密钥流块。加密和解密 (Encryption and Decryption):
将明文流分成 512 比特的块,与密钥流块进行异或运算,得到密文块。加密和解密过程相同。
\[ C_i = P_i \oplus K_i \]
\[ P_i = C_i \oplus K_i \]
如果明文长度不是 512 比特的整数倍,则只使用密钥流块的前面部分字节。
- 计数器更新 (Counter Update):
每生成一个 512 比特的密钥流块后,将计数器值递增 1。如果计数器溢出,则停止生成密钥流。
③ ChaCha20 的安全性:
ChaCha20 算法具有很高的安全性,被认为是目前最安全的流密码算法之一。主要的安全优势包括:
⚝ 轮数足够多 (Sufficient Number of Rounds):ChaCha20 使用 20 轮迭代,提供了足够的安全裕度,能够抵抗各种已知的密码分析方法。
⚝ ARX 设计的安全性 (Security of ARX Design):ARX 设计原则使得 ChaCha20 具有良好的抗差分密码分析和线性密码分析能力。
⚝ Nonce 的使用 (Use of Nonce):ChaCha20 使用 96 比特 nonce,可以有效防止重用密钥攻击。只要保证 nonce 的唯一性,即使使用相同的密钥加密多条消息,也能保证安全性。
ChaCha20 的安全性得到了广泛的认可,并被认为是 RC4 和其他流密码算法的优秀替代品。
3.4 分组密码与流密码的比较 (Comparison of Block Ciphers and Stream Ciphers)
分组密码 (Block Ciphers) 和流密码 (Stream Ciphers) 是对称密钥密码学中的两类主要算法。它们在加密方式、性能特点、应用场景等方面存在一些差异。
特性 | 分组密码 (Block Ciphers) | 流密码 (Stream Ciphers) |
---|---|---|
加密方式 | 将明文分成固定大小的分组,逐分组加密。 | 将明文按比特或字节逐位加密。 |
密钥流 | 使用相同的密钥加密所有分组。 | 为每个比特或字节生成不同的密钥流,密钥流由密钥流生成器生成。 |
性能 | 加密速度相对较慢,但可以通过并行处理提高效率(如 CTR, GCM 模式)。 | 加密速度快,效率高,适合高速数据流加密。 |
错误传播 | CBC 模式存在错误传播,CTR, GCM 模式没有错误传播。 | 没有错误传播,一个比特的错误只影响解密后的对应比特。 |
随机访问 | CTR, GCM 模式支持随机访问。 | 支持随机访问。 |
实现复杂度 | 算法结构相对复杂,工作模式多样。 | 算法结构相对简单,实现容易。 |
安全性 | 高安全性,如 AES, 3DES, 工作模式的选择对安全性影响较大。 | 高安全性,如 ChaCha20, Salsa20。密钥流生成器的设计是安全关键。 |
应用场景 | 文件加密、磁盘加密、网络通信加密(如 TLS/SSL, IPsec)。 | 高速网络通信加密、流媒体加密、资源受限设备加密。 |
典型算法 | DES, 3DES, AES, SM4。 | RC4, ChaCha20, Salsa20, ZUC。 |
选择分组密码还是流密码:
选择分组密码还是流密码取决于具体的应用场景和需求:
⚝ 需要加密大量数据,且对加密速度要求较高:流密码通常是更好的选择,因为流密码的加密速度快,效率高。例如,在高速网络通信、流媒体加密等场景中,ChaCha20 等流密码算法具有优势。
⚝ 需要加密的数据量不大,且对安全性要求较高:分组密码通常是更好的选择,因为分组密码的安全性经过了更长时间的验证,且 AES 等分组密码算法的安全性非常高。例如,在文件加密、磁盘加密等场景中,AES 等分组密码算法更常用。
⚝ 需要认证加密:GCM 模式是一种认证加密的分组密码工作模式,可以同时提供加密和数据完整性保护,适用于对安全性要求较高的场景。
⚝ 资源受限设备:流密码算法通常比分组密码算法更轻量级,对计算资源和内存资源的要求更低,适用于资源受限的设备,如物联网设备、嵌入式系统等。
在实际应用中,分组密码和流密码常常结合使用,以满足不同的安全需求和性能需求。例如,TLS/SSL 协议同时支持 AES-GCM (分组密码认证加密模式) 和 ChaCha20-Poly1305 (流密码认证加密模式) 等多种密码套件,供用户根据实际情况选择。
4. chapter 4: 公钥密码学 (Public-key Cryptography)
4.1 公钥密码学概念 (Public-key Cryptography Concepts)
4.1.1 公钥与私钥 (Public Key and Private Key)
公钥密码学 (Public-key Cryptography),也称为非对称密码学 (Asymmetric Cryptography),是现代密码学的基石之一。与对称密钥密码学 (Symmetric-key Cryptography) 使用相同的密钥进行加密和解密不同,公钥密码学使用一对密钥:公钥 (Public Key) 和私钥 (Private Key)。
① 公钥 (Public Key):
⚝ 公钥可以公开分发,任何人都可以获取。
⚝ 公钥主要用于加密数据或验证数字签名。
⚝ 拥有公钥的人只能使用它来加密信息,而不能解密。
② 私钥 (Private Key):
⚝ 私钥必须严格保密,只有密钥对的拥有者才能知道。
⚝ 私钥主要用于解密用对应公钥加密的数据或生成数字签名。
⚝ 任何拥有私钥的人都可以解密用对应公钥加密的信息,并可以伪造数字签名。
公钥密码体制的核心特点:
① 密钥对 (Key Pair):每个用户都拥有一对密钥,即公钥和私钥。这两把密钥在数学上是相关的,但从公钥推导出私钥在计算上是不可行的。
② 非对称性 (Asymmetry):加密和解密使用不同的密钥,加密密钥(公钥)可以公开,而解密密钥(私钥)必须保密。
③ 安全性 (Security):安全性基于数学难题,例如大整数分解 (Integer Factorization Problem) 和离散对数问题 (Discrete Logarithm Problem)。
公钥密码学的优势:
① 密钥分发 (Key Distribution):解决了对称密码学中密钥分发难题。用户可以直接公开自己的公钥,无需通过安全信道传输密钥。
② 数字签名 (Digital Signature):支持数字签名,可以实现身份认证、数据完整性和不可否认性。
公钥密码学的应用场景:
① 安全通信 (Secure Communication):如 TLS/SSL 协议,用于保护网络通信的机密性和完整性。
② 数字签名 (Digital Signature):用于软件签名、电子邮件安全 (S/MIME, PGP)、电子证书等。
③ 身份认证 (Authentication):如 SSH 协议,用于远程登录和安全文件传输。
④ 数据加密 (Data Encryption):用于保护存储数据的机密性。
总结:公钥与私钥的非对称密钥对是公钥密码学的核心概念。公钥公开用于加密和验证,私钥保密用于解密和签名。这种机制极大地简化了密钥管理,并为数字签名等安全应用提供了基础。
4.1.2 单向陷门函数 (Trapdoor One-way Function)
单向陷门函数 (Trapdoor One-way Function) 是公钥密码学得以实现的关键数学工具。理解单向陷门函数对于深入理解公钥密码算法至关重要。
① 单向函数 (One-way Function):
⚝ 定义:一个函数 \( f: X \rightarrow Y \) 被称为单向函数,如果它满足以下两个条件:
▮▮▮▮ⓐ 对于任何输入 \( x \in X \),计算 \( y = f(x) \) 是容易的(计算高效)。
▮▮▮▮ⓑ 对于几乎所有的输出 \( y \in Y \),找到任何输入 \( x \) 使得 \( f(x) = y \) 在计算上是不可行的(计算困难)。
⚝ 直观理解:单向函数就像一个只能正向计算的“单行道”。从输入到输出很容易计算,但从输出反推输入则极其困难。
⚝ 例子:哈希函数 (Hash Function) 在一定程度上可以被视为单向函数。给定消息 \( m \),计算哈希值 \( H(m) \) 很容易,但已知哈希值 \( h \),找到消息 \( m \) 使得 \( H(m) = h \) 是非常困难的(原像攻击困难)。
② 陷门函数 (Trapdoor Function):
⚝ 定义:一个函数 \( f: X \rightarrow Y \) 被称为陷门函数,如果它满足以下三个条件:
▮▮▮▮ⓐ 对于任何输入 \( x \in X \),计算 \( y = f(x) \) 是容易的(计算高效)。
▮▮▮▮ⓑ 对于几乎所有的输出 \( y \in Y \),在不知道陷门信息 (Trapdoor Information) 的情况下,找到任何输入 \( x \) 使得 \( f(x) = y \) 在计算上是不可行的(计算困难)。
▮▮▮▮ⓒ 存在陷门信息 \( tk \),一旦知道陷门信息 \( tk \),对于给定的任何输出 \( y \in Y \),可以容易地计算出输入 \( x \) 使得 \( f(x) = y \) (利用陷门信息可以高效逆向计算)。
⚝ 直观理解:陷门函数是在单向函数的基础上增加了“陷门”信息。在不知道陷门的情况下,函数是单向的,难以逆转;但一旦掌握了陷门,就可以轻松地进行逆运算。
⚝ 例子:RSA 算法中使用的模幂运算 (Modular Exponentiation) 可以被视为陷门函数。
▮▮▮▮ⓐ 正向计算(加密):给定明文 \( m \) 和公钥 \( (n, e) \),计算密文 \( c = m^e \pmod{n} \) 是容易的。
▮▮▮▮ⓑ 逆向计算(解密):在不知道私钥 \( d \) 的情况下,即不知道陷门信息,从密文 \( c \) 反推明文 \( m \) 是困难的(大整数分解难题)。
▮▮▮▮ⓒ 陷门信息:私钥 \( d \) 就是陷门信息。知道私钥 \( d \),可以容易地计算 \( m = c^d \pmod{n} \)。
单向陷门函数在公钥密码学中的作用:
① 公钥加密 (Public-key Encryption):
⚝ 公钥密码算法通常基于单向陷门函数构建。
⚝ 公钥对应于单向陷门函数的正向计算,用于加密信息。
⚝ 私钥对应于陷门信息,用于解密信息。只有掌握私钥的人才能利用陷门轻松解密。
② 数字签名 (Digital Signature):
⚝ 数字签名也依赖于单向陷门函数。
⚝ 私钥用于生成签名,利用陷门进行正向计算。
⚝ 公钥用于验证签名,进行单向函数的正向计算,验证签名的有效性。
总结:单向陷门函数是公钥密码学的核心数学概念。它保证了在没有特定“陷门”信息的情况下,从输出反推输入是计算上不可行的,而拥有陷门信息的人则可以轻松完成逆运算。RSA、椭圆曲线密码学等公钥密码算法都建立在不同的单向陷门函数之上。理解单向陷门函数有助于深入理解公钥密码学的安全性基础。
4.2 RSA 算法 (RSA Algorithm)
RSA 算法是目前应用最广泛的公钥密码算法之一。它由 Ron Rivest、Adi Shamir 和 Leonard Adleman 在 1977 年共同提出,并以他们名字的首字母命名。RSA 算法基于大整数分解 (Integer Factorization Problem) 的数学难题,被广泛应用于数据加密和数字签名。
4.2.1 RSA 算法原理 (RSA Algorithm Principles)
RSA 算法的安全性基于大整数分解的困难性。其核心原理可以概括为以下几个步骤:
① 密钥生成 (Key Generation):
⚝ 选择两个互异的大素数 \( p \) 和 \( q \)。
⚝ 计算模数 \( n = p \times q \)。
⚝ 计算欧拉函数 (Euler's totient function) \( \phi(n) = (p-1)(q-1) \)。
⚝ 选择一个整数 \( e \),满足 \( 1 < e < \phi(n) \) 且 \( \gcd(e, \phi(n)) = 1 \),即 \( e \) 和 \( \phi(n) \) 互质。\( e \) 通常选择较小的素数,如 65537。
⚝ 计算 \( e \) 关于模 \( \phi(n) \) 的模逆元 \( d \),即找到整数 \( d \) 满足 \( e \cdot d \equiv 1 \pmod{\phi(n)} \)。可以使用扩展欧几里得算法 (Extended Euclidean Algorithm) 计算 \( d \)。
⚝ 公钥 (Public Key) 为 \( (n, e) \)。
⚝ 私钥 (Private Key) 为 \( (n, d) \)。
② 加密 (Encryption):
⚝ 假设明文消息为 \( m \),且 \( 0 \le m < n \)。如果明文消息 \( m \ge n \),需要将明文消息分块处理,保证每个明文块 \( m_i < n \)。
⚝ 使用公钥 \( (n, e) \) 对明文 \( m \) 进行加密,得到密文 \( c \)。
⚝ 加密公式:\( c = m^e \pmod{n} \)。
③ 解密 (Decryption):
⚝ 使用私钥 \( (n, d) \) 对密文 \( c \) 进行解密,恢复明文 \( m \)。
⚝ 解密公式:\( m = c^d \pmod{n} \)。
RSA 算法原理的数学基础:
① 欧拉定理 (Euler's Theorem):如果 \( \gcd(a, n) = 1 \),则 \( a^{\phi(n)} \equiv 1 \pmod{n} \)。
② 模逆元 (Modular Multiplicative Inverse):如果 \( \gcd(e, \phi(n)) = 1 \),则存在整数 \( d \) 使得 \( e \cdot d \equiv 1 \pmod{\phi(n)} \)。这个 \( d \) 就是 \( e \) 关于模 \( \phi(n) \) 的模逆元。
③ 解密过程的正确性:
由于 \( e \cdot d \equiv 1 \pmod{\phi(n)} \),可以表示为 \( e \cdot d = k \cdot \phi(n) + 1 \),其中 \( k \) 是整数。
根据欧拉定理,如果 \( \gcd(m, n) = 1 \),则 \( m^{\phi(n)} \equiv 1 \pmod{n} \)。
因此,\( c^d \equiv (m^e)^d \equiv m^{e \cdot d} \equiv m^{k \cdot \phi(n) + 1} \equiv (m^{\phi(n)})^k \cdot m^1 \equiv 1^k \cdot m \equiv m \pmod{n} \)。
即使 \( \gcd(m, n) \neq 1 \),RSA 解密在大多数情况下仍然成立(除了极小概率的情况)。更严谨的证明需要使用中国剩余定理 (Chinese Remainder Theorem)。
总结:RSA 算法基于模幂运算和模逆元运算。其加密过程使用公钥 \( (n, e) \) 进行模 \( n \) 的 \( e \) 次幂运算,解密过程使用私钥 \( (n, d) \) 进行模 \( n \) 的 \( d \) 次幂运算。算法的安全性依赖于大整数分解的困难性,即从公钥 \( (n, e) \) 很难分解出 \( n = p \times q \),从而无法计算出 \( \phi(n) \) 和私钥 \( d \)。
4.2.2 RSA 密钥生成 (RSA Key Generation)
RSA 密钥生成是 RSA 算法安全性的基础。高质量的密钥生成过程至关重要。以下是 RSA 密钥生成的详细步骤:
① 选择两个大素数 \( p \) 和 \( q \):
⚝ 素数选择的重要性:\( p \) 和 \( q \) 必须是大素数,且长度足够。通常选择 2048 位或 4096 位的素数,以保证足够的安全性。
⚝ 素数生成方法:可以使用概率性素性检验算法 (Probabilistic Primality Test),如 Miller-Rabin 素性检验算法,快速生成大素数。
⚝ 互异性要求:\( p \) 和 \( q \) 必须是互异的,即 \( p \neq q \)。如果 \( p = q \),则 \( n = p^2 \),\( \phi(n) = p(p-1) \),安全性会降低。
⚝ 安全素数:为了增强安全性,有时会选择安全素数 (Safe Prime)。安全素数 \( p \) 满足 \( p = 2p' + 1 \),其中 \( p' \) 也是素数。例如,23 是一个安全素数,因为 \( 23 = 2 \times 11 + 1 \),且 11 也是素数。使用安全素数可以抵抗某些特定的攻击。
② 计算模数 \( n = p \times q \):
⚝ 模数 \( n \) 是公钥和私钥的一部分,需要公开。
⚝ \( n \) 的长度决定了 RSA 密钥的长度,例如,如果 \( p \) 和 \( q \) 都是 1024 位素数,则 \( n \) 是 2048 位。
③ 计算欧拉函数 \( \phi(n) = (p-1)(q-1) \):
⚝ 欧拉函数 \( \phi(n) \) 的值是小于等于 \( n \) 且与 \( n \) 互质的正整数的个数。
⚝ 由于 \( n = p \times q \),且 \( p \) 和 \( q \) 都是素数,所以 \( \phi(n) = (p-1)(q-1) \)。
⚝ \( \phi(n) \) 的值必须保密,因为计算私钥 \( d \) 需要用到 \( \phi(n) \)。如果泄露了 \( \phi(n) \),攻击者可以很容易地计算出私钥 \( d \)。
④ 选择公钥指数 \( e \):
⚝ \( e \) 需要满足 \( 1 < e < \phi(n) \) 且 \( \gcd(e, \phi(n)) = 1 \)。
⚝ 通常选择较小的素数作为 \( e \),例如 3, 5, 17, 65537 ( \( 2^{16} + 1 \) )。
⚝ 选择小的 \( e \) 可以提高加密速度,因为模幂运算的指数越小,计算速度越快。
⚝ 最常用的 \( e \) 值是 65537。它是一个费马素数 (Fermat Prime),既不太大也不太小,在安全性和效率之间取得了较好的平衡。
⚝ 避免选择太小的 \( e \),例如 \( e = 3 \)。如果使用相同的 \( e = 3 \) 加密少量不同的消息,可能会受到 Hastad's Broadcast Attack 等攻击。在实际应用中,通常会使用填充 (Padding) 技术来缓解这类攻击。
⑤ 计算私钥指数 \( d \):
⚝ \( d \) 是 \( e \) 关于模 \( \phi(n) \) 的模逆元,即 \( e \cdot d \equiv 1 \pmod{\phi(n)} \)。
⚝ 可以使用扩展欧几里得算法 (Extended Euclidean Algorithm) 计算 \( d \)。
⚝ 扩展欧几里得算法可以找到整数 \( d \) 和 \( k \) 满足 \( e \cdot d + \phi(n) \cdot k = \gcd(e, \phi(n)) \)。由于 \( \gcd(e, \phi(n)) = 1 \),所以 \( e \cdot d + \phi(n) \cdot k = 1 \),即 \( e \cdot d \equiv 1 \pmod{\phi(n)} \)。
⚝ 私钥指数 \( d \) 必须严格保密。一旦泄露,任何人都可以解密用对应公钥加密的信息,并伪造数字签名。
⑥ 公钥和私钥发布与存储:
⚝ 公钥 \( (n, e) \) 可以公开分发。
⚝ 私钥 \( (n, d) \) 必须安全存储,只有密钥对的拥有者才能访问。可以使用硬件安全模块 (HSM)、可信执行环境 (TEE) 等安全措施来保护私钥。
RSA 密钥生成流程总结:
1
1. 选择两个大素数 p 和 q (p ≠ q)。
2
2. 计算模数 n = p × q。
3
3. 计算欧拉函数 φ(n) = (p-1)(q-1)。
4
4. 选择公钥指数 e (1 < e < φ(n) 且 gcd(e, φ(n)) = 1)。
5
5. 计算私钥指数 d (e ⋅ d ≡ 1 mod φ(n))。
6
6. 公钥为 (n, e),私钥为 (n, d)。
示例:一个简单的 RSA 密钥生成示例(实际应用中需要使用更大的素数):
1
1. 选择素数 p = 61, q = 53。
2
2. 计算模数 n = p × q = 61 × 53 = 3233。
3
3. 计算欧拉函数 φ(n) = (p-1)(q-1) = (61-1) × (53-1) = 60 × 52 = 3120。
4
4. 选择公钥指数 e = 17 (gcd(17, 3120) = 1)。
5
5. 计算私钥指数 d,使得 17 ⋅ d ≡ 1 mod 3120。使用扩展欧几里得算法计算得到 d = 2753。
6
6. 公钥为 (n, e) = (3233, 17),私钥为 (n, d) = (3233, 2753)。
4.2.3 RSA 加密与解密 (RSA Encryption and Decryption)
RSA 加密和解密过程基于模幂运算。掌握其流程和注意事项对于正确使用 RSA 算法至关重要。
① RSA 加密过程:
⚝ 输入:明文消息 \( m \) ( \( 0 \le m < n \) ),公钥 \( (n, e) \)。
⚝ 输出:密文 \( c \)。
⚝ 加密公式:\( c = m^e \pmod{n} \)。
⚝ 加密步骤:
▮▮▮▮ⓐ 明文分块:如果明文消息 \( M \) 的长度大于模数 \( n \) 的长度,需要将明文消息 \( M \) 分割成若干个块 \( m_1, m_2, \ldots, m_k \),使得每个明文块 \( m_i \) 满足 \( 0 \le m_i < n \)。常用的分块方法是按照模数 \( n \) 的长度进行分割。
▮▮▮▮ⓑ 模幂运算:对每个明文块 \( m_i \),计算密文块 \( c_i = m_i^e \pmod{n} \)。
▮▮▮▮ⓒ 密文拼接:将所有密文块 \( c_1, c_2, \ldots, c_k \) 拼接起来,得到最终的密文 \( C \)。
⚝ 加密示例(使用上一节生成的密钥):
公钥 \( (n, e) = (3233, 17) \)。
假设明文消息 \( m = 123 \)。
加密计算:\( c = 123^{17} \pmod{3233} \)。
使用模幂运算快速算法(如平方乘算法)计算得到 \( c = 855 \)。
因此,明文 123 加密后的密文为 855。
② RSA 解密过程:
⚝ 输入:密文 \( c \),私钥 \( (n, d) \)。
⚝ 输出:明文消息 \( m \)。
⚝ 解密公式:\( m = c^d \pmod{n} \)。
⚝ 解密步骤:
▮▮▮▮ⓐ 密文分块:如果密文 \( C \) 是由多个密文块 \( c_1, c_2, \ldots, c_k \) 拼接而成,需要将密文 \( C \) 分割成对应的密文块。
▮▮▮▮ⓑ 模幂运算:对每个密文块 \( c_i \),计算明文块 \( m_i = c_i^d \pmod{n} \)。
▮▮▮▮ⓒ 明文拼接:将所有明文块 \( m_1, m_2, \ldots, m_k \) 拼接起来,得到原始明文消息 \( M \)。
⚝ 解密示例(使用上一节生成的密钥):
私钥 \( (n, d) = (3233, 2753) \)。
密文 \( c = 855 \)。
解密计算:\( m = 855^{2753} \pmod{3233} \)。
使用模幂运算快速算法计算得到 \( m = 123 \)。
因此,密文 855 解密后的明文为 123,成功恢复了原始明文。
③ 模幂运算的效率:
⚝ RSA 加密和解密的核心操作都是模幂运算 \( a^b \pmod{n} \)。
⚝ 直接计算 \( a^b \) 会非常耗时,特别是当指数 \( b \) 很大时。
⚝ 平方乘算法 (Square-and-Multiply Algorithm) 是一种高效的模幂运算方法,可以将时间复杂度降低到 \( O(\log b) \)。
⚝ 平方乘算法的基本思想是利用指数 \( b \) 的二进制表示,将幂运算分解为一系列的平方和乘法运算。
平方乘算法示例:计算 \( 123^{17} \pmod{3233} \)。
指数 \( e = 17 \) 的二进制表示为 \( (10001)_2 \)。
1
初始化 result = 1
2
从高位到低位扫描指数 17 的二进制表示:
3
位 1:result = (result * result) mod 3233 = (1 * 1) mod 3233 = 1, result = (result * 123) mod 3233 = (1 * 123) mod 3233 = 123
4
位 0:result = (result * result) mod 3233 = (123 * 123) mod 3233 = 15129 mod 3233 = 2280
5
位 0:result = (result * result) mod 3233 = (2280 * 2280) mod 3233 = 5198400 mod 3233 = 1547
6
位 0:result = (result * result) mod 3233 = (1547 * 1547) mod 3233 = 2393109 mod 3233 = 2633
7
位 1:result = (result * result) mod 3233 = (2633 * 2633) mod 3233 = 6932689 mod 3233 = 855, result = (result * 123) mod 3233 = (855 * 123) mod 3233 = 105165 mod 3233 = 855
8
最终结果为 855。
RSA 加密和解密过程的注意事项:
① 明文长度限制:为了保证安全性,RSA 加密的明文长度必须小于模数 \( n \) 的长度。如果明文过长,需要进行分块处理。
② 填充 (Padding):为了增强 RSA 的安全性,防止某些特定攻击(如选择密文攻击),通常需要使用填充方案 (Padding Scheme)。常用的填充方案包括 PKCS#1 v1.5 填充和 OAEP (Optimal Asymmetric Encryption Padding) 填充。OAEP 填充方案被认为更加安全。
③ 密钥管理:私钥必须安全保管,公钥可以公开分发。密钥的安全性直接关系到 RSA 算法的安全性。
4.2.4 RSA 的安全性分析 (Security Analysis of RSA)
RSA 算法的安全性主要依赖于大整数分解 (Integer Factorization Problem) 的困难性。本节将深入分析 RSA 的安全性,包括其安全基础、常见的攻击方式以及应对策略。
① RSA 的安全基础:大整数分解难题:
⚝ 大整数分解问题:给定一个大合数 \( n \),找到其素因子分解 \( n = p \times q \)。当 \( p \) 和 \( q \) 都是大素数时,分解 \( n \) 在计算上是非常困难的。
⚝ RSA 安全性假设:RSA 算法的安全性基于以下假设:对于足够大的模数 \( n = p \times q \),在多项式时间内分解 \( n \) 是不可行的。
⚝ 密钥长度与安全性:RSA 密钥的长度(即模数 \( n \) 的位数)直接影响其安全性。密钥长度越长,分解 \( n \) 的难度越大,安全性越高。目前常用的 RSA 密钥长度为 2048 位和 4096 位。随着计算能力的提升,建议逐渐增加密钥长度。
② 常见的 RSA 攻击方式:
⚝ 暴力分解攻击 (Brute-force Factorization Attack):
▮▮▮▮ⓐ 原理:尝试所有可能的素数对 \( (p, q) \) 来分解模数 \( n \)。
▮▮▮▮ⓑ 防御:选择足够大的素数 \( p \) 和 \( q \),保证模数 \( n \) 的长度足够长(如 2048 位以上)。对于当前的计算能力,暴力分解攻击在实际中是不可行的。
⚝ 费马分解法 (Fermat's Factorization Method):
▮▮▮▮ⓐ 原理:当 \( p \) 和 \( q \) 接近时,\( n = p \times q \) 可以被快速分解。费马分解法利用平方差公式 \( n = x^2 - y^2 = (x+y)(x-y) \) 来分解 \( n \)。
▮▮▮▮ⓑ 防御:在生成 RSA 密钥时,选择远离的素数 \( p \) 和 \( q \),避免 \( p \) 和 \( q \) 太过接近。
⚝ 共模攻击 (Common Modulus Attack):
▮▮▮▮ⓐ 场景:如果多个用户使用相同的模数 \( n \),但使用不同的公钥指数 \( e_1, e_2, \ldots \) 加密消息,可能会导致安全问题。
▮▮▮▮ⓑ 原理:假设两个用户 A 和 B 使用相同的模数 \( n \),公钥分别为 \( (n, e_1) \) 和 \( (n, e_2) \),且 \( \gcd(e_1, e_2) = 1 \)。如果攻击者截获了同一明文 \( m \) 分别用 \( e_1 \) 和 \( e_2 \) 加密的密文 \( c_1 = m^{e_1} \pmod{n} \) 和 \( c_2 = m^{e_2} \pmod{n} \),攻击者可以计算出明文 \( m \)。
▮▮▮▮ⓒ 防御:绝对避免多个用户共享同一个模数 \( n \)。每个用户应该生成自己独立的 RSA 密钥对。
⚝ 低加密指数攻击 (Small Encryption Exponent Attack):
▮▮▮▮ⓐ 场景:如果公钥指数 \( e \) 选择得太小,例如 \( e = 3 \),可能会受到攻击。
▮▮▮▮ⓑ Hastad's Broadcast Attack (广播攻击):如果使用相同的低指数 \( e \) 加密同一个消息 \( m \) 发送给多个接收者,攻击者可以通过中国剩余定理 (Chinese Remainder Theorem) 恢复明文 \( m \)。
▮▮▮▮ⓒ 防御:
▮▮▮▮▮▮▮▮❹ 避免使用过小的公钥指数 \( e \)。常用的安全公钥指数是 65537。
▮▮▮▮▮▮▮▮❺ 使用填充 (Padding) 技术,例如 OAEP 填充,在加密前对明文进行随机化处理,防止广播攻击。
⚝ 选择密文攻击 (Chosen-ciphertext Attack):
▮▮▮▮ⓐ 原理:攻击者可以选择一些密文,并获得解密后的明文。利用这些信息来破解密钥或解密目标密文。
▮▮▮▮ⓑ 防御:使用抗选择密文攻击的填充方案,例如 OAEP 填充。OAEP 填充在加密过程中引入了随机性和哈希运算,增强了 RSA 的抗攻击能力。
⚝ 时间攻击 (Timing Attack):
▮▮▮▮ⓐ 原理:通过测量解密运算的时间,分析时间差异,从而泄露私钥信息。模幂运算的执行时间会受到密钥位的影响。
▮▮▮▮ⓑ 防御:
▮▮▮▮▮▮▮▮❸ 采用恒定时间算法 (Constant-time Algorithm) 实现模幂运算,使运算时间与密钥无关。
▮▮▮▮▮▮▮▮❹ 引入随机延迟,使时间测量变得不可靠。
③ 量子计算的威胁 (Quantum Computing Threat):
⚝ Shor 算法:量子计算机上的 Shor 算法可以在多项式时间内分解大整数,这将彻底破解 RSA 算法。
⚝ 当前状态:目前量子计算机还处于发展初期,尚未对 RSA 构成实际威胁。但是,随着量子计算技术的发展,RSA 的长期安全性面临挑战。
⚝ 应对策略:后量子密码学 (Post-Quantum Cryptography):
▮▮▮▮ⓐ 积极研究和发展后量子密码算法,例如格密码 (Lattice-based Cryptography)、编码密码 (Code-based Cryptography)、多变量密码 (Multivariate Cryptography) 和哈希密码 (Hash-based Cryptography)。
▮▮▮▮ⓑ 提前布局和迁移到后量子密码算法,以应对未来量子计算的威胁。
RSA 安全性总结:
RSA 算法在经典计算环境下是相对安全的,其安全性主要依赖于大整数分解难题。为了保证 RSA 的安全性,需要:
① 选择足够长的密钥长度(2048 位或以上)。
② 选择安全的素数 \( p \) 和 \( q \),避免 \( p \) 和 \( q \) 太接近。
③ 使用安全的公钥指数 \( e \),避免过小的值。
④ 采用安全的填充方案,例如 OAEP 填充。
⑤ 防御各种已知的攻击方式,如共模攻击、低加密指数攻击、选择密文攻击和时间攻击。
⑥ 密切关注量子计算技术的发展,并积极研究和部署后量子密码算法,以应对未来的量子计算威胁。
4.3 Diffie-Hellman 密钥交换 (Diffie-Hellman Key Exchange)
Diffie-Hellman 密钥交换 (Diffie-Hellman Key Exchange) 是一种密钥协商协议,由 Whitfield Diffie 和 Martin Hellman 在 1976 年提出。它允许双方在不安全的信道上协商出一个共享密钥,而无需事先共享任何秘密信息。这个共享密钥可以用于后续的对称加密通信。Diffie-Hellman 密钥交换的安全性基于离散对数问题 (Discrete Logarithm Problem) 的困难性。
4.3.1 Diffie-Hellman 密钥交换原理 (Diffie-Hellman Key Exchange Principles)
Diffie-Hellman 密钥交换协议的步骤如下:
① 参数协商:
⚝ 参与密钥交换的双方(Alice 和 Bob)事先协商好两个公开的参数:
▮▮▮▮ⓐ 大素数 \( p \)。
▮▮▮▮ⓑ 生成元 \( g \),\( g \) 是模 \( p \) 乘法群 \( (\mathbb{Z}_p^*, \times) \) 的一个生成元。生成元 \( g \) 满足 \( \{g^1 \pmod{p}, g^2 \pmod{p}, \ldots, g^{p-1} \pmod{p}\} = \{1, 2, \ldots, p-1\} \)。通常选择较小的生成元,例如 2, 3, 5 等。
⚝ 参数 \( p \) 和 \( g \) 可以公开,甚至可以被攻击者知道。
② 密钥生成:
⚝ Alice 选择一个秘密整数 \( a \),作为她的私钥,\( 1 < a < p-1 \)。
⚝ Bob 选择一个秘密整数 \( b \),作为他的私钥,\( 1 < b < p-1 \)。
⚝ Alice 和 Bob 的私钥 \( a \) 和 \( b \) 必须保密。
③ 公钥计算与交换:
⚝ Alice 计算她的公钥 \( A = g^a \pmod{p} \),并将 \( A \) 发送给 Bob。
⚝ Bob 计算他的公钥 \( B = g^b \pmod{p} \),并将 \( B \) 发送给 Alice。
⚝ 公钥 \( A \) 和 \( B \) 可以通过不安全信道传输。
④ 共享密钥计算:
⚝ Alice 收到 Bob 的公钥 \( B \) 后,计算共享密钥 \( K_A = B^a \pmod{p} = (g^b)^a \pmod{p} = g^{ab} \pmod{p} \)。
⚝ Bob 收到 Alice 的公钥 \( A \) 后,计算共享密钥 \( K_B = A^b \pmod{p} = (g^a)^b \pmod{p} = g^{ab} \pmod{p} \)。
⚝ 由于 \( K_A = K_B = g^{ab} \pmod{p} \),Alice 和 Bob 协商出了相同的共享密钥 \( K = g^{ab} \pmod{p} \)。
Diffie-Hellman 密钥交换过程示意图:
1
Alice Bob
2
--------------------------------------------------
3
1. 选择秘密私钥 a 1. 选择秘密私钥 b
4
2. 计算公钥 A = g^a mod p 2. 计算公钥 B = g^b mod p
5
3. 发送公钥 A ------------------------->
6
3. 接收公钥 A
7
4. 发送公钥 B <-------------------------
8
4. 接收公钥 B
9
5. 计算共享密钥 K_A = B^a mod p 5. 计算共享密钥 K_B = A^b mod p
10
--------------------------------------------------
11
共享密钥 K = K_A = K_B = g^(ab) mod p
Diffie-Hellman 密钥交换原理的数学基础:
① 模幂运算 (Modular Exponentiation):协议中的公钥计算和共享密钥计算都基于模幂运算。
② 离散对数问题 (Discrete Logarithm Problem DLP):Diffie-Hellman 密钥交换的安全性基于离散对数问题的困难性。
⚝ 离散对数问题:给定 \( g, p, A = g^a \pmod{p} \),计算指数 \( a \) 在计算上是困难的。
⚝ D-H 密钥交换的安全性:攻击者可以监听信道,获取公开参数 \( p, g \) 和公钥 \( A = g^a \pmod{p}, B = g^b \pmod{p} \)。但是,攻击者需要计算离散对数才能得到私钥 \( a \) 或 \( b \),从而计算出共享密钥 \( g^{ab} \pmod{p} \)。由于离散对数问题是计算困难的,攻击者无法有效地计算出共享密钥。
Diffie-Hellman 密钥交换示例:
1
1. 参数协商:选择素数 p = 23,生成元 g = 5。
2
2. Alice 密钥生成:选择私钥 a = 6,计算公钥 A = 5^6 mod 23 = 8。
3
3. Bob 密钥生成:选择私钥 b = 15,计算公钥 B = 5^15 mod 23 = 19。
4
4. 公钥交换:Alice 发送 A = 8 给 Bob,Bob 发送 B = 19 给 Alice。
5
5. 共享密钥计算:
6
Alice 计算 K_A = B^a mod 23 = 19^6 mod 23 = 2。
7
Bob 计算 K_B = A^b mod 23 = 8^15 mod 23 = 2。
8
共享密钥 K = 2。
4.3.2 中间人攻击 (Man-in-the-Middle Attack)
Diffie-Hellman 密钥交换协议容易受到中间人攻击 (Man-in-the-Middle Attack)。中间人攻击是指攻击者 Eve 位于 Alice 和 Bob 之间,冒充 Alice 与 Bob 通信,同时冒充 Bob 与 Alice 通信,从而在 Alice 和 Bob 不知情的情况下窃听甚至篡改通信内容。
中间人攻击过程:
① 拦截参数交换:Alice 和 Bob 开始 Diffie-Hellman 密钥交换,Eve 拦截 Alice 发送给 Bob 的公钥 \( A = g^a \pmod{p} \) 和 Bob 发送给 Alice 的公钥 \( B = g^b \pmod{p} \)。
② 中间人密钥生成:Eve 选择自己的私钥 \( e \),计算公钥 \( E = g^e \pmod{p} \)。
③ 冒充身份:
⚝ Eve 将自己的公钥 \( E \) 发送给 Bob,冒充是 Alice 的公钥。Bob 接收到 \( E \) 后,误以为是 Alice 的公钥,并用自己的私钥 \( b \) 计算共享密钥 \( K_{B,E} = E^b \pmod{p} = g^{eb} \pmod{p} \)。
⚝ Eve 将自己的公钥 \( E \) 发送给 Alice,冒充是 Bob 的公钥。Alice 接收到 \( E \) 后,误以为是 Bob 的公钥,并用自己的私钥 \( a \) 计算共享密钥 \( K_{A,E} = E^a \pmod{p} = g^{ea} \pmod{p} \)。
④ 建立两个独立的共享密钥:
⚝ Alice 和 Eve 之间协商了一个共享密钥 \( K_{A,E} = g^{ea} \pmod{p} \)。
⚝ Bob 和 Eve 之间协商了一个共享密钥 \( K_{B,E} = g^{eb} \pmod{p} \)。
⚝ Alice 和 Bob 之间并没有直接协商出共享密钥,他们各自与 Eve 协商了一个密钥。
⑤ 中间人窃听与篡改:
⚝ 当 Alice 发送消息给 Bob 时,Alice 使用密钥 \( K_{A,E} \) 加密消息,发送给 Eve。
⚝ Eve 接收到密文后,使用密钥 \( K_{A,E} \) 解密消息,获取明文。
⚝ Eve 可以选择将原始消息转发给 Bob,也可以篡改消息后再用密钥 \( K_{B,E} \) 加密,发送给 Bob。
⚝ Bob 接收到密文后,使用密钥 \( K_{B,E} \) 解密消息,但 Bob 以为消息是 Alice 发来的,实际上消息可能已经被 Eve 窃听或篡改。
中间人攻击示意图:
1
Alice Eve Bob
2
-------------------------------------------------------------------------------------
3
1. 选择私钥 a, 计算 A = g^a mod p
4
2. 发送 A -------------------------> 拦截 A
5
选择私钥 e, 计算 E = g^e mod p
6
发送 E ------------------------->
7
接收 E (误以为是 A)
8
计算 K_B,E = E^b mod p
9
选择私钥 b, 计算 B = g^b mod p
10
发送 B <-------------------------
11
接收 B (误以为是 B)
12
计算 K_A,E = B^a mod p
13
接收 E (误以为是 B) <------------------------- 发送 E (冒充 B)
14
计算 K_A,E = E^a mod p
15
-------------------------------------------------------------------------------------
16
Alice 和 Eve 共享密钥 K_A,E = g^(ea) mod p
17
Bob 和 Eve 共享密钥 K_B,E = g^(eb) mod p
防御中间人攻击:
Diffie-Hellman 密钥交换协议本身不提供身份认证,因此容易受到中间人攻击。为了防御中间人攻击,需要引入身份认证机制。常用的方法包括:
① 数字证书 (Digital Certificate):
⚝ 使用数字证书对公钥进行签名认证。Alice 和 Bob 在交换公钥时,同时交换自己的数字证书。
⚝ 接收方验证数字证书的有效性,确认对方的身份是合法的,从而防止中间人冒充。
⚝ 例如,TLS/SSL 协议在握手阶段使用数字证书进行身份认证,并使用 Diffie-Hellman 密钥交换或其变体(如 ECDHE)协商会话密钥。
② 预共享密钥 (Pre-shared Key):
⚝ 如果 Alice 和 Bob 事先共享了一个秘密密钥,可以使用预共享密钥对 Diffie-Hellman 密钥交换过程进行认证。
⚝ 例如,IPsec 协议的 IKEv1 协议可以使用预共享密钥模式,对密钥交换过程进行认证。
③ 密钥确认 (Key Confirmation):
⚝ 在 Diffie-Hellman 密钥交换完成后,Alice 和 Bob 可以通过其他安全信道(例如,通过电话或面对面)验证协商出的共享密钥的哈希值,确保密钥没有被中间人篡改。
总结:Diffie-Hellman 密钥交换协议是一种重要的密钥协商协议,但它本身容易受到中间人攻击。在实际应用中,需要结合身份认证机制(如数字证书或预共享密钥)来防御中间人攻击,确保密钥交换的安全性。例如,在 TLS/SSL 和 SSH 等安全协议中,Diffie-Hellman 密钥交换通常与数字证书或身份认证机制结合使用,以建立安全的通信连接。
4.4 椭圆曲线密码学 ECC (Elliptic Curve Cryptography ECC)
椭圆曲线密码学 (Elliptic Curve Cryptography, ECC) 是一种基于椭圆曲线数学理论的公钥密码学。与 RSA 等传统公钥密码算法相比,ECC 在提供相同安全强度的前提下,可以使用更短的密钥长度,从而提高运算速度、降低存储空间和带宽需求。因此,ECC 在移动设备、物联网等资源受限的环境中具有显著优势,并被广泛应用于现代密码学协议和系统中。
4.4.1 椭圆曲线基础 (Elliptic Curve Basics)
理解椭圆曲线密码学首先需要了解椭圆曲线的基本概念。在密码学中,通常使用的椭圆曲线是在有限域 (Finite Field) 上定义的。
① 椭圆曲线的定义:
⚝ Weierstrass 方程:在特征不为 2 或 3 的有限域 \( \mathbb{F} \) 上,椭圆曲线 \( E \) 可以用 Weierstrass 方程定义:
\[ y^2 = x^3 + ax + b \]
其中 \( a, b \in \mathbb{F} \) 是常数,且满足判别式 \( \Delta = 4a^3 + 27b^2 \neq 0 \pmod{p} \)(如果 \( \mathbb{F} = \mathbb{F}_p \),\( p \) 是素数)。条件 \( \Delta \neq 0 \) 保证了曲线是非奇异的,即没有尖点或自交点。
⚝ 无穷远点 \( \mathcal{O} \):为了构成群结构,椭圆曲线还需要包含一个特殊的点,称为无穷远点 (Point at Infinity),记为 \( \mathcal{O} \)。无穷远点可以视为垂直线的交点,是椭圆曲线群的单位元。
⚝ 椭圆曲线上的点集:椭圆曲线 \( E \) 上的点集 \( E(\mathbb{F}) \) 包括所有满足 Weierstrass 方程 \( (x, y) \) 的点,以及无穷远点 \( \mathcal{O} \)。
② 椭圆曲线上的群运算:
⚝ 椭圆曲线上的点可以定义加法运算,构成一个阿贝尔群 (Abelian Group)。群运算规则如下:
▮▮▮▮ⓐ 单位元:无穷远点 \( \mathcal{O} \) 是单位元,对于任意点 \( P \in E(\mathbb{F}) \),有 \( P + \mathcal{O} = \mathcal{O} + P = P \)。
▮▮▮▮ⓑ 逆元:对于椭圆曲线上的点 \( P = (x, y) \),其逆元是 \( -P = (x, -y) \)。如果 \( P = \mathcal{O} \),则 \( -P = \mathcal{O} \)。
▮▮▮▮ⓒ 加法:对于椭圆曲线上的两个点 \( P_1 = (x_1, y_1) \) 和 \( P_2 = (x_2, y_2) \),它们的和 \( P_3 = P_1 + P_2 = (x_3, y_3) \) 的计算规则如下:
▮▮▮▮▮▮▮▮❹ 如果 \( P_1 = \mathcal{O} \),则 \( P_1 + P_2 = P_2 \)。如果 \( P_2 = \mathcal{O} \),则 \( P_1 + P_2 = P_1 \)。
▮▮▮▮▮▮▮▮❺ 如果 \( P_2 = -P_1 \),即 \( x_2 = x_1 \) 且 \( y_2 = -y_1 \),则 \( P_1 + P_2 = \mathcal{O} \)。
▮▮▮▮▮▮▮▮❻ 如果 \( P_1 \neq P_2 \) 且 \( x_1 \neq x_2 \),则
\[ \lambda = \frac{y_2 - y_1}{x_2 - x_1} \]
\[ x_3 = \lambda^2 - x_1 - x_2 \]
\[ y_3 = \lambda(x_1 - x_3) - y_1 \]
▮▮▮▮▮▮▮▮❹ 如果 \( P_1 = P_2 \) 且 \( y_1 \neq 0 \),则
\[ \lambda = \frac{3x_1^2 + a}{2y_1} \]
\[ x_3 = \lambda^2 - 2x_1 \]
\[ y_3 = \lambda(x_1 - x_3) - y_1 \]
▮▮▮▮▮▮▮▮❺ 如果 \( P_1 = P_2 \) 且 \( y_1 = 0 \),则 \( P_1 + P_2 = 2P_1 = \mathcal{O} \)。
③ 有限域的选择:
⚝ 在 ECC 中,常用的有限域包括:
▮▮▮▮ⓐ 素数域 \( \mathbb{F}_p \):\( \mathbb{F}_p = \mathbb{Z}/p\mathbb{Z} \),其中 \( p \) 是大素数。域中的元素是整数模 \( p \)。运算是在模 \( p \) 意义下进行的。
▮▮▮▮ⓑ 二元域 \( \mathbb{F}_{2^m} \):\( \mathbb{F}_{2^m} \) 是特征为 2 的有限域,包含 \( 2^m \) 个元素。域中的元素是系数在 \( \mathbb{F}_2 = \{0, 1\} \) 中的次数小于 \( m \) 的多项式。运算是多项式模一个不可约多项式进行的。
④ 椭圆曲线参数:
⚝ 定义一条椭圆曲线需要指定以下参数:
▮▮▮▮ⓐ 有限域 \( \mathbb{F} \):例如 \( \mathbb{F}_p \) 或 \( \mathbb{F}_{2^m} \)。
▮▮▮▮ⓑ 曲线参数 \( a \) 和 \( b \):Weierstrass 方程 \( y^2 = x^3 + ax + b \) 中的系数 \( a \) 和 \( b \)。
▮▮▮▮ⓒ 基点 \( G \):椭圆曲线群 \( E(\mathbb{F}) \) 的一个生成元,或阶数很大的点。基点 \( G \) 用于生成密钥和进行椭圆曲线运算。
▮▮▮▮ⓓ 阶数 \( n \):基点 \( G \) 的阶数,即最小的正整数 \( n \) 使得 \( nG = \mathcal{O} \)。阶数 \( n \) 必须是素数或接近素数的大数。
▮▮▮▮ⓔ 余因子 \( h \):\( h = \#E(\mathbb{F}) / n \),其中 \( \#E(\mathbb{F}) \) 是椭圆曲线群 \( E(\mathbb{F}) \) 的阶数(点的个数)。余因子 \( h \) 通常是一个小的整数。
常用的椭圆曲线标准:NIST 曲线、SECG 曲线、Brainpool 曲线等。这些标准曲线定义了常用的有限域、曲线参数和基点,方便开发者使用。
4.4.2 椭圆曲线上的离散对数问题 (Elliptic Curve Discrete Logarithm Problem ECDLP)
椭圆曲线密码学的安全性基于椭圆曲线上的离散对数问题 (Elliptic Curve Discrete Logarithm Problem, ECDLP) 的困难性。
① 椭圆曲线离散对数问题 (ECDLP) 的定义:
⚝ 给定椭圆曲线 \( E \) 和有限域 \( \mathbb{F} \),以及椭圆曲线上的基点 \( G \in E(\mathbb{F}) \) 和点 \( P = kG \in E(\mathbb{F}) \),其中 \( k \) 是一个整数(标量乘法),ECDLP 的目标是求解整数 \( k \)。
⚝ 标量乘法 \( kG \) 表示将点 \( G \) 自身相加 \( k \) 次,即 \( G + G + \cdots + G \) (共 \( k \) 个 \( G \))。
② ECDLP 的困难性:
⚝ 对于精心选择的椭圆曲线和基点,目前没有已知的有效算法可以在多项式时间内解决 ECDLP。
⚝ 求解 ECDLP 的最有效算法是Pollard's rho 算法,其时间复杂度约为 \( O(\sqrt{n}) \),其中 \( n \) 是基点 \( G \) 的阶数。为了保证安全性,需要选择阶数 \( n \) 足够大的椭圆曲线。
⚝ ECDLP 的困难性使得椭圆曲线密码学能够使用较短的密钥长度达到与 RSA 等传统公钥密码算法相同的安全强度。例如,256 位的 ECC 密钥通常被认为等价于 3072 位的 RSA 密钥的安全强度。
③ ECDLP 与传统离散对数问题 (DLP) 的比较:
⚝ 传统的离散对数问题 (DLP) 是在有限域 \( (\mathbb{Z}_p^*, \times) \) 上定义的,即给定 \( g, p, A = g^a \pmod{p} \),求解指数 \( a \)。
⚝ 对于传统的 DLP,存在一些比 Pollard's rho 算法更高效的算法,例如指标计算算法 (Index Calculus Algorithm),在某些情况下可以显著降低求解 DLP 的难度。
⚝ 然而,对于一般的椭圆曲线,目前没有类似于指标计算算法的有效方法来求解 ECDLP。因此,ECDLP 通常被认为比传统的 DLP 更难求解。
④ 椭圆曲线的选择与安全性:
⚝ 椭圆曲线的选择对 ECC 的安全性至关重要。需要选择安全的椭圆曲线,以抵抗各种已知的攻击。
⚝ 避免弱曲线:某些特殊类型的椭圆曲线(如异常曲线、可移动曲线)容易受到特定攻击,应避免使用。
⚝ 使用标准曲线:推荐使用经过密码学专家广泛分析和验证的标准椭圆曲线,例如 NIST 曲线和 SECG 曲线。这些标准曲线在安全性和效率之间取得了较好的平衡。
4.4.3 椭圆曲线 Diffie-Hellman 密钥交换 ECDH (Elliptic Curve Diffie-Hellman ECDH)
椭圆曲线 Diffie-Hellman (Elliptic Curve Diffie-Hellman, ECDH) 密钥交换是 Diffie-Hellman 密钥交换在椭圆曲线上的变体。它利用椭圆曲线上的标量乘法运算和 ECDLP 的困难性,实现密钥协商。
① ECDH 密钥交换协议步骤:
⚝ 参数协商:Alice 和 Bob 事先协商好椭圆曲线参数 \( (E, \mathbb{F}, G, n) \),包括椭圆曲线 \( E \)、有限域 \( \mathbb{F} \)、基点 \( G \) 和基点阶数 \( n \)。这些参数可以公开。
⚝ 密钥生成:
▮▮▮▮ⓐ Alice 选择一个秘密整数 \( a \),作为她的私钥,\( 1 < a < n \)。
▮▮▮▮ⓑ Bob 选择一个秘密整数 \( b \),作为他的私钥,\( 1 < b < n \)。
▮▮▮▮ⓒ Alice 和 Bob 的私钥 \( a \) 和 \( b \) 必须保密。
⚝ 公钥计算与交换:
▮▮▮▮ⓐ Alice 计算她的公钥 \( P_A = aG \),并将 \( P_A \) 发送给 Bob。
▮▮▮▮ⓑ Bob 计算他的公钥 \( P_B = bG \),并将 \( P_B \) 发送给 Alice。
▮▮▮▮ⓒ 公钥 \( P_A \) 和 \( P_B \) 是椭圆曲线上的点,可以通过不安全信道传输。
⚝ 共享密钥计算:
▮▮▮▮ⓐ Alice 收到 Bob 的公钥 \( P_B \) 后,计算共享密钥 \( K_A = aP_B = a(bG) = (ab)G \)。
▮▮▮▮ⓑ Bob 收到 Alice 的公钥 \( P_A \) 后,计算共享密钥 \( K_B = bP_A = b(aG) = (ab)G \)。
▮▮▮▮ⓒ 由于 \( K_A = K_B = (ab)G \),Alice 和 Bob 协商出了相同的共享密钥 \( K = (ab)G \)。
⚝ 共享密钥提取:共享密钥 \( K = (x_K, y_K) \) 是椭圆曲线上的一个点。在实际应用中,通常从 \( K \) 中提取一个标量值作为最终的共享密钥。常用的方法是取 \( K \) 的 x 坐标 \( x_K \) 作为共享密钥,或者对 \( x_K \) 进行哈希运算得到最终的密钥。
ECDH 密钥交换过程示意图:
1
Alice Bob
2
--------------------------------------------------
3
1. 选择秘密私钥 a 1. 选择秘密私钥 b
4
2. 计算公钥 P_A = aG 2. 计算公钥 P_B = bG
5
3. 发送公钥 P_A ------------------------->
6
3. 接收公钥 P_A
7
4. 发送公钥 P_B <-------------------------
8
4. 接收公钥 P_B
9
5. 计算共享密钥 K_A = aP_B 5. 计算共享密钥 K_B = bP_A
10
6. 提取共享密钥 (例如取 x 坐标) 6. 提取共享密钥 (例如取 x 坐标)
11
--------------------------------------------------
12
共享密钥 K = K_A = K_B = (ab)G
② ECDH 的安全性:
⚝ ECDH 的安全性基于椭圆曲线上的计算 Diffie-Hellman 问题 (Computational Diffie-Hellman Problem, CDH) 的困难性。
▮▮▮▮ⓐ 椭圆曲线 CDH 问题:给定椭圆曲线 \( E \)、基点 \( G \)、公钥 \( P_A = aG \) 和 \( P_B = bG \),计算共享密钥 \( K = (ab)G \) 在计算上是困难的。
⚝ ECDH 密钥交换协议同样容易受到中间人攻击,与传统的 Diffie-Hellman 密钥交换类似。防御中间人攻击的方法也相同,例如使用数字证书进行身份认证。
③ ECDH 的优势:
⚝ 密钥长度短:与 RSA 和传统的 Diffie-Hellman 密钥交换相比,ECDH 可以使用更短的密钥长度达到相同的安全强度。例如,256 位的 ECDH 密钥可以提供与 3072 位 RSA 密钥相当的安全强度。
⚝ 运算效率高:椭圆曲线上的运算(如点加和标量乘法)通常比大整数模幂运算更高效,尤其是在软件实现和硬件加速方面。
⚝ 带宽和存储节省:由于密钥长度短,ECDH 可以节省带宽和存储空间,在移动设备和资源受限的环境中具有优势。
4.4.4 椭圆曲线数字签名算法 ECDSA (Elliptic Curve Digital Signature Algorithm ECDSA)
椭圆曲线数字签名算法 (Elliptic Curve Digital Signature Algorithm, ECDSA) 是数字签名算法 (Digital Signature Algorithm, DSA) 在椭圆曲线上的变体。ECDSA 利用椭圆曲线上的运算和 ECDLP 的困难性,实现数字签名和验证。ECDSA 是目前广泛使用的数字签名算法之一,例如在比特币、TLS/SSL 协议和区块链技术中都有应用。
① ECDSA 签名生成过程:
⚝ 输入:
▮▮▮▮ⓐ 待签名的消息 \( m \)。
▮▮▮▮ⓑ 签名者的私钥 \( d_A \)。
▮▮▮▮ⓒ 椭圆曲线参数 \( (E, \mathbb{F}, G, n) \)。
⚝ 输出:消息 \( m \) 的数字签名 \( (r, s) \)。
⚝ 签名步骤:
▮▮▮▮ⓐ 生成随机数 \( k \):选择一个随机数 \( k \),\( 1 \le k < n \)。\( k \) 必须是真随机数,且每次签名都必须重新生成。
▮▮▮▮ⓑ 计算点 \( R = kG = (x_R, y_R) \):计算椭圆曲线上的点 \( R = kG \)。
▮▮▮▮ⓒ 计算 \( r = x_R \pmod{n} \):取点 \( R \) 的 x 坐标 \( x_R \),计算 \( r = x_R \pmod{n} \)。如果 \( r = 0 \),则重新选择随机数 \( k \) 并重复步骤 ⓐ 和 ⓑ。
▮▮▮▮ⓓ 计算消息哈希值 \( h = \text{Hash}(m) \):使用哈希函数 (如 SHA-256) 计算消息 \( m \) 的哈希值 \( h \)。将哈希值 \( h \) 转换为整数 \( e \),通常取哈希值的前 \( L_n \) 位,其中 \( L_n \) 是 \( n \) 的比特长度。
▮▮▮▮ⓔ 计算 \( s = k^{-1}(e + d_A r) \pmod{n} \):计算 \( k \) 关于模 \( n \) 的模逆元 \( k^{-1} \),然后计算 \( s = k^{-1}(e + d_A r) \pmod{n} \)。如果 \( s = 0 \),则重新选择随机数 \( k \) 并重复步骤 ⓐ, ⓑ, ⓒ, ⓓ, ⓔ。
▮▮▮▮ⓕ 输出签名 \( (r, s) \):\( (r, s) \) 即为消息 \( m \) 的 ECDSA 数字签名。
② ECDSA 签名验证过程:
⚝ 输入:
▮▮▮▮ⓐ 待验证签名的消息 \( m \)。
▮▮▮▮ⓑ 签名 \( (r, s) \)。
▮▮▮▮ⓒ 签名者的公钥 \( Q_A \)。
▮▮▮▮ⓓ 椭圆曲线参数 \( (E, \mathbb{F}, G, n) \)。
⚝ 输出:验证结果:签名有效或无效。
⚝ 验证步骤:
▮▮▮▮ⓐ 验证 \( r \) 和 \( s \) 的取值范围:验证 \( 1 \le r < n \) 和 \( 1 \le s < n \)。如果任何一个条件不满足,则签名无效。
▮▮▮▮ⓑ 计算消息哈希值 \( h = \text{Hash}(m) \):使用与签名生成过程相同的哈希函数计算消息 \( m \) 的哈希值 \( h \),并将哈希值转换为整数 \( e \)。
▮▮▮▮ⓒ 计算 \( w = s^{-1} \pmod{n} \):计算 \( s \) 关于模 \( n \) 的模逆元 \( w \)。
▮▮▮▮ⓓ 计算 \( u_1 = ew \pmod{n} \) 和 \( u_2 = rw \pmod{n} \)。
▮▮▮▮ⓔ 计算点 \( P = u_1G + u_2Q_A = (x_P, y_P) \):计算椭圆曲线上的点 \( P = u_1G + u_2Q_A \)。
▮▮▮▮ⓕ 验证 \( r \equiv x_P \pmod{n} \):取点 \( P \) 的 x 坐标 \( x_P \),计算 \( v = x_P \pmod{n} \)。如果 \( v = r \),则签名有效;否则,签名无效。
ECDSA 签名和验证过程示意图:
1
ECDSA 签名生成 (Signer) ECDSA 签名验证 (Verifier)
2
-------------------------------------------------------------------------------------
3
输入: 消息 m, 私钥 d_A, 曲线参数 输入: 消息 m, 签名 (r, s), 公钥 Q_A, 曲线参数
4
-------------------------------------------------------------------------------------
5
1. 生成随机数 k 1. 验证 1 ≤ r < n 和 1 ≤ s < n
6
2. 计算 R = kG = (x_R, y_R) 2. 计算 e = Hash(m)
7
3. 计算 r = x_R mod n 3. 计算 w = s^(-1) mod n
8
4. 计算 e = Hash(m) 4. 计算 u_1 = ew mod n, u_2 = rw mod n
9
5. 计算 s = k^(-1)(e + d_A r) mod n 5. 计算 P = u_1G + u_2Q_A = (x_P, y_P)
10
输出: 签名 (r, s) 6. 验证 r ≡ x_P mod n
11
输出: 签名有效/无效
12
-------------------------------------------------------------------------------------
③ ECDSA 的安全性:
⚝ ECDSA 的安全性基于 ECDLP 的困难性。破解 ECDSA 签名算法等价于求解 ECDLP 或相关的椭圆曲线问题。
⚝ 随机数 \( k \) 的重要性:随机数 \( k \) 必须是真随机数,且每次签名都必须不同。如果随机数 \( k \) 可预测或重复使用,会导致私钥泄露。例如,如果两次签名使用了相同的随机数 \( k \),攻击者可以从两个签名中计算出私钥 \( d_A \)。
⚝ 哈希函数的选择:ECDSA 使用哈希函数对消息进行摘要,哈希函数的安全性也影响 ECDSA 的安全性。应选择安全的哈希函数,如 SHA-256 或 SHA-3。
④ ECDSA 的应用:
⚝ 数字货币:比特币、以太坊等数字货币使用 ECDSA 进行交易签名,保证交易的不可伪造性和不可否认性。
⚝ TLS/SSL 协议:TLS/SSL 协议可以使用 ECDSA 进行服务器和客户端的身份认证和密钥协商。
⚝ 区块链技术:区块链技术广泛使用 ECDSA 进行交易签名和身份验证。
⚝ 数字证书:数字证书可以使用 ECDSA 进行签名,保证证书的完整性和来源可靠性。
4.5 公钥密码算法的比较 (Comparison of Public-key Cryptographic Algorithms)
公钥密码算法是现代密码学的核心组成部分。本节将对 RSA、Diffie-Hellman 和 ECC 这三种主要的公钥密码算法进行比较,分析它们的特点、优缺点和适用场景。
特性/算法 | RSA | Diffie-Hellman (D-H) | 椭圆曲线密码学 (ECC) |
---|---|---|---|
用途 | 加密、数字签名 | 密钥交换 | 加密、数字签名、密钥交换 |
安全基础 | 大整数分解难题 | 离散对数问题 (DLP) | 椭圆曲线离散对数问题 (ECDLP) |
密钥长度 | 长 (例如 2048 位、3072 位、4096 位) | 中等 (例如 2048 位、3072 位) | 短 (例如 256 位、384 位、512 位) |
密钥生成速度 | 相对较慢 | 较快 | 较快 |
加密/签名速度 | 相对较慢 | 不适用 (仅密钥交换) | 较快 |
解密/验证速度 | 相对较慢 | 不适用 (仅密钥交换) | 较快 |
密钥管理 | 公钥加密,私钥解密;公钥验证签名,私钥生成签名 | 无密钥存储,仅用于密钥协商 | 公钥加密,私钥解密;公钥验证签名,私钥生成签名 |
抗量子计算 | 易受 Shor 算法攻击 | 易受量子算法攻击 | 预计易受量子算法攻击,但抗性研究中 |
优点 | 应用广泛,成熟度高,易于理解和实现 | 密钥交换协议鼻祖,概念简单,广泛应用 | 高安全强度,密钥长度短,运算效率高,资源消耗低 |
缺点 | 密钥长度长,运算速度相对较慢,资源消耗较高 | 易受中间人攻击,仅用于密钥交换,需结合认证机制 | 椭圆曲线理论相对复杂,实现难度稍高,专利问题 |
适用场景 | 安全性要求高,计算资源相对充足的场景,如服务器端加密、数字证书 | 密钥协商,常用于安全协议的密钥交换阶段,如 TLS/SSL, SSH | 移动设备、物联网设备、资源受限环境,对性能和带宽要求高的场景 |
总结:
① RSA:作为最经典的公钥密码算法,RSA 在加密和数字签名领域应用广泛,技术成熟,易于理解和实现。但其密钥长度较长,运算速度相对较慢,资源消耗较高。适用于安全性要求高,计算资源相对充足的场景,如服务器端加密、数字证书等。
② Diffie-Hellman:Diffie-Hellman 密钥交换协议是密钥协商协议的鼻祖,概念简单,广泛应用于各种安全协议的密钥交换阶段,如 TLS/SSL、SSH 等。但其仅用于密钥交换,易受中间人攻击,需要结合身份认证机制使用。
③ ECC:椭圆曲线密码学 ECC 具有高安全强度、密钥长度短、运算效率高、资源消耗低等优点,特别适用于移动设备、物联网设备等资源受限环境,以及对性能和带宽要求高的场景。ECC 在现代密码学中扮演着越来越重要的角色,被广泛应用于各种安全协议和系统中。
在实际应用中,应根据具体的安全需求、性能要求和资源限制,选择合适的公钥密码算法。通常,为了兼顾安全性和效率,现代安全协议和系统常常会结合使用多种公钥密码算法,例如在 TLS/SSL 协议中,可以使用 RSA 或 ECC 进行身份认证,使用 Diffie-Hellman 或 ECDH 进行密钥交换,使用 AES 等对称密码算法进行数据加密。随着量子计算技术的发展,后量子密码算法的研究和应用也变得越来越重要。
5. chapter 5: 哈希函数 (Hash Functions)
5.1 哈希函数概念 (Hash Function Concepts)
哈希函数 (Hash Function),又称散列函数或杂凑函数,是一种将任意长度的输入(也称为 pre-image 或 message)通过确定性算法 转换为固定长度输出的函数。这个固定长度的输出值被称为哈希值 (hash value)、哈希码 (hash code)、散列值、摘要 (digest) 或指纹 (fingerprint)。在密码学中,哈希函数被广泛应用于数据完整性校验、消息认证、数字签名、密码存储等安全领域,是构建现代密码系统的基础模块之一。
简单来说,哈希函数就像一个“指纹提取器”,无论输入的消息有多长,它都能生成一个固定长度的“指纹”作为输出。理想的密码学哈希函数应具备以下关键特性,以保证其在安全应用中的有效性。
5.1.1 哈希函数的性质 (Properties of Hash Functions)
一个优秀的密码学哈希函数需要满足几个核心性质,这些性质共同保证了哈希函数在信息安全领域的应用价值。主要包括单向性 (preimage resistance)、抗碰撞性 (collision resistance) 和第二原像抗性 (second preimage resistance)。
5.1.1.1 单向性 (Preimage Resistance)
单向性 (Preimage Resistance),也称为抗原像攻击,指的是对于给定的哈希值 \(h\),要找到一个输入 \(m\) 使得 \(Hash(m) = h\) 在计算上是不可行的。换句话说,从哈希值反向推导出原始输入消息是非常困难的。
⚝ 定义:对于哈希函数 \(H\),如果对于几乎所有的哈希值 \(h\),要找到任何消息 \(m\) 使得 \(H(m) = h\) 在计算上是不可行的,则称 \(H\) 具有单向性。
⚝ 重要性:单向性是哈希函数最基本也是最重要的性质之一。它保证了即使攻击者获得了哈希值,也无法轻易还原出原始消息。例如,在密码存储中,我们只存储用户密码的哈希值,而不是明文密码。即使数据库泄露,攻击者也难以通过哈希值反向计算出用户的原始密码,从而保护了用户账户的安全。
5.1.1.2 抗碰撞性 (Collision Resistance)
抗碰撞性 (Collision Resistance),也称为强抗碰撞性,指的是要找到两个不同的输入 \(m_1\) 和 \(m_2\),使得 \(Hash(m_1) = Hash(m_2)\) 在计算上是不可行的。 换句话说,很难找到两个不同的消息,经过哈希运算后得到相同的哈希值,这种情况被称为碰撞 (collision)。
⚝ 定义:对于哈希函数 \(H\),如果找到任何两个不同的消息 \(m_1\) 和 \(m_2\) 使得 \(H(m_1) = H(m_2)\) 在计算上是不可行的,则称 \(H\) 具有抗碰撞性。
⚝ 重要性:抗碰撞性保证了哈希函数输出的唯一性,即不同的输入消息应该尽可能地产生不同的哈希值。这在数据完整性校验和数字签名中至关重要。如果哈希函数不具备抗碰撞性,攻击者可能找到两个不同的文件,但它们的哈希值相同,从而可以伪造文件或篡改数据而不被检测到。
⚝ 生日悖论 (Birthday Paradox):值得注意的是,即使哈希函数的输出空间很大,碰撞仍然是可能发生的。生日悖论揭示了,在一个随机选择的集合中,碰撞的概率远比直觉想象的要高。对于一个输出长度为 \(n\) 位的哈希函数,大约只需要 \(2^{n/2}\) 个随机输入,就很有可能找到碰撞。因此,为了保证足够的抗碰撞性,哈希函数的输出长度需要足够大。例如,对于输出长度为 128 位的哈希函数,理论上需要 \(2^{64}\) 次哈希运算才能找到碰撞,而对于输出长度为 256 位的哈希函数,则需要 \(2^{128}\) 次哈希运算。
5.1.1.3 第二原像抗性 (Second Preimage Resistance)
第二原像抗性 (Second Preimage Resistance),也称为弱抗碰撞性,指的是对于给定的一个输入 \(m_1\),要找到另一个不同的输入 \(m_2\) (\(m_1 \neq m_2\)),使得 \(Hash(m_1) = Hash(m_2)\) 在计算上是不可行的。
⚝ 定义:对于哈希函数 \(H\),给定一个消息 \(m_1\),如果找到任何不同的消息 \(m_2\) (\(m_1 \neq m_2\)) 使得 \(H(m_1) = H(m_2)\) 在计算上是不可行的,则称 \(H\) 具有第二原像抗性。
⚝ 重要性:第二原像抗性与抗碰撞性类似,但侧重点不同。第二原像抗性要求对于已知的消息,难以找到与之碰撞的另一个消息。这在数字签名等应用中非常重要。例如,如果攻击者能够找到与已签名消息具有相同哈希值的另一条消息,就可以用伪造的消息替换原始消息,并利用原始签名进行欺骗。
⚝ 与抗碰撞性的关系:抗碰撞性比第二原像抗性更强。如果一个哈希函数是抗碰撞的,那么它必然是第二原像抗性的。因为抗碰撞性要求找到任意两个不同的消息碰撞都是困难的,而第二原像抗性只要求对于给定的消息,找到碰撞是困难的。反之则不然,一个具有第二原像抗性的哈希函数不一定是抗碰撞的。
总结来说,单向性、抗碰撞性和第二原像抗性是密码学哈希函数的核心安全属性。在实际应用中,我们需要根据具体的安全需求选择合适的哈希函数。
5.2 常用哈希算法 (Common Hash Algorithms)
密码学领域发展至今,涌现出了许多哈希算法。但随着密码分析技术的进步和计算能力的提升,一些早期的哈希算法已经被证明存在安全漏洞,不再推荐使用。目前常用的哈希算法主要包括 MD5、SHA-1、SHA-2 和 SHA-3 等系列。
5.2.1 MD5
MD5 (Message Digest Algorithm 5) 是一种广泛使用的哈希算法,由 Ronald Rivest 在 1991 年设计。它产生 128 位的哈希值。MD5 算法的设计目标是快速高效,在早期被广泛应用于文件校验、数字签名等领域。
⚝ 特点:
① 快速:MD5 算法计算速度快,效率高。
② 简单:算法实现相对简单。
③ 输出长度固定:输出 128 位的哈希值。
⚝ 安全性:
MD5 算法在 1990 年代后期被证明存在严重的碰撞漏洞。王小云教授及其团队在 2004 年成功找到了 MD5 碰撞的快速方法,这意味着在相对较短的时间内就可以找到两个不同的消息,但它们的 MD5 哈希值相同。因此,MD5 不再被认为是密码学安全的哈希函数,不应再用于需要高安全性的场景,如数字签名。但由于其计算速度快,在一些非安全敏感的场景,如文件完整性校验(例如,校验下载文件的完整性)中,MD5 仍然有一定的应用。
5.2.2 SHA-1
SHA-1 (Secure Hash Algorithm 1) 是由美国国家安全局 (NSA) 设计,美国国家标准与技术研究院 (NIST) 发布的一种密码学哈希算法。SHA-1 基于 MD4 算法设计,产生 160 位的哈希值。SHA-1 在很长一段时间内被认为是安全的,并被广泛应用于各种安全协议和应用中,如 TLS/SSL、PGP、SSH、S/MIME 和 IPsec 等。
⚝ 特点:
① 输出长度固定:输出 160 位的哈希值。
② 曾被广泛应用:在很长一段时间内被认为是安全的标准哈希算法。
⚝ 安全性:
与 MD5 类似,SHA-1 算法也逐渐被发现存在安全漏洞。2005 年,密码学家们证明了 SHA-1 存在理论上的碰撞攻击方法。虽然早期的攻击方法复杂度较高,但在 2017 年,CWI Amsterdam 和 Google 联合宣布成功实现了 SHA-1 的碰撞攻击,证明了 SHA-1 在实际应用中也面临着安全威胁。因此,SHA-1 也不再被认为是密码学安全的哈希函数,NIST 建议自 2010 年起停止使用 SHA-1,并推荐使用 SHA-2 或 SHA-3 等更安全的哈希算法。目前,许多浏览器和安全协议已经逐步淘汰对 SHA-1 的支持。
5.2.3 SHA-256, SHA-512 (SHA-2 Family)
SHA-2 (Secure Hash Algorithm 2) 实际上是一系列哈希算法的统称,包括 SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256 等多种变体,它们都由 NSA 设计,NIST 发布。SHA-2 算法族在结构上与 SHA-1 类似,但设计更为复杂,输出长度更长,安全性更高。其中,SHA-256 和 SHA-512 是最常用的两种。
⚝ 特点:
① 输出长度多样:SHA-2 算法族提供多种输出长度,如 224 位、256 位、384 位、512 位等,可以根据不同的安全需求选择合适的长度。
② 安全性较高:相比 MD5 和 SHA-1,SHA-2 算法族在安全性上有了显著提升,至今尚未发现有效的实际碰撞攻击方法。
③ 应用广泛:SHA-2 算法族被广泛应用于各种安全协议、数字签名、数据完整性校验等领域,是目前应用最广泛的密码学哈希算法之一。
⚝ 安全性:
目前,SHA-2 算法族被认为是密码学安全的哈希函数。虽然理论上存在针对 SHA-2 的攻击方法,但其复杂度极高,在可预见的未来,SHA-2 仍然能够提供足够的安全保障。因此,在需要高安全性的场景下,推荐使用 SHA-256 或 SHA-512 等 SHA-2 算法。
5.2.4 SHA-3
SHA-3 (Secure Hash Algorithm 3) 并不是 SHA-2 的简单升级版,而是一种全新的哈希算法,由 Keccak 团队设计,并在 NIST 的公开竞赛中胜出,于 2015 年正式发布为 NIST 标准。SHA-3 基于 Sponge 结构 (海绵结构) 设计,与 SHA-1 和 SHA-2 的 Merkle-Damgård 结构完全不同。SHA-3 算法族也包括多种变体,如 SHA3-224、SHA3-256、SHA3-384、SHA3-512 以及 SHAKE128、SHAKE256 等可扩展输出函数 (XOFs)。
⚝ 特点:
① 全新的设计结构:SHA-3 采用 Sponge 结构,与 SHA-1 和 SHA-2 的 Merkle-Damgård 结构不同,提供了更高的设计多样性,降低了算法族整体的安全风险。
② 灵活性和可扩展性:SHA-3 不仅提供固定长度的哈希函数,还提供可扩展输出函数 (XOFs),可以根据需要生成任意长度的输出。
③ 安全性高:SHA-3 算法经过严格的公开评审和密码分析,被认为是目前最安全的哈希算法之一。
⚝ 安全性:
SHA-3 算法被认为是目前密码学安全的哈希函数,能够抵抗已知的各种攻击。由于其全新的设计结构和高安全性,SHA-3 被认为是未来哈希算法的发展方向,并逐渐在各种安全应用中得到应用。在对安全性有较高要求的场景下,可以考虑使用 SHA-3 算法。
总结来说,MD5 和 SHA-1 由于已被证明存在安全漏洞,不应再用于安全敏感的场景。SHA-2 算法族(特别是 SHA-256 和 SHA-512)目前仍被认为是安全的,是应用最广泛的哈希算法。SHA-3 算法是新一代的哈希算法,具有更高的安全性和灵活性,是未来哈希算法的发展趋势。在实际应用中,应根据具体的安全需求和性能要求,选择合适的哈希算法。通常情况下,推荐使用 SHA-256、SHA-512 或 SHA-3 等更安全的哈希算法。
5.3 哈希函数的应用 (Applications of Hash Functions)
哈希函数由于其独特的性质,在信息安全领域有着广泛的应用。主要应用场景包括消息摘要 (message digest)、数据完整性校验 (data integrity check) 和密码存储 (password storage) 等。
5.3.1 消息摘要 (Message Digest)
消息摘要 (Message Digest) 是哈希函数最经典的应用之一。通过对消息 (message) 进行哈希运算,可以得到一个固定长度的哈希值,这个哈希值就被称为消息摘要。消息摘要可以被看作是消息的“指纹”,具有以下特点:
① 唯一性(理想情况下):不同的消息应该产生不同的消息摘要(抗碰撞性)。
② 固定长度:无论消息长度如何,消息摘要的长度是固定的。
③ 单向性:难以从消息摘要反向推导出原始消息(单向性)。
⚝ 应用场景:
① 数字签名:在数字签名方案中,通常不是直接对整个消息进行签名,而是先对消息计算哈希值,然后对哈希值进行签名。这样做可以大大提高签名效率,特别是对于长消息。同时,利用哈希函数的单向性和抗碰撞性,保证了签名的安全性和不可伪造性。
② 数据完整性校验:在数据传输或存储过程中,可以同时传输或存储消息的消息摘要。接收方或后续使用者可以重新计算消息的哈希值,并与之前接收或存储的消息摘要进行比对。如果两者一致,则说明数据在传输或存储过程中没有被篡改,保证了数据的完整性。
③ 软件完整性校验:软件发布者可以提供软件安装包的消息摘要。用户下载软件后,可以计算软件安装包的哈希值,并与发布者提供的消息摘要进行比对,以验证软件是否被篡改或损坏。
5.3.2 数据完整性校验 (Data Integrity Check)
数据完整性校验 (Data Integrity Check) 是利用哈希函数来验证数据在传输、存储或处理过程中是否保持完整、未被篡改的应用。通过计算数据的哈希值,并与预先计算或存储的哈希值进行比较,可以快速有效地检测数据是否发生变化。
⚝ 实现方式:
① 校验和 (Checksum):简单的校验和方法可以看作是哈希函数的雏形。例如,CRC (循环冗余校验) 算法常用于数据传输中的错误检测。虽然 CRC 算法不是密码学哈希函数,但其基本思想与哈希函数类似,都是将数据映射到一个较短的固定长度值,用于数据完整性校验。
② 密码学哈希函数:使用密码学哈希函数(如 SHA-256、SHA-512 等)可以提供更高安全性的数据完整性校验。例如,在文件同步、版本控制系统、区块链等应用中,广泛使用哈希函数来检测数据的变化。
⚝ 应用场景:
① 文件同步与备份:在文件同步或备份过程中,可以使用哈希函数检测文件是否发生变化,只同步或备份发生变化的文件,提高效率。
② 版本控制系统:如 Git 等版本控制系统,使用 SHA-1(或 SHA-256)哈希值来唯一标识每一次提交 (commit) 的版本,保证版本历史的完整性和不可篡改性。
③ 区块链技术:区块链技术中,哈希函数被广泛应用于区块链接、交易验证、数据完整性保护等方面,是区块链技术的核心组成部分。
5.3.3 密码存储 (Password Storage)
密码存储 (Password Storage) 是哈希函数在安全领域的一个重要应用。为了保护用户密码的安全,通常不直接存储用户的明文密码,而是存储密码的哈希值。当用户登录时,系统计算用户输入密码的哈希值,并与存储的哈希值进行比对。如果两者一致,则验证用户身份。
⚝ 安全优势:
① 防止明文泄露:即使数据库泄露,攻击者也只能获得密码的哈希值,而无法直接获得用户的明文密码,降低了密码泄露的风险。
② 单向性保护:由于哈希函数的单向性,攻击者难以通过哈希值反向计算出原始密码。
③ 彩虹表攻击防御:为了进一步增强密码存储的安全性,通常会使用加盐 (salt) 哈希。盐值是一个随机字符串,与密码拼接后再进行哈希运算。不同的用户可以使用不同的盐值,即使两个用户使用相同的密码,其加盐哈希值也会不同。加盐哈希可以有效防御彩虹表 (rainbow table) 攻击,提高密码破解的难度。
⚝ 最佳实践:
① 使用安全的哈希算法:推荐使用 SHA-256、SHA-512 或更安全的哈希算法,避免使用 MD5 和 SHA-1 等已被证明不安全的算法。
② 加盐 (Salt):为每个用户生成唯一的随机盐值,并将盐值与哈希值一起存储。
③ 迭代哈希 (Key Stretching):为了增加暴力破解的难度,可以对加盐后的密码进行多次哈希迭代运算,如 PBKDF2、bcrypt、scrypt 和 Argon2 等密钥派生函数 (KDFs)。这些函数通常内置了加盐和迭代哈希功能,是密码存储的最佳实践。
总而言之,哈希函数凭借其单向性、抗碰撞性等特性,在消息摘要、数据完整性校验和密码存储等信息安全领域发挥着至关重要的作用,是构建安全系统的基石。随着密码学技术的不断发展,更安全、更高效的哈希算法将继续涌现,并在未来的信息安全领域扮演更加重要的角色。
6. chapter 6: 消息认证码与数字签名 (Message Authentication Codes and Digital Signatures)
6.1 消息认证码 MAC (Message Authentication Code MAC)
6.1.1 MAC 的概念与作用 (Concepts and Functions of MAC)
消息认证码 (MAC, Message Authentication Code),也称为消息摘要或标签 (tag),是一种用于验证消息完整性和认证性的密码学技术。在信息安全领域中,确保数据的完整性 (integrity) 和认证性 (authenticity) 至关重要。完整性意味着数据在传输或存储过程中没有被篡改,而认证性则意味着可以验证数据的来源是可信的,而非伪造。消息认证码正是为了实现这两个目标而设计的。
概念
消息认证码通过使用一个密钥 (key) 和一个密码学哈希函数 (cryptographic hash function) 或分组密码算法 (block cipher algorithm) 来生成一个固定长度的短数据块,这个数据块附加在消息之后。接收方使用相同的密钥和算法对接收到的消息重新计算 MAC 值,并将其与接收到的 MAC 值进行比较。如果两个 MAC 值匹配,则可以确信消息的完整性和认证性都得到了保证。
作用
消息认证码主要有以下几个关键作用:
① 消息完整性验证 (Message Integrity Verification):MAC 能够检测消息在传输过程中是否被篡改。任何对消息内容的修改,即使是很小的改动,都会导致重新计算出的 MAC 值与接收到的 MAC 值不一致,从而让接收方能够识别出消息已被破坏。
② 消息认证 (Message Authentication):MAC 可以验证消息的来源。由于 MAC 的生成和验证都依赖于共享的密钥,只有拥有该密钥的发送方才能生成正确的 MAC 值。接收方通过验证 MAC 值,可以确信消息确实来自拥有共享密钥的发送方,从而防止身份伪造。
③ 抗重放攻击 (Resistance to Replay Attacks):虽然基本的 MAC 机制本身不能直接抵抗重放攻击 (replay attack),但通过结合序列号 (sequence number)、时间戳 (timestamp) 或其他防重放技术,MAC 可以有效地防止攻击者捕获并重放之前的有效消息。例如,在安全协议中,通常会结合使用 MAC 和序列号来确保消息的新鲜性 (freshness)。
与数字签名的区别
虽然 MAC 和数字签名 (digital signature) 都用于提供消息的完整性和认证性,但它们之间存在关键的区别:
⚝ 密钥类型:MAC 使用对称密钥 (symmetric key),即发送方和接收方共享同一个密钥。而数字签名使用非对称密钥 (asymmetric key),即发送方使用私钥 (private key) 签名,接收方使用公钥 (public key) 验证签名。
⚝ 认证范围:MAC 提供的是消息来源的认证,但由于密钥共享,接收方无法向第三方证明消息的来源,因为接收方自己也可能生成 MAC。数字签名则提供不可否认性 (non-repudiation),签名者无法否认自己对消息的签名,因为私钥只有签名者拥有。
⚝ 应用场景:MAC 通常用于通信双方事先共享密钥的场景,例如在安全通道内部或在已建立安全连接的会话中。数字签名则更适用于需要公开验证消息来源和内容完整性的场景,例如软件发布、电子邮件安全等。
总结
消息认证码是一种高效且实用的密码学工具,它在保证数据完整性和认证性方面发挥着重要作用。理解 MAC 的概念、作用以及与数字签名的区别,对于构建安全可靠的系统至关重要。在后续章节中,我们将深入探讨 HMAC 和 CMAC 这两种常用的 MAC 算法。
6.1.2 HMAC (基于哈希函数的消息认证码) (HMAC - Hash-based Message Authentication Code)
HMAC (Hash-based Message Authentication Code, 基于哈希函数的消息认证码) 是一种使用密码学哈希函数 (cryptographic hash function) 构建的消息认证码。由于哈希函数具有高效性和广泛的可用性,HMAC 成为实际应用中最常用的 MAC 算法之一。HMAC 的设计目标是在保证安全性的前提下,尽可能地利用现有哈希函数的性能优势。
HMAC 的构造
HMAC 的构造基于一个密码学哈希函数 \(H\) 和一个共享密钥 \(K\)。其基本思想是将密钥与消息进行混合,然后使用哈希函数进行处理。为了增强安全性,HMAC 采用了双层哈希结构,具体构造过程如下:
假设:
⚝ \(H\) 是一个密码学哈希函数,例如 SHA-256 或 SHA-512。
⚝ \(K\) 是共享密钥。
⚝ \(m\) 是要认证的消息。
⚝ \(ipad\) 是内部填充 (inner padding) 常量,通常是 0x36 重复填充到哈希函数的块大小。
⚝ \(opad\) 是外部填充 (outer padding) 常量,通常是 0x5C 重复填充到哈希函数的块大小。
HMAC 的计算公式如下:
\[ \text{HMAC}(K, m) = H((K \oplus opad) || H((K \oplus ipad) || m)) \]
其中:
⚝ \(||\) 表示连接 (concatenation)。
⚝ \(\oplus\) 表示按位异或 (bitwise XOR)。
⚝ 如果密钥 \(K\) 的长度大于哈希函数的块大小,则首先使用哈希函数对密钥进行哈希处理,取哈希结果作为新的密钥。如果密钥 \(K\) 的长度小于哈希函数的块大小,则在密钥末尾填充零字节 (zero-padding) 到哈希函数的块大小。
HMAC 的计算步骤
密钥预处理 (Key Preprocessing):
▮▮▮▮⚝ 如果密钥 \(K\) 的长度超过哈希函数 \(H\) 的块大小 \(B\),则 \(K = H(K)\)。
▮▮▮▮⚝ 如果密钥 \(K\) 的长度小于 \(B\),则在 \(K\) 的末尾填充零字节,使其长度达到 \(B\)。
▮▮▮▮⚝ 将预处理后的密钥记为 \(K'\)。内部哈希计算 (Inner Hash Calculation):
▮▮▮▮⚝ 将 \(K'\) 与 \(ipad\) 进行异或运算:\(K' \oplus ipad\)。
▮▮▮▮⚝ 将异或结果与消息 \(m\) 连接:\((K' \oplus ipad) || m\)。
▮▮▮▮⚝ 对连接后的结果应用哈希函数 \(H\):\(H((K' \oplus ipad) || m)\)。
▮▮▮▮⚝ 将内部哈希结果记为 \(inner\_hash\)。外部哈希计算 (Outer Hash Calculation):
▮▮▮▮⚝ 将 \(K'\) 与 \(opad\) 进行异或运算:\(K' \oplus opad\)。
▮▮▮▮⚝ 将异或结果与内部哈希结果 \(inner\_hash\) 连接:\((K' \oplus opad) || inner\_hash\)。
▮▮▮▮⚝ 对连接后的结果应用哈希函数 \(H\):\(H((K' \oplus opad) || inner\_hash)\)。
▮▮▮▮⚝ 外部哈希结果即为最终的 HMAC 值。
HMAC 的安全性
HMAC 的安全性依赖于底层哈希函数 \(H\) 的安全性。如果哈希函数 \(H\) 具有良好的抗碰撞性 (collision resistance) 和单向性 (preimage resistance),并且密钥 \(K\) 是安全保密的,那么 HMAC 就能提供可靠的消息认证。
HMAC 的双层哈希结构是其安全性的关键。这种结构有效地防止了针对哈希函数的长度扩展攻击 (length extension attack)。长度扩展攻击是指,在已知消息 \(m\) 的哈希值 \(H(m)\) 和消息 \(m\) 的长度,但不知道具体消息内容的情况下,可以计算出 \(H(m || m')\) 的值,其中 \(m'\) 是攻击者选择的任意后缀。由于 HMAC 的计算过程中,密钥 \(K\) 被用于两次哈希运算,并且使用了不同的填充常量 \(ipad\) 和 \(opad\),因此可以有效地抵抗长度扩展攻击。
HMAC 的应用
HMAC 广泛应用于各种安全协议和系统中,例如:
⚝ TLS/SSL 协议:在 TLS/SSL 协议中,HMAC 用于消息认证,确保通信数据的完整性和认证性。
⚝ IPsec 协议:IPsec 协议使用 HMAC 提供数据包的认证和完整性保护。
⚝ SSH 协议:SSH 协议也使用 HMAC 来验证通信数据的完整性和认证性。
⚝ Web 应用安全:在 Web 应用中,HMAC 可以用于 API 接口的认证,防止未授权访问和数据篡改。
总结
HMAC 是一种强大且实用的消息认证码算法,它基于密码学哈希函数构建,具有高效性和安全性。通过双层哈希结构和密钥的有效利用,HMAC 能够提供可靠的消息完整性验证和消息认证,广泛应用于各种安全领域。理解 HMAC 的构造原理和安全性特点,对于安全系统设计和应用开发至关重要。
6.1.3 CMAC (基于密码分组的消息认证码) (CMAC - Cipher-based Message Authentication Code)
CMAC (Cipher-based Message Authentication Code, 基于密码分组的消息认证码) 是一种使用分组密码算法 (block cipher algorithm) 构建的消息认证码。与 HMAC 不同,CMAC 直接利用分组密码的加密功能来生成 MAC 值。CMAC 的标准化版本是 OMAC1 (One-Key MAC 1),由 NIST (美国国家标准与技术研究院) 在 SP 800-38B 中正式推荐。CMAC 旨在提供一种安全且高效的 MAC 算法,尤其适用于硬件实现和对性能有较高要求的场景。
CMAC 的构造
CMAC 的构造基于一个分组密码算法 \(E\) 和一个密钥 \(K\)。常用的分组密码算法包括 AES (Advanced Encryption Standard) 和 DES (Data Encryption Standard)。CMAC 的基本思想是将消息分成若干个分组,然后通过迭代加密和密钥派生过程生成 MAC 值。
假设:
⚝ \(E\) 是一个分组密码算法,分组大小为 \(n\) 比特 (例如,AES 的分组大小为 128 比特,DES 的分组大小为 64 比特)。
⚝ \(K\) 是共享密钥。
⚝ \(m\) 是要认证的消息。
⚝ \(L\) 是通过对全零分组使用分组密码加密得到的子密钥:\(L = E_K(0^n)\)。
⚝ \(K_1\) 和 \(K_2\) 是从 \(L\) 派生出的两个子密钥。
子密钥 \(K_1\) 和 \(K_2\) 的派生
子密钥 \(K_1\) 和 \(K_2\) 的派生过程如下:
- 计算 \(L = E_K(0^n)\),即使用密钥 \(K\) 加密一个全零分组。
- 如果 \(L\) 的最高位 (most significant bit, MSB) 为 0,则 \(K_1 = (L << 1)\),即 \(L\) 左移一位。否则,\(K_1 = (L << 1) \oplus C\),其中 \(C\) 是一个预定义的常数,对于 128 比特的分组密码,\(C = 0x00000000000000000000000000000087\)。对于 64 比特的分组密码,\(C = 0x000000000000001B\)。
- 如果 \(K_1\) 的最高位为 0,则 \(K_2 = (K_1 << 1)\)。否则,\(K_2 = (K_1 << 1) \oplus C\)。
CMAC 的计算步骤
消息分组 (Message Padding):将消息 \(m\) 分成 \(l\) 个分组 \(m_1, m_2, ..., m_l\),每个分组大小为 \(n\) 比特。如果最后一个分组 \(m_l\) 的长度小于 \(n\) 比特,则需要进行填充 (padding)。CMAC 使用两种填充方式:
▮▮▮▮⚝ 如果最后一个分组 \(m_l\) 的长度正好为 \(n\) 比特,则将 \(m_l\) 作为最后一个分组。
▮▮▮▮⚝ 如果最后一个分组 \(m_l\) 的长度小于 \(n\) 比特,则首先在 \(m_l\) 末尾添加一个 '1' 比特,然后填充足够多的 '0' 比特,使其长度达到 \(n\) 比特。这种填充方式称为 "位填充" (bit padding)。迭代加密 (Iterative Encryption):
▮▮▮▮⚝ 初始化一个中间值 \(X_0 = 0^n\)。
▮▮▮▮⚝ 对于 \(i = 1, 2, ..., l-1\),计算 \(X_i = E_K(X_{i-1} \oplus m_i)\)。
▮▮▮▮⚝ 对于最后一个分组 \(m_l\),根据消息的填充情况选择不同的子密钥:
▮▮▮▮⚝ 如果消息的最后一个分组 \(m_l\) 在填充前长度小于 \(n\) 比特 (即进行了位填充),则使用子密钥 \(K_2\)。计算 \(X_l = E_K(X_{l-1} \oplus (m_l \oplus K_2))\)。
▮▮▮▮⚝ 如果消息的最后一个分组 \(m_l\) 在填充前长度正好为 \(n\) 比特 (即没有进行位填充),则使用子密钥 \(K_1\)。计算 \(X_l = E_K(X_{l-1} \oplus (m_l \oplus K_1))\)。输出 MAC 值 (Output MAC Value):最终的 CMAC 值是最后一个中间值 \(X_l\) 的前 \(t\) 比特,其中 \(t\) 是 MAC 值的期望长度。通常 \(t\) 等于分组密码的分组大小 \(n\)。
CMAC 的安全性
CMAC 的安全性依赖于底层分组密码算法 \(E\) 的安全性。如果分组密码 \(E\) 是安全的,并且密钥 \(K\) 是保密的,那么 CMAC 就能提供可靠的消息认证。CMAC 的密钥派生过程和最后分组的特殊处理是其安全性的关键。通过使用不同的子密钥 \(K_1\) 和 \(K_2\) 处理最后一个分组,CMAC 可以有效地抵抗某些针对 CBC-MAC (Cipher Block Chaining Message Authentication Code) 的攻击。
CMAC 的应用
CMAC 在许多需要高性能和硬件实现的场景中得到应用,例如:
⚝ 数据存储安全:CMAC 可以用于保护存储数据的完整性和认证性,例如在磁盘加密和数据备份系统中。
⚝ 网络安全协议:在某些网络协议中,CMAC 可以作为消息认证机制,例如在 IEEE 802.1AE (MACsec) 标准中。
⚝ 嵌入式系统安全:由于 CMAC 算法相对简单且易于硬件实现,因此在资源受限的嵌入式系统中得到广泛应用。
⚝ 金融交易安全:在金融交易系统中,CMAC 可以用于确保交易信息的完整性和认证性。
与 CBC-MAC 的比较
CMAC 是对 CBC-MAC 的改进和增强。CBC-MAC 是一种早期的基于分组密码的 MAC 算法,其计算过程类似于 CBC (Cipher Block Chaining) 模式的加密,但只输出最后一个分组的密文作为 MAC 值。然而,CBC-MAC 存在一些安全缺陷,例如容易受到长度扩展攻击。CMAC 通过引入子密钥派生和对最后一个分组的特殊处理,有效地解决了 CBC-MAC 的安全问题,并提高了安全性。
总结
CMAC 是一种基于分组密码算法的高效消息认证码,它通过迭代加密和密钥派生过程生成 MAC 值。CMAC 具有良好的安全性和性能,尤其适用于硬件实现和对性能敏感的应用场景。理解 CMAC 的构造原理、安全性特点以及与 CBC-MAC 的区别,对于选择合适的 MAC 算法和构建安全系统至关重要。
6.2 数字签名 (Digital Signatures)
6.2.1 数字签名的概念与作用 (Concepts and Functions of Digital Signatures)
数字签名 (digital signature) 是一种类似于传统手写签名的密码学技术,用于验证数据的完整性、认证性和不可否认性 (non-repudiation)。在数字世界中,数字签名扮演着至关重要的角色,它确保了电子文档和消息的真实性和可信度。
概念
数字签名使用非对称加密 (asymmetric cryptography) 技术。每个用户都有一对密钥:私钥 (private key) 和公钥 (public key)。私钥由用户秘密保管,用于生成签名;公钥可以公开分发,用于验证签名。数字签名的过程包括两个主要步骤:
- 签名 (Signing):发送方使用自己的私钥对消息 (或消息的哈希值) 进行加密运算,生成数字签名。
- 验证 (Verification):接收方使用发送方的公钥对接收到的数字签名进行解密运算,并验证签名的有效性。
作用
数字签名主要有以下几个关键作用:
① 认证性 (Authentication):数字签名可以验证消息的来源。只有拥有发送方私钥的人才能生成有效的签名。接收方使用发送方的公钥验证签名,如果验证成功,则可以确信消息确实来自声称的发送方。
② 完整性 (Integrity):数字签名可以检测消息在传输过程中是否被篡改。任何对消息内容的修改都会导致签名验证失败,从而保证了消息的完整性。通常,为了提高效率,数字签名算法通常是对消息的哈希值 (message digest) 进行签名,而不是直接对整个消息签名。
③ 不可否认性 (Non-repudiation):数字签名提供了不可否认性。由于私钥只有签名者拥有,一旦签名被验证成功,签名者就无法否认自己对消息的签名行为。这在法律和商业领域具有重要的意义,可以防止交易抵赖和责任推卸。
数字签名的基本流程
数字签名的基本流程如下:
- 生成密钥对 (Key Pair Generation):签名者生成一对公钥和私钥。私钥保密,公钥公开。
- 签名过程 (Signing Process):
▮▮▮▮⚝ 签名者使用哈希函数对消息 \(m\) 生成哈希值 \(h = H(m)\)。
▮▮▮▮⚝ 签名者使用自己的私钥 \(sk\) 对哈希值 \(h\) 进行签名,生成数字签名 \(sig = \text{Sign}_{sk}(h)\)。
▮▮▮▮⚝ 签名者将消息 \(m\) 和数字签名 \(sig\) 一起发送给验证者。 - 验证过程 (Verification Process):
▮▮▮▮⚝ 验证者接收到消息 \(m\) 和数字签名 \(sig\)。
▮▮▮▮⚝ 验证者使用相同的哈希函数对消息 \(m\) 生成哈希值 \(h' = H(m)\)。
▮▮▮▮⚝ 验证者使用签名者的公钥 \(pk\) 对数字签名 \(sig\) 进行验证,计算 \(v = \text{Verify}_{pk}(sig, h')\)。
▮▮▮▮⚝ 如果验证结果 \(v\) 为真 (true),则签名有效,消息的完整性和认证性得到保证。否则,签名无效。
数字签名的类型
根据不同的密码学算法,数字签名可以分为多种类型,常见的包括:
⚝ RSA 数字签名 (RSA Digital Signature):基于 RSA 算法的数字签名方案,是最早和最广泛使用的数字签名算法之一。
⚝ DSA 数字签名 (Digital Signature Algorithm DSA):美国国家标准,基于离散对数问题 (discrete logarithm problem) 的数字签名算法。
⚝ ECDSA 数字签名 (Elliptic Curve Digital Signature Algorithm ECDSA):基于椭圆曲线密码学 (Elliptic Curve Cryptography ECC) 的数字签名算法,具有更高的效率和安全性,逐渐成为主流。
⚝ EdDSA 数字签名 (Edwards-curve Digital Signature Algorithm EdDSA):基于 Edwards 曲线的数字签名算法,具有更高的性能和安全性,例如 Schnorr 签名和 Ed25519。
数字签名的应用
数字签名在信息安全领域有着广泛的应用,例如:
⚝ 软件发布 (Software Distribution):软件开发者可以使用数字签名对发布的软件进行签名,用户可以通过验证签名来确保软件的来源可信,并且没有被篡改。
⚝ 电子邮件安全 (Email Security):数字签名可以用于电子邮件的身份认证和内容完整性保护,例如 S/MIME 和 PGP 协议。
⚝ 电子文档安全 (Electronic Document Security):数字签名可以用于电子合同、电子票据等电子文档的签名和验证,确保文档的法律效力。
⚝ SSL/TLS 协议:在 SSL/TLS 协议中,服务器证书使用数字签名进行认证,客户端通过验证服务器证书的签名来确认服务器的身份。
⚝ 区块链技术 (Blockchain Technology):在区块链技术中,数字签名用于交易的签名和验证,确保交易的有效性和不可篡改性。
总结
数字签名是一种重要的密码学技术,它利用非对称加密算法实现了消息的认证性、完整性和不可否认性。数字签名在保障数字世界的安全和信任方面发挥着关键作用,广泛应用于各种安全协议和应用场景。理解数字签名的概念、作用和基本流程,对于深入学习密码学和信息安全至关重要。
6.2.2 RSA 数字签名 (RSA Digital Signature)
RSA 数字签名 (RSA Digital Signature) 是基于 RSA 公钥密码算法 (RSA public-key cryptosystem) 的一种数字签名方案。由于 RSA 算法的广泛应用和成熟度,RSA 数字签名成为最早被广泛采用的数字签名算法之一。RSA 数字签名利用 RSA 算法的加密和解密过程来实现签名和验证功能。
RSA 数字签名的原理
RSA 数字签名的核心原理是利用 RSA 算法的私钥进行签名,公钥进行验证。其基本思想是:签名过程相当于使用私钥对消息的哈希值进行“加密”,验证过程相当于使用公钥对签名进行“解密”并与消息的哈希值进行比较。
RSA 数字签名的密钥生成
RSA 数字签名的密钥生成过程与 RSA 加密算法的密钥生成过程相同:
- 选择两个大素数 \(p\) 和 \(q\):随机选择两个大素数 \(p\) 和 \(q\),通常要求素数的长度足够大 (例如,2048 位或 3072 位) 以保证安全性。
- 计算模数 \(n\):计算 \(n = p \times q\)。
- 计算欧拉函数 \(\phi(n)\):计算 \(\phi(n) = (p-1)(q-1)\)。
- 选择公钥指数 \(e\):选择一个整数 \(e\),满足 \(1 < e < \phi(n)\),且 \(\text{gcd}(e, \phi(n)) = 1\),即 \(e\) 和 \(\phi(n)\) 互质。通常选择较小的素数作为 \(e\),例如 65537。
- 计算私钥指数 \(d\):计算 \(e\) 模 \(\phi(n)\) 的乘法逆元 \(d\),即找到一个整数 \(d\) 满足 \(e \cdot d \equiv 1 \pmod{\phi(n)}\)。可以使用扩展欧几里得算法 (Extended Euclidean Algorithm) 计算 \(d\)。
公钥为 \((n, e)\),私钥为 \((n, d)\)。在 RSA 数字签名中,私钥 \((n, d)\) 用于签名,公钥 \((n, e)\) 用于验证签名。
RSA 数字签名的签名过程
假设要对消息 \(m\) 进行 RSA 数字签名,签名过程如下:
- 计算消息哈希值 \(h\):使用密码学哈希函数 \(H\) (例如 SHA-256) 计算消息 \(m\) 的哈希值 \(h = H(m)\)。
- 签名计算 \(s\):使用私钥 \((n, d)\) 对哈希值 \(h\) 进行签名计算:\(s = h^d \pmod{n}\)。
▮▮▮▮⚝ 这里 \(s\) 就是 RSA 数字签名。
RSA 数字签名的验证过程
接收方收到消息 \(m\) 和签名 \(s\) 后,验证过程如下:
- 计算消息哈希值 \(h'\):使用相同的哈希函数 \(H\) 计算接收到的消息 \(m\) 的哈希值 \(h' = H(m)\)。
- 签名验证 \(v\):使用公钥 \((n, e)\) 对签名 \(s\) 进行验证计算:\(v = s^e \pmod{n}\)。
- 验证结果比较:比较验证结果 \(v\) 和哈希值 \(h'\)。如果 \(v \equiv h' \pmod{n}\),则签名有效;否则,签名无效。
RSA 数字签名的安全性
RSA 数字签名的安全性基于 RSA 问题的难解性,即在已知公钥 \((n, e)\) 和密文 \(c\) 的情况下,求解明文 \(m\) 使得 \(c \equiv m^e \pmod{n}\) 是计算上不可行的。更具体地说,RSA 数字签名的安全性依赖于大整数分解 (integer factorization) 的困难性。如果能够有效地分解大整数 \(n\) 为其素因子 \(p\) 和 \(q\),那么就可以计算出私钥 \(d\),从而伪造 RSA 签名。
为了保证 RSA 数字签名的安全性,需要选择足够大的密钥长度 (例如,2048 位或 3072 位),并使用安全的哈希函数。此外,还需要注意一些针对 RSA 数字签名的攻击,例如:
⚝ 选择消息攻击 (Chosen-message attack):攻击者可以请求签名者对一系列精心选择的消息进行签名,然后利用这些签名信息来伪造对其他消息的签名。为了抵抗选择消息攻击,通常需要使用安全的填充方案 (padding scheme),例如 PKCS#1 v1.5 或 PSS (Probabilistic Signature Scheme)。
⚝ 小指数攻击 (Small-exponent attack):如果公钥指数 \(e\) 选择过小 (例如 \(e=3\)),可能会受到小指数攻击。因此,通常建议选择较大的公钥指数,例如 \(e=65537\)。
RSA 数字签名的填充方案
为了提高 RSA 数字签名的安全性,并使其能够处理任意长度的消息,通常需要使用填充方案。填充方案在哈希值 \(h\) 被签名之前对其进行处理,增加随机性和结构,以抵抗各种攻击。常见的 RSA 数字签名填充方案包括:
⚝ PKCS#1 v1.5 填充 (PKCS#1 v1.5 Padding):一种早期的填充方案,在哈希值前添加固定的填充字节序列。虽然 PKCS#1 v1.5 填充在实践中被广泛使用,但它存在一些安全漏洞,例如 Bleichenbacher 攻击。
⚝ PSS 填充 (Probabilistic Signature Scheme PSS):一种更安全的填充方案,引入了随机盐值 (salt) 和掩码生成函数 (mask generation function),提供了更高的安全性,并被认为是抵抗选择消息攻击的有效方法。
RSA 数字签名的应用
RSA 数字签名广泛应用于各种安全协议和应用中,例如:
⚝ 数字证书 (Digital Certificates):数字证书通常使用 RSA 数字签名进行签名,以验证证书颁发机构 (CA) 的身份和证书的有效性。
⚝ 安全电子邮件 (Secure Email):S/MIME 和 PGP 等安全电子邮件协议使用 RSA 数字签名来提供邮件的认证性和不可否认性。
⚝ 代码签名 (Code Signing):软件开发者可以使用 RSA 数字签名对软件代码进行签名,用户可以验证签名来确保软件的来源和完整性。
⚝ 电子政务和电子商务 (E-government and E-commerce):RSA 数字签名在电子政务和电子商务领域被广泛用于电子文档的签名和验证,例如电子合同、电子发票等。
总结
RSA 数字签名是一种经典且重要的数字签名算法,它基于 RSA 公钥密码算法的原理实现。RSA 数字签名具有广泛的应用和成熟的理论基础,但在使用时需要注意密钥长度的选择、填充方案的应用以及潜在的安全风险。理解 RSA 数字签名的原理、签名和验证过程,对于安全系统设计和应用开发具有重要的意义。
6.2.3 ECDSA 数字签名 (ECDSA Digital Signature)
ECDSA (Elliptic Curve Digital Signature Algorithm, 椭圆曲线数字签名算法) 是一种基于椭圆曲线密码学 (Elliptic Curve Cryptography ECC) 的数字签名算法。与 RSA 数字签名相比,ECDSA 在提供相同安全强度的前提下,可以使用更短的密钥长度,从而具有更高的效率和性能。随着移动设备和嵌入式系统的普及,ECDSA 逐渐成为主流的数字签名算法。
ECDSA 数字签名的原理
ECDSA 的安全性基于椭圆曲线离散对数问题 (Elliptic Curve Discrete Logarithm Problem ECDLP) 的难解性。其基本思想是在椭圆曲线上进行点乘运算和哈希运算,结合私钥生成签名,使用公钥进行验证。
ECDSA 数字签名的密钥生成
ECDSA 的密钥生成过程如下:
- 选择椭圆曲线参数 (Choose Elliptic Curve Parameters):选择一条合适的椭圆曲线 \(E\),定义在有限域 \(F_q\) 上,以及曲线上的一个基点 \(G\),其阶数为大素数 \(n\)。椭圆曲线参数包括有限域 \(F_q\)、曲线方程、基点 \(G\) 和阶数 \(n\)。常用的椭圆曲线标准包括 NIST 曲线 (例如 P-256, P-384, P-521) 和 Curve25519。
- 生成私钥 \(d\):随机选择一个整数 \(d\),满足 \(1 \le d < n\),作为私钥。
- 计算公钥 \(Q\):计算公钥 \(Q = d \cdot G\),即基点 \(G\) 的 \(d\) 倍点乘。
私钥为 \(d\),公钥为 \(Q\)。在 ECDSA 数字签名中,私钥 \(d\) 用于签名,公钥 \(Q\) 用于验证签名。
ECDSA 数字签名的签名过程
假设要对消息 \(m\) 进行 ECDSA 数字签名,签名过程如下:
- 计算消息哈希值 \(e\):使用密码学哈希函数 \(H\) (例如 SHA-256) 计算消息 \(m\) 的哈希值 \(e = H(m)\)。将哈希值 \(e\) 转换为整数。
- 生成随机数 \(k\):随机选择一个整数 \(k\),满足 \(1 \le k < n\)。
- 计算点 \(R = k \cdot G\):计算基点 \(G\) 的 \(k\) 倍点乘,得到椭圆曲线上的点 \(R = (x_R, y_R)\)。
- 计算 \(r = x_R \pmod{n}\):取点 \(R\) 的 x 坐标 \(x_R\),计算 \(r = x_R \pmod{n}\)。如果 \(r = 0\),则重新选择随机数 \(k\)。
- 计算 \(s = k^{-1}(e + d \cdot r) \pmod{n}\):计算签名值 \(s = k^{-1}(e + d \cdot r) \pmod{n}\),其中 \(k^{-1}\) 是 \(k\) 模 \(n\) 的乘法逆元。如果 \(s = 0\),则重新选择随机数 \(k\)。
- 输出签名 \((r, s)\):\((r, s)\) 即为 ECDSA 数字签名。
ECDSA 数字签名的验证过程
接收方收到消息 \(m\) 和签名 \((r, s)\) 后,验证过程如下:
- 验证 \(r\) 和 \(s\) 的取值范围:验证 \(1 \le r < n\) 和 \(1 \le s < n\) 是否成立。如果不成立,则签名无效。
- 计算消息哈希值 \(e'\):使用相同的哈希函数 \(H\) 计算接收到的消息 \(m\) 的哈希值 \(e' = H(m)\)。将哈希值 \(e'\) 转换为整数。
- 计算 \(w = s^{-1} \pmod{n}\):计算 \(s\) 模 \(n\) 的乘法逆元 \(w = s^{-1} \pmod{n}\)。
- 计算 \(u_1 = e' \cdot w \pmod{n}\) 和 \(u_2 = r \cdot w \pmod{n}\)。
- 计算点 \(R' = u_1 \cdot G + u_2 \cdot Q\):计算 \(R' = u_1 \cdot G + u_2 \cdot Q\),即基点 \(G\) 的 \(u_1\) 倍点乘与公钥 \(Q\) 的 \(u_2\) 倍点乘的和。
- 计算 \(v = x_{R'} \pmod{n}\):取点 \(R'\) 的 x 坐标 \(x_{R'}\),计算 \(v = x_{R'} \pmod{n}\)。
- 验证签名:如果 \(v \equiv r \pmod{n}\),则签名有效;否则,签名无效。
ECDSA 的安全性
ECDSA 的安全性基于椭圆曲线离散对数问题 (ECDLP) 的难解性。如果 ECDLP 是计算上不可行的,并且随机数 \(k\) 是安全生成的,那么 ECDSA 就能提供可靠的数字签名。
为了保证 ECDSA 的安全性,需要选择合适的椭圆曲线参数,使用安全的哈希函数,并确保私钥 \(d\) 和随机数 \(k\) 的安全保密和随机性。特别需要注意的是,随机数 \(k\) 的安全性至关重要。如果随机数 \(k\) 的生成存在偏差或可预测性,可能会导致私钥泄露。例如,如果多次签名使用相同的随机数 \(k\),或者随机数 \(k\) 的部分信息泄露,攻击者可以通过分析签名信息恢复私钥 \(d\)。
ECDSA 的应用
ECDSA 由于其高效性和安全性,在各种安全协议和应用中得到广泛应用,例如:
⚝ TLS/SSL 协议:在 TLS/SSL 协议中,ECDSA 可以用于服务器证书的签名和客户端认证。
⚝ SSH 协议:SSH 协议可以使用 ECDSA 进行主机密钥和用户认证。
⚝ 区块链技术:在比特币 (Bitcoin)、以太坊 (Ethereum) 等区块链技术中,ECDSA 被广泛用于交易的签名和验证。
⚝ 移动支付和金融安全:ECDSA 在移动支付、数字钱包和金融交易安全领域得到广泛应用,例如 Apple Pay、Google Pay 等。
⚝ 物联网 (IoT) 安全:在资源受限的物联网设备中,ECDSA 由于其密钥长度短、计算效率高,成为一种重要的安全解决方案。
与 RSA 数字签名的比较
ECDSA 与 RSA 数字签名相比,主要有以下优势:
⚝ 更高的效率:在相同的安全强度下,ECDSA 使用的密钥长度远小于 RSA。例如,256 位的 ECDSA 密钥提供的安全强度与 3072 位的 RSA 密钥相当。密钥长度的缩短意味着更快的密钥生成、签名和验证速度,以及更低的存储和传输开销。
⚝ 更低的计算资源消耗:ECDSA 的签名和验证过程涉及的运算主要是椭圆曲线上的点乘和点加,这些运算相对于 RSA 的模幂运算更加高效,尤其是在硬件资源受限的环境下。
然而,ECDSA 的安全性对随机数 \(k\) 的依赖性较高,随机数生成的安全性是 ECDSA 安全的关键。相比之下,RSA 数字签名对随机性的要求相对较低。
总结
ECDSA 是一种高效且安全的数字签名算法,基于椭圆曲线密码学的原理实现。ECDSA 具有密钥长度短、计算效率高等优点,在各种安全领域得到广泛应用。理解 ECDSA 的原理、签名和验证过程,以及其安全性特点,对于深入学习椭圆曲线密码学和构建高效安全系统至关重要。
6.3 数字签名标准 DSS (Digital Signature Standard DSS)
数字签名标准 (DSS, Digital Signature Standard) 是美国国家标准与技术研究院 (NIST) 发布的数字签名标准,最初在 FIPS PUB 186 中定义,并在后续版本中不断更新和完善。DSS 实际上定义了多种数字签名算法,包括 DSA (Digital Signature Algorithm)、RSA 数字签名和 ECDSA 数字签名等。在广义上,DSS 可以指代所有 NIST 批准的数字签名算法标准。但在狭义上,DSS 通常特指 DSA 算法。本节主要介绍狭义的 DSS,即 DSA 算法。
DSA (Digital Signature Algorithm) 数字签名算法
DSA (Digital Signature Algorithm, 数字签名算法) 是 DSS 中最初定义的数字签名算法,基于离散对数问题 (Discrete Logarithm Problem DLP) 的难解性。DSA 的设计目标是提供一种安全可靠的数字签名方案,与 RSA 数字签名相比,DSA 更侧重于签名操作,而 RSA 算法的签名和加密操作性能相当。
DSA 数字签名的密钥生成
DSA 数字签名的密钥生成过程如下:
选择参数 \(p, q, g\):
▮▮▮▮⚝ 选择一个 \(L\) 位的大素数 \(p\),其中 \(L\) 通常为 1024 位或 2048 位。
▮▮▮▮⚝ 选择一个 \(N\) 位的大素数 \(q\),其中 \(N\) 通常为 160 位或 256 位,且 \(q\) 是 \(p-1\) 的素因子,即 \(q | (p-1)\)。
▮▮▮▮⚝ 选择一个整数 \(g\),\(1 < g < p\),使得 \(g^q \equiv 1 \pmod{p}\)。通常 \(g\) 可以通过计算 \(h^{(p-1)/q} \pmod{p}\) 得到,其中 \(h\) 是一个随机选择的整数,\(1 < h < p-1\),且 \(h^{(p-1)/q} \not\equiv 1 \pmod{p}\)。
▮▮▮▮⚝ 参数 \((p, q, g)\) 是公开的,可以由多个用户共享。生成私钥 \(x\):随机选择一个整数 \(x\),\(0 < x < q\),作为私钥。
- 计算公钥 \(y\):计算公钥 \(y = g^x \pmod{p}\)。
私钥为 \(x\),公钥为 \(y\),系统参数为 \((p, q, g)\)。
DSA 数字签名的签名过程
假设要对消息 \(m\) 进行 DSA 数字签名,签名过程如下:
- 计算消息哈希值 \(H(m)\):使用密码学哈希函数 \(H\) (例如 SHA-1 或 SHA-256) 计算消息 \(m\) 的哈希值 \(H(m)\)。将哈希值 \(H(m)\) 转换为整数 \(e\)。如果哈希值的长度超过 \(N\) 位,则取其最左边的 \(N\) 位。
- 生成随机数 \(k\):随机选择一个整数 \(k\),\(0 < k < q\)。
- 计算 \(r = (g^k \pmod{p}) \pmod{q}\)。如果 \(r = 0\),则重新选择随机数 \(k\)。
- 计算 \(s = k^{-1}(e + x \cdot r) \pmod{q}\),其中 \(k^{-1}\) 是 \(k\) 模 \(q\) 的乘法逆元。如果 \(s = 0\),则重新选择随机数 \(k\)。
- 输出签名 \((r, s)\):\((r, s)\) 即为 DSA 数字签名。
DSA 数字签名的验证过程
接收方收到消息 \(m\) 和签名 \((r, s)\) 后,验证过程如下:
- 验证 \(r\) 和 \(s\) 的取值范围:验证 \(0 < r < q\) 和 \(0 < s < q\) 是否成立。如果不成立,则签名无效。
- 计算消息哈希值 \(H(m)\):使用相同的哈希函数 \(H\) 计算接收到的消息 \(m\) 的哈希值 \(H(m)\)。将哈希值 \(H(m)\) 转换为整数 \(e'\)。如果哈希值的长度超过 \(N\) 位,则取其最左边的 \(N\) 位。
- 计算 \(w = s^{-1} \pmod{q}\):计算 \(s\) 模 \(q\) 的乘法逆元 \(w = s^{-1} \pmod{q}\)。
- 计算 \(u_1 = e' \cdot w \pmod{q}\) 和 \(u_2 = r \cdot w \pmod{q}\)。
- 计算 \(v = (g^{u_1} \cdot y^{u_2} \pmod{p}) \pmod{q}\)。
- 验证签名:如果 \(v \equiv r \pmod{q}\),则签名有效;否则,签名无效。
DSA 的安全性
DSA 的安全性基于离散对数问题 (DLP) 的难解性。如果 DLP 是计算上不可行的,并且随机数 \(k\) 是安全生成的,那么 DSA 就能提供可靠的数字签名。与 ECDSA 类似,DSA 的安全性也高度依赖于随机数 \(k\) 的安全性。如果随机数 \(k\) 的生成存在问题,可能会导致私钥泄露。
DSA 的应用
DSA 作为数字签名标准,在许多安全协议和应用中得到应用,例如:
⚝ 政府和军事应用:由于 DSA 是美国政府的标准,因此在政府和军事领域得到广泛应用。
⚝ 数字证书:DSA 可以用于数字证书的签名。
⚝ 安全 Shell (SSH):SSH 协议可以使用 DSA 进行用户认证。
⚝ IPsec 协议:IPsec 协议可以使用 DSA 进行身份验证。
DSA 与 RSA 和 ECDSA 的比较
DSA 与 RSA 和 ECDSA 数字签名相比,有以下特点:
⚝ 签名速度:DSA 的签名速度相对较快,与 ECDSA 相当,但通常比 RSA 快。
⚝ 验证速度:DSA 的验证速度相对较慢,通常比 RSA 和 ECDSA 慢。
⚝ 密钥长度:DSA 的公钥和私钥长度相对较长,与 RSA 相当,但比 ECDSA 长。
⚝ 安全性:在相同的安全强度下,DSA 的密钥长度比 ECDSA 长,但与 RSA 相当。DSA 和 ECDSA 的安全性都依赖于随机数的安全性,而 RSA 对随机性的要求相对较低。
随着 ECDSA 的发展和普及,以及对更高效率和更短密钥长度的需求,ECDSA 逐渐取代 DSA 成为更主流的数字签名算法。尽管如此,DSA 作为一种成熟的数字签名标准,仍然在某些特定领域保持着应用。
总结
DSA (Digital Signature Algorithm) 是数字签名标准 DSS 中最初定义的数字签名算法,基于离散对数问题的难解性。DSA 提供了安全可靠的数字签名功能,并在政府、军事和一些传统安全系统中得到应用。理解 DSA 的原理、密钥生成、签名和验证过程,以及其安全性特点和应用场景,有助于全面了解数字签名技术的发展和应用。
6.4 消息认证码与数字签名的比较 (Comparison of MAC and Digital Signatures)
消息认证码 (MAC) 和数字签名 (Digital Signature) 都是用于提供消息认证和完整性保护的密码学技术,但它们在设计目标、实现方式、安全特性和应用场景等方面存在显著的区别。理解这些区别对于选择合适的安全机制至关重要。
关键区别
特性 | 消息认证码 (MAC) | 数字签名 (Digital Signature) |
---|---|---|
密钥类型 | 对称密钥 (Symmetric Key) | 非对称密钥 (Asymmetric Key) |
密钥管理 | 需要安全地共享密钥 | 公钥公开,私钥保密 |
认证范围 | 消息来源认证 (限于共享密钥的参与者) | 消息来源认证 (可公开验证) |
不可否认性 | 不提供不可否认性 (接收者也可能生成 MAC) | 提供不可否认性 (签名者无法否认签名) |
安全性 | 基于对称密码学或哈希函数 | 基于非对称密码学 (如 RSA, ECC, DLP) |
计算效率 | 通常比数字签名更高效 | 通常比 MAC 计算开销更大 |
应用场景 | 通信双方预先共享密钥的场景,内部系统安全,会话密钥认证 | 需要公开验证消息来源和完整性的场景,软件发布,电子文档,公开通信 |
主要功能 | 消息完整性、消息认证 | 消息完整性、消息认证、不可否认性 |
详细比较
① 密钥类型与管理:
⚝ MAC 使用对称密钥,即发送方和接收方共享同一个密钥。密钥管理相对简单,但需要在通信双方之间安全地分发和保管密钥。密钥泄露会影响所有使用该密钥的通信安全。
⚝ 数字签名 使用非对称密钥对,包括私钥和公钥。私钥由签名者秘密保管,用于生成签名;公钥可以公开分发,用于验证签名。公钥基础设施 (PKI, Public Key Infrastructure) 用于管理和分发公钥。
② 认证范围与不可否认性:
⚝ MAC 提供的是消息来源的认证,但这种认证是相对于共享密钥的参与者而言的。由于接收方也拥有相同的密钥,因此接收方可以伪造 MAC,无法向第三方证明消息的来源。MAC 不提供不可否认性。
⚝ 数字签名 提供的是消息来源的认证,并且具有不可否认性。由于私钥只有签名者拥有,签名者无法否认自己对消息的签名行为。数字签名可以向第三方证明消息的来源和完整性。
③ 安全性与算法基础:
⚝ MAC 的安全性通常基于对称密码学算法 (如分组密码 CMAC) 或密码学哈希函数 (如 HMAC)。MAC 的安全性依赖于密钥的保密性和底层密码算法的安全性。
⚝ 数字签名 的安全性基于非对称密码学算法,如 RSA、ECDSA、DSA 等。数字签名的安全性依赖于私钥的保密性和底层非对称密码算法的数学难题 (如大整数分解、离散对数问题、椭圆曲线离散对数问题) 的难解性。
④ 计算效率:
⚝ MAC 的计算效率通常比数字签名更高。对称密码学算法和哈希函数的计算速度通常比非对称密码学算法更快。MAC 的高效性使其适用于对性能要求较高的场景。
⚝ 数字签名 的计算开销通常比 MAC 更大。非对称密码学算法的计算复杂度较高,签名和验证过程需要更多的计算资源。
⑤ 应用场景:
⚝ MAC 适用于通信双方预先共享密钥的场景,例如在安全通道内部、在已建立安全连接的会话中、内部系统之间的认证等。MAC 常用于保护数据的完整性和认证性,但不要求提供不可否认性。
⚝ 数字签名 更适用于需要公开验证消息来源和内容完整性的场景,例如软件发布、电子邮件安全、电子文档签名、在线交易等。数字签名可以提供消息的认证性、完整性和不可否认性,适用于需要建立信任和防止抵赖的场景。
选择 MAC 还是数字签名
选择使用 MAC 还是数字签名,需要根据具体的应用场景和安全需求进行权衡:
⚝ 如果通信双方事先共享密钥,且不需要提供不可否认性,对性能要求较高,则 MAC 是一个更合适的选择。例如,在加密通信通道中,可以使用 MAC 来验证消息的完整性和认证性,提高通信效率。
⚝ 如果需要提供不可否认性,或者需要公开验证消息的来源和完整性,密钥分发不是主要问题,则数字签名是必要的选择。例如,在软件发布、电子合同、数字证书等场景中,需要使用数字签名来确保消息的真实性和法律效力。
在某些情况下,MAC 和数字签名可以结合使用,以提供更全面的安全保护。例如,在某些安全协议中,可以使用数字签名来认证身份,然后使用 MAC 来保护后续通信数据的完整性和认证性,以兼顾安全性和效率。
总结
消息认证码 (MAC) 和数字签名 (Digital Signature) 是两种重要的密码学技术,分别用于提供消息认证和完整性保护。MAC 基于对称密钥,高效但缺乏不可否认性;数字签名基于非对称密钥,提供不可否认性但计算开销较大。理解 MAC 和数字签名之间的区别,并根据具体的应用场景和安全需求选择合适的机制,是构建安全可靠系统的关键。
7. chapter 7: 密钥管理与密钥交换 (Key Management and Key Exchange)
7.1 密钥管理概述 (Overview of Key Management)
在密码学中,密钥 (Key) 是核心要素,其安全性直接关系到整个密码系统的安全。密钥管理 (Key Management) 是指密钥从生成、分发、存储、使用到销毁的整个生命周期内的管理过程。一个完善的密钥管理体系是保证密码系统安全可靠运行的关键。如果密钥管理不当,即使采用了最强大的密码算法,也无法保证信息的安全。密钥管理的目标是确保密钥在整个生命周期内的 保密性 (Confidentiality)、完整性 (Integrity) 和 可用性 (Availability)。
7.1.1 密钥生成 (Key Generation)
密钥生成 (Key Generation) 是密钥管理的首要环节。高质量的密钥是密码系统安全的基础。密钥生成的目标是产生 随机 (Random)、不可预测 (Unpredictable) 且 符合密码算法要求的密钥。
① 随机性 (Randomness):密钥必须是随机产生的,以避免被攻击者预测。真随机数生成器 (True Random Number Generator, TRNG) 利用物理现象(如放射性衰变、热噪声等)产生真随机数,但效率较低。伪随机数生成器 (Pseudo-Random Number Generator, PRNG) 通过确定性算法产生看似随机的序列,效率高,但其随机性依赖于种子 (Seed) 的保密性和随机性。在密码学中,通常使用 密码学安全的伪随机数生成器 (Cryptographically Secure Pseudo-Random Number Generator, CSPRNG),它在伪随机数生成器的基础上,增强了抗预测性,即使攻击者知道一部分序列,也无法预测后续的序列。
② 不可预测性 (Unpredictability):即使攻击者获取了部分密钥,也无法预测或推导出其他密钥或未来的密钥。这要求密钥生成过程必须是不可预测的,避免使用可预测的算法或种子。
③ 符合算法要求 (Algorithm Compliance):不同密码算法对密钥的长度、格式和特性有不同的要求。密钥生成必须满足所使用密码算法的具体要求。例如,AES 算法需要 128-bit、192-bit 或 256-bit 的密钥,RSA 算法的密钥则需要满足特定的数学结构。
密钥生成过程通常包括以下步骤:
① 种子选择 (Seed Selection):对于 CSPRNG,选择一个高熵的种子至关重要。种子来源可以是系统噪声、用户输入、硬件随机数生成器等。种子的质量直接影响密钥的随机性和不可预测性。
② 随机数生成 (Random Number Generation):使用 CSPRNG 基于种子生成随机数。常用的 CSPRNG 算法包括 DRBG (Deterministic Random Bit Generator) 系列算法,如 Hash_DRBG, HMAC_DRBG, CTR_DRBG 等。
③ 密钥格式化 (Key Formatting):将生成的随机数转换为符合密码算法要求的密钥格式。例如,对于 RSA 密钥,需要生成两个大素数 \(p\) 和 \(q\),然后计算 \(n = p \times q\),并选择合适的公钥指数 \(e\) 和私钥指数 \(d\)。
④ 密钥验证 (Key Validation):验证生成的密钥是否符合密码算法的要求,例如,检查 RSA 密钥的素数 \(p\) 和 \(q\) 是否足够大,以及 \(e\) 和 \(d\) 是否满足 \(e \times d \equiv 1 \pmod{\phi(n)}\) 的关系,其中 \(\phi(n)\) 是欧拉函数。
7.1.2 密钥分发 (Key Distribution)
密钥分发 (Key Distribution) 是指将生成的密钥安全地传递给通信双方或需要使用密钥的实体。密钥分发是密钥管理中最具挑战性的环节之一,因为密钥在传输过程中容易被窃听或篡改。密钥分发的目标是确保密钥在传输过程中的 保密性 (Confidentiality) 和 完整性 (Integrity)。
常见的密钥分发方法包括:
① 手动分发 (Manual Distribution):通过人工方式,如信使传递、安全通道口头告知等方式分发密钥。这种方式安全性较高,但效率低,不适用于大规模和频繁的密钥分发场景。通常用于初始密钥或高安全级别密钥的分发。
② 对称密钥加密分发 (Symmetric-key Encryption Distribution):使用已有的共享对称密钥加密新的密钥,然后分发加密后的密钥。这种方式需要预先存在一个共享密钥,称为 密钥加密密钥 (Key Encryption Key, KEK)。例如,Kerberos 协议中使用主密钥 (Master Key) 加密会话密钥 (Session Key) 进行分发。
③ 公钥加密分发 (Public-key Encryption Distribution):使用接收方的公钥加密要分发的密钥,接收方使用自己的私钥解密获取密钥。这种方式无需预先共享密钥,利用了公钥密码体制的优势。例如,在 TLS/SSL 握手协议中,客户端可以使用服务器的公钥加密预主密钥 (Pre-Master Secret) 发送给服务器。
④ Diffie-Hellman 密钥交换 (Diffie-Hellman Key Exchange):通信双方通过 Diffie-Hellman 密钥交换协议,在不安全信道上协商生成共享密钥。这种方式不需要预先分发密钥,也不需要依赖第三方,具有前向安全性 (Forward Secrecy)。
⑤ 密钥传输协议 (Key Transport Protocols):使用专门的密钥传输协议,如 TLS/SSL, SSH 等,在安全信道上分发密钥。这些协议通常结合了对称加密、公钥加密和数字签名等技术,提供安全的密钥分发机制。
选择合适的密钥分发方法需要综合考虑安全性、效率、成本和应用场景等因素。对于高安全要求的系统,可能需要采用多种密钥分发方法相结合的方式,例如,先通过手动分发初始密钥,再使用公钥加密或 Diffie-Hellman 密钥交换协议进行后续密钥的分发。
7.1.3 密钥存储 (Key Storage)
密钥存储 (Key Storage) 是指将密钥安全地存储在存储介质中,以便在需要时使用。密钥存储的安全性直接影响到整个密码系统的安全。密钥存储的目标是确保密钥在存储状态下的 保密性 (Confidentiality)、完整性 (Integrity) 和 可用性 (Availability)。
密钥存储面临的主要威胁包括:
① 物理泄露 (Physical Leakage):存储介质被盗窃、丢失或物理损坏,导致密钥泄露。
② 逻辑泄露 (Logical Leakage):未经授权的访问、恶意软件攻击、内部人员泄露等导致密钥泄露。
③ 侧信道攻击 (Side-channel Attack):通过分析密钥存储设备的功耗、电磁辐射、时序等侧信道信息,推导出密钥。
为了保护密钥的安全存储,可以采取以下措施:
① 物理安全措施 (Physical Security Measures):将密钥存储在安全的物理环境中,如安全机房、保险柜、硬件安全模块 (Hardware Security Module, HSM) 等。限制物理访问权限,防止未经授权的人员接触到存储介质。
② 访问控制 (Access Control):实施严格的访问控制策略,只允许授权用户和进程访问密钥。使用身份认证 (Authentication) 和授权 (Authorization) 机制,确保只有经过身份验证和授权的用户才能访问密钥。
③ 加密存储 (Encrypted Storage):使用加密算法加密密钥后再存储。即使存储介质被泄露,攻击者也无法直接获取明文密钥。可以使用 密钥加密密钥 (KEK) 加密密钥,KEK 本身也需要妥善保管。
④ 安全存储介质 (Secure Storage Media):使用专门的安全存储介质,如 HSM、智能卡 (Smart Card)、可信平台模块 (Trusted Platform Module, TPM) 等。这些硬件设备具有防篡改、防物理攻击和安全密钥存储功能。
⑤ 密钥备份与恢复 (Key Backup and Recovery):为了防止密钥丢失或损坏,需要定期备份密钥。备份密钥也需要采取与主密钥相同的安全保护措施。同时,需要建立完善的密钥恢复机制,以便在密钥丢失或损坏时能够及时恢复密钥,保证系统的可用性。
⑥ 抗侧信道攻击措施 (Side-channel Attack Countermeasures):在密钥存储和使用过程中,采取抗侧信道攻击的措施,如掩码 (Masking)、隐藏 (Hiding)、噪声注入 (Noise Injection) 等,降低侧信道攻击的风险。
7.1.4 密钥撤销 (Key Revocation)
密钥撤销 (Key Revocation) 是指在密钥泄露、 compromise 或不再需要使用时,使其失效的过程。密钥撤销是密钥管理的重要组成部分,可以有效降低密钥泄露带来的风险。密钥撤销的目标是及时、有效地 停止使用失效的密钥,防止其被用于非法目的。
密钥撤销的场景包括:
① 密钥泄露 (Key Compromise):当怀疑或确认密钥已经泄露给未授权方时,必须立即撤销该密钥。
② 用户或设备变更 (User or Device Change):当用户离职、设备丢失或更换时,需要撤销与该用户或设备相关的密钥。
③ 密钥生命周期结束 (Key Lifecycle End):密钥具有一定的生命周期,为了降低长期使用同一密钥带来的风险,需要定期更换密钥,并撤销旧密钥。
④ 安全策略变更 (Security Policy Change):当安全策略发生变化,需要更换密钥时,需要撤销旧密钥。
密钥撤销的方法和机制取决于具体的密钥类型和应用场景。常见的密钥撤销方法包括:
① 证书吊销列表 CRL (Certificate Revocation List CRL):在公钥基础设施 (PKI) 中,证书颁发机构 (CA) 维护一个 CRL,列出所有已吊销的证书。当用户收到一个证书时,需要查询 CRL 确认证书是否已被吊销。
② 在线证书状态协议 OCSP (Online Certificate Status Protocol OCSP):OCSP 是一种在线查询证书状态的协议。用户可以通过 OCSP 查询服务器实时获取证书的吊销状态。
③ 密钥更新 (Key Update):生成新的密钥替换旧密钥,并通知所有相关方停止使用旧密钥。对于对称密钥,需要安全地分发新密钥。对于公钥,需要更新证书或公钥信息。
④ 密钥销毁 (Key Destruction):彻底销毁已撤销的密钥,防止密钥被恢复或重新使用。对于软件密钥,可以使用安全擦除技术覆盖密钥存储区域。对于硬件密钥,可以物理销毁存储介质。
有效的密钥撤销机制需要具备以下特点:
① 及时性 (Timeliness):密钥撤销操作必须及时生效,尽快停止使用失效的密钥。
② 可靠性 (Reliability):密钥撤销信息必须准确可靠,防止误撤销或撤销失败。
③ 可扩展性 (Scalability):密钥撤销机制应能够支持大规模密钥的撤销管理。
④ 易管理性 (Manageability):密钥撤销过程应易于管理和操作,降低管理成本。
7.2 密钥交换协议 (Key Exchange Protocols)
密钥交换协议 (Key Exchange Protocols) 是指通信双方在不安全信道上协商建立共享密钥的协议。密钥交换协议是密钥管理的重要组成部分,它解决了密钥分发中的安全难题,使得通信双方可以在没有预先共享密钥的情况下,安全地建立通信。
7.2.1 Diffie-Hellman 密钥交换 (Diffie-Hellman Key Exchange)
Diffie-Hellman 密钥交换 (Diffie-Hellman Key Exchange, DH) 是第一个公开发表的公钥密码学算法,由 Whitfield Diffie 和 Martin Hellman 于 1976 年提出。DH 协议允许双方在不安全的信道上协商生成共享密钥,该密钥可以用于后续的对称加密通信。DH 协议的安全性基于 离散对数问题 (Discrete Logarithm Problem, DLP) 的难解性。
Diffie-Hellman 密钥交换协议的步骤如下:
① 参数协商 (Parameter Agreement):通信双方 Alice 和 Bob 协商选择一个大素数 \(p\) 和一个生成元 \(g\),\(g\) 是有限域 \(Z_p^*\) 的生成元。这两个参数可以公开。
② 密钥生成 (Key Generation):
▮▮▮▮⚝ Alice 随机选择一个私钥 \(a\),\(1 < a < p-1\),计算公钥 \(A = g^a \pmod{p}\)。
▮▮▮▮⚝ Bob 随机选择一个私钥 \(b\),\(1 < b < p-1\),计算公钥 \(B = g^b \pmod{p}\)。
③ 密钥交换 (Key Exchange):
▮▮▮▮⚝ Alice 将公钥 \(A\) 发送给 Bob。
▮▮▮▮⚝ Bob 将公钥 \(B\) 发送给 Alice。
④ 密钥计算 (Key Calculation):
▮▮▮▮⚝ Alice 计算共享密钥 \(K_A = B^a \pmod{p} = (g^b)^a \pmod{p} = g^{ab} \pmod{p}\)。
▮▮▮▮⚝ Bob 计算共享密钥 \(K_B = A^b \pmod{p} = (g^a)^b \pmod{p} = g^{ab} \pmod{p}\)。
由于 \(K_A = K_B = g^{ab} \pmod{p}\),Alice 和 Bob 最终协商得到相同的共享密钥 \(K = g^{ab} \pmod{p}\)。
安全性分析 (Security Analysis):
⚝ 安全性基础 (Security Basis):DH 协议的安全性基于离散对数问题的难解性。攻击者 Eve 即使截获了 \(p\), \(g\), \(A = g^a \pmod{p}\) 和 \(B = g^b \pmod{p}\),在计算上也很难求解出私钥 \(a\) 或 \(b\),从而无法计算出共享密钥 \(K = g^{ab} \pmod{p}\)。
⚝ 中间人攻击 (Man-in-the-Middle Attack):DH 协议容易受到中间人攻击。假设攻击者 Mallory 位于 Alice 和 Bob 之间,它可以分别与 Alice 和 Bob 进行 DH 密钥交换,冒充 Bob 与 Alice 交换密钥,冒充 Alice 与 Bob 交换密钥。这样,Mallory 就可以截获和篡改 Alice 和 Bob 之间的通信内容。
为了防御中间人攻击,可以将 DH 协议与身份认证机制结合使用,例如,使用数字签名对交换的公钥进行认证,确保公钥的真实性。
改进与变体 (Improvements and Variants):
⚝ 椭圆曲线 Diffie-Hellman 密钥交换 (Elliptic Curve Diffie-Hellman, ECDH):将 DH 协议应用于椭圆曲线密码学,可以获得更高的安全强度和更短的密钥长度。ECDH 协议的安全性基于 椭圆曲线离散对数问题 (Elliptic Curve Discrete Logarithm Problem, ECDLP) 的难解性。
⚝ 带认证的 Diffie-Hellman 密钥交换 (Authenticated Diffie-Hellman):通过数字签名或其他身份认证机制,对 DH 密钥交换过程中的公钥进行认证,防止中间人攻击。例如,数字签名算法 DSA (Digital Signature Algorithm) 或 椭圆曲线数字签名算法 ECDSA (Elliptic Curve Digital Signature Algorithm) 可以用于对 DH 公钥进行签名。
7.2.2 基于公钥加密的密钥交换 (Key Exchange based on Public-key Encryption)
除了 Diffie-Hellman 密钥交换协议,还可以使用 公钥加密算法 (Public-key Encryption Algorithm) 进行密钥交换。基于公钥加密的密钥交换协议利用接收方的公钥加密要交换的密钥,只有拥有对应私钥的接收方才能解密获取密钥。
基于公钥加密的密钥交换协议的步骤如下(以 RSA 加密算法为例):
① 密钥生成 (Key Generation):
▮▮▮▮⚝ 接收方 Bob 生成 RSA 公钥/私钥对 \((PK_B, SK_B)\)。Bob 公开公钥 \(PK_B\),保密私钥 \(SK_B\)。
② 密钥交换请求 (Key Exchange Request):
▮▮▮▮⚝ 发送方 Alice 生成一个会话密钥 \(K_S\),用于后续的对称加密通信。
③ 密钥加密传输 (Encrypted Key Transmission):
▮▮▮▮⚝ Alice 使用 Bob 的公钥 \(PK_B\) 加密会话密钥 \(K_S\),得到密文 \(C = Encrypt(PK_B, K_S)\)。
▮▮▮▮⚝ Alice 将密文 \(C\) 发送给 Bob。
④ 密钥解密获取 (Decrypted Key Retrieval):
▮▮▮▮⚝ Bob 收到密文 \(C\) 后,使用自己的私钥 \(SK_B\) 解密密文 \(C\),得到会话密钥 \(K_S = Decrypt(SK_B, C)\)。
这样,Alice 和 Bob 就通过公钥加密的方式安全地交换了会话密钥 \(K_S\)。
安全性分析 (Security Analysis):
⚝ 安全性基础 (Security Basis):基于公钥加密的密钥交换协议的安全性依赖于所使用的公钥加密算法的安全性。例如,使用 RSA 加密算法时,安全性基于 大整数分解问题 (Integer Factorization Problem) 的难解性。
⚝ 保密性 (Confidentiality):只有拥有 Bob 私钥 \(SK_B\) 的 Bob 才能解密密文 \(C\) 获取会话密钥 \(K_S\)。即使攻击者截获了密文 \(C\),在计算上也很难解密得到 \(K_S\)。
⚝ 抗中间人攻击 (Resistance to Man-in-the-Middle Attack):如果 Bob 的公钥 \(PK_B\) 是可信的(例如,通过数字证书认证),则可以抵抗中间人攻击。因为只有使用 Bob 的真实公钥加密的密文,才能被 Bob 的私钥解密。
缺点 (Disadvantages):
⚝ 效率较低 (Lower Efficiency):公钥加密算法通常比对称加密算法效率低,因此基于公钥加密的密钥交换协议效率相对较低。
⚝ 密钥协商灵活性较差 (Less Flexible Key Negotiation):基于公钥加密的密钥交换协议通常只能由发送方生成会话密钥,密钥协商的灵活性不如 Diffie-Hellman 密钥交换协议。
应用场景 (Application Scenarios):
⚝ 密钥分发 (Key Distribution):适用于分发会话密钥或对称密钥加密的密钥加密密钥 (KEK)。
⚝ 数字信封 (Digital Envelope):用于安全地发送加密数据和密钥。
7.2.3 密钥派生函数 KDF (Key Derivation Function KDF)
密钥派生函数 (Key Derivation Function, KDF) 是一种从一个或多个秘密值(如主密钥、口令等)派生出一个或多个密钥的函数。KDF 的主要作用是将高熵的输入密钥材料 (Input Keying Material, IKM) 转换为适合特定密码算法使用的密钥。KDF 还可以用于密钥扩展 (Key Expansion),从一个短密钥派生出多个长密钥。
KDF 的主要特点和要求:
① 单向性 (One-wayness):从派生出的密钥反向推导出输入密钥材料在计算上是不可行的。
② 随机性 (Randomness):派生出的密钥应具有良好的随机性,符合密码算法的要求。
③ 确定性 (Determinism):对于相同的输入密钥材料和参数,KDF 必须产生相同的输出密钥。
④ 可配置性 (Configurability):KDF 应提供可配置的参数,如输出密钥长度、盐值 (Salt)、迭代次数 (Iteration Count) 等,以满足不同的安全需求。
常见的密钥派生函数包括:
① 基于哈希函数的 KDF (Hash-based KDF):使用哈希函数作为核心组件构建 KDF。例如,HKDF (HMAC-based Key Derivation Function) 基于 HMAC (Hash-based Message Authentication Code) 构建,具有良好的安全性和效率。HKDF 广泛应用于 TLS/SSL, IPsec 等协议中。
② 基于密码分组的 KDF (Block Cipher-based KDF):使用密码分组算法作为核心组件构建 KDF。例如,PBKDF2 (Password-Based Key Derivation Function 2) 基于 HMAC 和伪随机函数 (PRF) 构建,并使用盐值和迭代次数增强抗暴力破解能力。PBKDF2 主要用于口令哈希和密钥派生。
③ 基于计数器的 KDF (Counter-based KDF):使用计数器和伪随机函数 (PRF) 迭代生成密钥。例如,CTR_DRBG (Counter-mode Deterministic Random Bit Generator) 可以作为 KDF 使用。
KDF 的应用场景:
① 会话密钥派生 (Session Key Derivation):在密钥交换协议中,如 Diffie-Hellman 密钥交换,协商得到的共享秘密通常作为输入密钥材料 (IKM),通过 KDF 派生出会话密钥,用于后续的对称加密通信。
② 口令哈希 (Password Hashing):使用 KDF 对用户口令进行哈希处理,存储哈希值而不是明文口令,提高口令安全性。PBKDF2, bcrypt, scrypt, Argon2 等 KDF 算法常用于口令哈希。
③ 密钥扩展 (Key Expansion):从一个主密钥派生出多个子密钥,用于不同的加密操作或不同的安全域。
④ 密钥更新 (Key Update):定期使用 KDF 从旧密钥派生出新密钥,实现密钥的定期更换。
7.3 公钥基础设施 PKI (Public Key Infrastructure PKI)
公钥基础设施 (Public Key Infrastructure, PKI) 是一套管理数字证书的体系,用于实现公钥的 分发 (Distribution)、验证 (Verification) 和 撤销 (Revocation)。PKI 的核心目标是解决公钥的 信任问题 (Trust Problem),确保用户获取的公钥是真实可信的,而不是伪造或篡改的。PKI 是构建安全可靠的网络环境的重要基础设施,广泛应用于电子商务、电子政务、网络安全等领域。
7.3.1 数字证书 (Digital Certificates)
数字证书 (Digital Certificate) 是一种电子文档,用于证明公钥的 所有者 (Owner) 和 有效性 (Validity)。数字证书类似于现实生活中的身份证,它将用户的身份信息 (如姓名、组织机构等) 与其公钥绑定在一起,并由可信的第三方机构 证书颁发机构 (Certificate Authority, CA) 进行签名认证。
数字证书通常包含以下信息:
① 证书版本 (Version):证书的版本号,标识证书的格式和规范。
② 序列号 (Serial Number):证书的唯一标识符,由 CA 颁发。
③ 签名算法标识 (Signature Algorithm ID):用于对证书进行签名的算法,如 RSA, ECDSA 等。
④ 颁发者名称 (Issuer Name):颁发证书的 CA 的名称。
⑤ 有效期 (Validity Period):证书的有效起始日期和截止日期。
⑥ 主题名称 (Subject Name):证书所有者的名称,可以是个人、组织机构或设备。
⑦ 主题公钥信息 (Subject Public Key Info):证书所有者的公钥和公钥算法信息。
⑧ 颁发者唯一标识符 (Issuer Unique Identifier) (可选):颁发者的唯一标识符。
⑨ 主题唯一标识符 (Subject Unique Identifier) (可选):主题的唯一标识符。
⑩ 扩展项 (Extensions) (可选):证书的扩展信息,如密钥用途、证书策略等。
⑪ 证书签名 (Certificate Signature):CA 使用自己的私钥对证书内容进行签名,保证证书的完整性和不可伪造性。
数字证书的作用 (Functions of Digital Certificates):
① 身份认证 (Identity Authentication):通过验证证书的签名和颁发者,可以确认证书所有者的身份。
② 公钥分发 (Public Key Distribution):证书中包含了证书所有者的公钥,可以安全地分发公钥。
③ 数据加密 (Data Encryption):可以使用证书中的公钥对数据进行加密,保证数据传输的保密性。
④ 数字签名 (Digital Signature):可以使用证书中的公钥验证数字签名的有效性,保证数据的完整性和不可否认性。
证书链 (Certificate Chain):
在 PKI 体系中,证书通常以 证书链 (Certificate Chain) 的形式存在。证书链由多个证书组成,从 根证书 (Root Certificate) 开始,到 用户证书 (User Certificate) 结束。证书链中的每个证书都由其上级证书颁发机构签名。证书链的目的是建立信任传递链,最终将信任锚定到根证书。
验证证书链的过程如下:
① 验证用户证书的签名,签名者是中间 CA 证书。
② 验证中间 CA 证书的签名,签名者是上级 CA 证书。
③ 依次向上验证,直到根证书。
④ 验证根证书是否是可信的根证书。
如果证书链中的所有证书都验证通过,且根证书是可信的,则用户证书被认为是可信的。
7.3.2 证书颁发机构 CA (Certificate Authority CA)
证书颁发机构 (Certificate Authority, CA) 是 PKI 体系中的核心组成部分,是负责 颁发 (Issue)、管理 (Manage) 和 撤销 (Revoke) 数字证书的可信第三方机构。CA 的主要职责是验证证书申请者的身份,并对颁发的证书进行签名,保证证书的真实性和有效性。CA 是 PKI 信任体系的根基,其安全性至关重要。
CA 的主要功能:
① 证书申请处理 (Certificate Request Processing):接收和处理证书申请者的证书申请请求。
② 身份验证 (Identity Verification):验证证书申请者的身份,确保申请者身份的真实性。身份验证方式可以包括人工审核、在线验证、第三方数据源验证等。
③ 证书生成与颁发 (Certificate Generation and Issuance):根据证书申请信息生成数字证书,并使用 CA 的私钥对证书进行签名,颁发给证书申请者。
④ 证书管理 (Certificate Management):管理已颁发的证书,包括证书的存储、更新、备份等。
⑤ 证书撤销管理 (Certificate Revocation Management):处理证书撤销请求,生成和发布证书吊销列表 (CRL) 或提供在线证书状态协议 (OCSP) 服务。
⑥ 密钥管理 (Key Management):管理 CA 自身的密钥对,包括 CA 私钥的生成、保护、备份和恢复等。CA 私钥的安全性是 PKI 体系安全性的关键。
CA 的类型 (Types of CAs):
① 根 CA (Root CA):PKI 信任链的根节点,是自签名的 CA 证书。根 CA 的证书通常预先安装在操作系统或浏览器中,作为信任锚点。
② 中间 CA (Intermediate CA):由根 CA 或其他上级 CA 颁发的证书。中间 CA 负责颁发用户证书或下级 CA 证书,分担根 CA 的证书颁发和管理压力。
③ 策略 CA (Policy CA):根据特定的安全策略和应用场景颁发证书的 CA。
④ 属性 CA (Attribute CA):颁发属性证书 (Attribute Certificate) 的 CA,属性证书用于描述用户的属性信息,而不是身份信息。
CA 的运营模式 (Operational Models of CAs):
① 公共 CA (Public CA):面向公众提供证书颁发服务的商业机构,如 VeriSign, DigiCert, GlobalSign 等。公共 CA 的根证书通常预装在操作系统和浏览器中,具有广泛的信任基础。
② 私有 CA (Private CA):由组织机构内部建立和运营的 CA,用于组织内部的证书管理和应用。私有 CA 的信任范围仅限于组织内部。
③ 桥 CA (Bridge CA):用于连接不同 PKI 域的 CA,实现跨域信任互操作。
7.3.3 证书吊销列表 CRL (Certificate Revocation List CRL)
证书吊销列表 (Certificate Revocation List, CRL) 是由 CA 定期发布的一个列表,列出了所有 已吊销 (Revoked) 但 尚未过期 (Not Expired) 的证书。CRL 是 PKI 体系中重要的证书状态查询机制,用于告知用户哪些证书已经失效,不应再被信任。
CRL 通常包含以下信息:
① CRL 版本号 (CRL Version Number):CRL 的版本号,标识 CRL 的格式和规范。
② 签名算法标识 (Signature Algorithm ID):用于对 CRL 进行签名的算法,与证书签名算法类似。
③ 颁发者名称 (Issuer Name):颁发 CRL 的 CA 的名称。
④ 本次 CRL 颁发时间 (This Update):本次 CRL 的颁发时间。
⑤ 下次 CRL 颁发时间 (Next Update):下次 CRL 的计划颁发时间,建议用户在此时间之前更新 CRL。
⑥ 已吊销证书列表 (Revoked Certificates List):列出所有已吊销证书的信息,每个吊销证书的信息通常包括:
▮▮▮▮⚝ 吊销证书序列号 (Revoked Certificate Serial Number):已吊销证书的序列号。
▮▮▮▮⚝ 吊销日期 (Revocation Date):证书被吊销的日期和时间。
▮▮▮▮⚝ 吊销原因代码 (Revocation Reason Code) (可选):证书被吊销的原因代码,如密钥泄露、证书误发、用户请求等。
⑦ CRL 扩展项 (CRL Extensions) (可选):CRL 的扩展信息。
⑧ CRL 签名 (CRL Signature):CA 使用自己的私钥对 CRL 内容进行签名,保证 CRL 的完整性和不可伪造性。
CRL 的工作原理 (Working Principle of CRL):
① CA 定期生成 CRL (CA Periodically Generates CRL):CA 根据证书吊销情况,定期生成 CRL,并将已吊销的证书信息添加到 CRL 中。
② CA 发布 CRL (CA Publishes CRL):CA 将生成的 CRL 发布到公共可访问的存储库中,如 LDAP 服务器、Web 服务器等。
③ 用户获取 CRL (User Retrieves CRL):用户在验证证书有效性时,需要从 CRL 发布点获取最新的 CRL。
④ 证书状态检查 (Certificate Status Check):用户在 CRL 中查找待验证证书的序列号。如果找到该序列号,则表示该证书已被吊销,不应被信任。
CRL 的缺点 (Disadvantages of CRL):
① 实时性较差 (Poor Real-time Performance):CRL 通常是定期发布的,CRL 的更新频率可能无法满足实时性要求。在 CRL 更新间隔期间,已吊销的证书仍然可能被认为是有效的。
② 带宽消耗 (Bandwidth Consumption):CRL 文件可能很大,下载和处理 CRL 会消耗一定的网络带宽和计算资源。
③ 存储开销 (Storage Overhead):用户需要存储和维护 CRL,增加存储开销。
为了克服 CRL 的缺点,出现了 在线证书状态协议 OCSP (Online Certificate Status Protocol OCSP) 等更实时的证书状态查询机制。OCSP 允许用户向 OCSP 服务器在线查询证书的实时状态,获取更及时、更准确的证书状态信息。
8. chapter 8: 密码协议与应用 (Cryptographic Protocols and Applications)
8.1 安全套接层协议 TLS/SSL (Transport Layer Security TLS/Secure Sockets Layer SSL)
8.1.1 TLS/SSL 协议概述 (Overview of TLS/SSL Protocol)
TLS(Transport Layer Security,传输层安全)和 SSL(Secure Sockets Layer,安全套接层)协议是为网络通信提供安全和数据完整性的重要密码协议。SSL 协议最初由 Netscape 公司开发,后被 IETF(Internet Engineering Task Force,互联网工程任务组)标准化并更名为 TLS。虽然现在 SSL 协议的最新版本已经过时,但由于历史原因,TLS/SSL 常常被一起提及,并且在实际应用中,人们也习惯用 SSL 来泛指这类安全协议。TLS 协议建立在传输层之上,为应用层协议如 HTTP、SMTP、FTP 等提供加密通信通道,是互联网安全通信的基石。
TLS/SSL 协议的主要目标包括:
① 保密性 (Confidentiality):通过加密技术,确保通信内容的机密性,防止数据在传输过程中被未授权的第三方窃取。只有通信双方能够理解传输的数据内容。
② 完整性 (Integrity):使用消息认证码(MAC)或数字签名等技术,确保数据在传输过程中没有被篡改。接收方可以验证数据的完整性,确保数据来源可靠。
③ 身份认证 (Authentication):通过数字证书等机制,验证通信双方的身份,防止中间人攻击(Man-in-the-Middle Attack)。客户端可以验证服务器的身份,在某些情况下,服务器也可以验证客户端的身份。
TLS/SSL 协议的工作流程大致可以分为握手阶段和记录协议阶段。握手阶段用于协商加密算法、交换密钥、验证身份等,为后续的安全通信建立基础。记录协议阶段则负责对应用层数据进行加密、压缩、计算 MAC 等处理,保证数据传输的安全性和完整性。
TLS 协议的版本演进:
⚝ SSL 1.0: 从未公开,存在严重安全漏洞。
⚝ SSL 2.0: 公开发布,但存在多个安全缺陷,已被弃用。
⚝ SSL 3.0: 改进了 SSL 2.0,但仍存在安全漏洞,已被认为是不安全的。
⚝ TLS 1.0: 基于 SSL 3.0,由 IETF 标准化,修复了 SSL 3.0 的一些安全问题,但现在也被认为存在安全风险,建议升级到更新版本。
⚝ TLS 1.1: 对 TLS 1.0 进行了改进,增强了安全性,但应用不如 TLS 1.2 广泛。
⚝ TLS 1.2: 广泛使用的版本,提供了更高的安全性和性能,是目前互联网安全通信的主流协议。
⚝ TLS 1.3: 最新的版本,在性能和安全性方面都进行了重大改进,简化了握手过程,移除了过时的加密算法,是未来的发展方向。
总而言之,TLS/SSL 协议通过结合对称加密、非对称加密、哈希函数、数字证书等多种密码学技术,为互联网通信提供了强大的安全保障,是现代网络安全体系中不可或缺的重要组成部分。
8.1.2 TLS/SSL 握手协议 (TLS/SSL Handshake Protocol)
TLS/SSL 握手协议是 TLS/SSL 协议中最复杂也是最关键的部分。它的主要目的是在客户端和服务器之间安全地协商加密算法套件(Cipher Suite)、交换密钥,并进行身份认证。握手协议的成功完成是后续安全数据传输的前提。
一个典型的 TLS 1.2 握手过程(Full Handshake)大致如下,TLS 1.3 的握手过程有所简化和优化:
① Client Hello (客户端问候):客户端向服务器发送 Client Hello
消息,包含以下信息:
▮▮▮▮⚝ TLS 版本 (TLS Version):客户端支持的最高 TLS 版本。
▮▮▮▮⚝ 随机数 (Client Random):客户端生成的随机数,用于后续密钥派生。
▮▮▮▮⚝ 会话 ID (Session ID):如果客户端希望复用之前的会话,会包含会话 ID。
▮▮▮▮⚝ 密码套件列表 (Cipher Suites List):客户端支持的密码套件列表,按照客户端偏好排序。密码套件定义了握手和数据传输过程中使用的加密算法、密钥交换算法、认证算法、MAC 算法等。例如:TLS_RSA_WITH_AES_128_CBC_SHA
。
▮▮▮▮⚝ 压缩方法列表 (Compression Methods List):客户端支持的压缩算法列表。
▮▮▮▮⚝ 扩展 (Extensions):TLS 扩展,用于协商额外的功能,例如服务器名称指示(SNI)、应用层协议协商(ALPN)等。
② Server Hello (服务器问候):服务器收到 Client Hello
消息后,会回复 Server Hello
消息,包含以下信息:
▮▮▮▮⚝ TLS 版本 (TLS Version):服务器选择的 TLS 版本,通常是客户端请求的版本或者服务器支持的最高版本。
▮▮▮▮⚝ 随机数 (Server Random):服务器生成的随机数,同样用于后续密钥派生。
▮▮▮▮⚝ 会话 ID (Session ID):新的会话 ID 或者复用会话的 ID。
▮▮▮▮⚝ 选择的密码套件 (Cipher Suite):服务器从客户端提供的密码套件列表中选择一个自己支持的密码套件。
▮▮▮▮⚝ 选择的压缩方法 (Compression Method):服务器选择的压缩算法。
▮▮▮▮⚝ 扩展 (Extensions):服务器的 TLS 扩展。
③ Certificate (证书):服务器将自己的数字证书发送给客户端。证书中包含了服务器的公钥、服务器的域名、证书颁发机构(CA)的信息以及证书的有效期等。客户端需要验证服务器证书的有效性,以确认服务器的身份。
④ Server Key Exchange (服务器密钥交换) (可选):取决于选择的密钥交换算法。例如,如果使用 Diffie-Hellman 算法,服务器会在这个消息中发送 Diffie-Hellman 参数。对于 RSA 密钥交换,此消息通常不需要。
⑤ Server Hello Done (服务器问候完成):服务器发送 Server Hello Done
消息,表示服务器的问候消息已经结束。
⑥ Client Key Exchange (客户端密钥交换):客户端根据选择的密钥交换算法,生成预主密钥(Pre-Master Secret)。
▮▮▮▮⚝ RSA 密钥交换: 客户端生成预主密钥,使用服务器证书中的公钥加密后发送给服务器。
▮▮▮▮⚝ Diffie-Hellman 密钥交换: 客户端和服务器之前交换了 Diffie-Hellman 参数,客户端计算共享密钥作为预主密钥,并将必要的 Diffie-Hellman 公开值发送给服务器。
▮▮▮▮⚝ ECDHE (Elliptic Curve Diffie-Hellman Ephemeral) 密钥交换: 类似于 Diffie-Hellman,但使用椭圆曲线 Diffie-Hellman 算法,提供前向安全性(Forward Secrecy)。
⑦ Change Cipher Spec (更改密码规范):客户端发送 Change Cipher Spec
消息,通知服务器后续的通信将使用协商好的密码套件和密钥进行加密。
⑧ Encrypted Handshake Message - Client Finished (加密的握手消息 - 客户端完成):客户端发送 Finished
消息,该消息使用协商好的密钥和算法加密,包含了之前所有握手消息的哈希值。服务器通过解密和验证 Finished
消息,确认握手过程的完整性和密钥的正确性。
⑨ Change Cipher Spec (更改密码规范):服务器发送 Change Cipher Spec
消息,通知客户端后续的通信将使用协商好的密码套件和密钥进行加密。
⑩ Encrypted Handshake Message - Server Finished (加密的握手消息 - 服务器完成):服务器发送 Finished
消息,同样使用协商好的密钥和算法加密,包含了之前所有握手消息的哈希值。客户端通过解密和验证 Finished
消息,进一步确认握手过程的完整性和密钥的正确性。
完成以上握手过程后,TLS/SSL 连接建立完成,客户端和服务器可以使用协商好的密钥和算法进行安全的双向数据传输。
TLS 1.3 握手协议的改进:
TLS 1.3 协议在握手过程上做了显著的改进,主要目标是提高性能和安全性:
⚝ 更快的握手速度 (0-RTT 和 1-RTT):TLS 1.3 减少了握手消息的往返次数(Round-Trip Time, RTT),支持 0-RTT 恢复会话和 1-RTT 完全握手,显著降低了连接建立的延迟。
⚝ 更强的安全性:移除了对不安全和过时的密码算法的支持,例如 SSL 3.0, RC4, SHA-1, CBC 模式的密码等。强制使用前向安全性(Forward Secrecy)的密钥交换算法(例如 ECDHE 和 DHE)。
⚝ 简化握手流程:合并了 Server Key Exchange
和 Server Hello Done
消息,减少了握手消息的数量。
⚝ 加密 Client Hello (Encrypted Client Hello, ECH):正在标准化中的扩展,旨在加密 Client Hello
消息,防止网络中间设备窥探客户端请求的服务器名称等敏感信息,进一步提升隐私保护。
8.1.3 TLS/SSL 记录协议 (TLS/SSL Record Protocol)
TLS/SSL 记录协议位于握手协议之后,负责对应用层数据进行加密、压缩(可选)和完整性保护,然后将处理后的数据发送到网络。记录协议保证了应用层数据在传输过程中的保密性和完整性。
记录协议的处理流程主要包括以下几个步骤:
① 分片 (Fragmentation):应用层数据可能会被分割成更小的块,通常最大不超过 16KB。这是为了更好地管理数据,并适应网络传输的最大传输单元(Maximum Transmission Unit, MTU)。
② 压缩 (Compression) (可选):根据握手阶段协商的压缩算法,对数据进行压缩。然而,由于安全漏洞(例如 CRIME 攻击),TLS 压缩在现代 TLS 版本中通常被禁用。
③ 添加 MAC (Message Authentication Code, 消息认证码):为了保证数据的完整性和认证数据来源,记录协议会计算数据的 MAC 值。MAC 值是使用共享密钥和哈希函数对数据计算得到的,接收方可以使用相同的密钥和哈希函数重新计算 MAC 值,并与接收到的 MAC 值进行比较,以验证数据是否被篡改。对于 AEAD (Authenticated Encryption with Associated Data) 模式的密码套件(例如 GCM),认证和加密是同时进行的,不需要单独计算 MAC。
④ 加密 (Encryption):根据握手阶段协商的加密算法和密钥,对数据进行加密。常用的对称加密算法包括 AES、ChaCha20 等。加密算法的选择取决于握手阶段协商的密码套件。
⑤ 添加 TLS 记录头 (TLS Record Header):在加密后的数据前添加 TLS 记录头。记录头包含了以下信息:
▮▮▮▮⚝ Content Type (内容类型):指示记录中数据的类型,例如 handshake
(握手消息)、application_data
(应用数据)、alert
(警报消息)等。
▮▮▮▮⚝ Version (版本):TLS 协议版本。
▮▮▮▮⚝ Length (长度):加密后数据的长度。
⑥ 发送 (Transmission):将带有 TLS 记录头的加密数据通过网络发送给对方。
接收方收到 TLS 记录后,会进行相反的处理流程:
① 接收数据 (Reception):接收网络数据流。
② 解析 TLS 记录头 (Parse TLS Record Header):解析 TLS 记录头,获取内容类型、版本和长度等信息。
③ 解密 (Decryption):根据协商的加密算法和密钥,对加密数据进行解密。
④ 验证 MAC (MAC Verification):如果使用了 MAC,则计算接收到的数据的 MAC 值,并与记录中包含的 MAC 值进行比较。如果两者不一致,说明数据可能被篡改,连接可能会被终止。对于 AEAD 模式,解密过程会同时验证认证标签。
⑤ 解压缩 (Decompression) (可选):如果使用了压缩,则对解密后的数据进行解压缩。
⑥ 重组分片 (Reassembly):如果数据被分片,则将分片的数据重组成完整的应用层数据。
⑦ 传递给应用层 (Delivery to Application Layer):将解密、验证和重组后的应用层数据传递给上层应用程序。
通过记录协议的处理,TLS/SSL 确保了应用层数据在网络传输过程中的保密性、完整性和认证性,为各种网络应用提供了安全可靠的通信基础。
8.2 安全 Shell 协议 SSH (Secure Shell SSH)
SSH(Secure Shell,安全外壳协议)是一种加密的网络协议,用于在不安全的网络上安全地访问远程计算机。SSH 提供了强大的身份验证和加密功能,可以有效防止诸如中间人攻击、IP 欺骗、DNS 欺骗等网络攻击,广泛应用于远程登录、文件传输、端口转发等场景。
SSH 协议族主要包括三个主要的协议:
⚝ 传输层协议 (SSH-TRANS):提供服务器认证、保密性和完整性。它负责密钥交换、加密算法协商、数据压缩等底层安全功能。
⚝ 用户认证协议 (SSH-USERAUTH):负责客户端用户向服务器进行身份验证。支持多种认证方法,例如密码认证、公钥认证等。
⚝ 连接协议 (SSH-CONNECT):建立在用户认证协议之上,负责在已认证的 SSH 连接上创建多个逻辑通道,用于各种应用,例如 shell 会话、端口转发等。
SSH 工作原理:
SSH 的工作过程可以大致分为以下几个阶段:
① TCP 连接建立: 客户端首先与服务器建立 TCP 连接,通常使用 22 端口。
② 服务器版本协商: 客户端和服务器交换 SSH 协议版本信息,协商双方都支持的协议版本。
③ 密钥交换 (Key Exchange): 客户端和服务器协商密钥交换算法,并进行密钥交换。常用的密钥交换算法包括 Diffie-Hellman 算法、椭圆曲线 Diffie-Hellman 算法等。密钥交换的目的是在客户端和服务器之间安全地协商出一个共享密钥,用于后续的加密通信。
④ 服务器认证 (Server Authentication): 客户端需要验证服务器的身份,防止连接到恶意的伪造服务器。服务器通常会发送其主机密钥(Host Key)给客户端。客户端可以根据本地存储的已知主机密钥或者通过可信的第三方机制(例如 TOFU - Trust On First Use)来验证服务器的身份。首次连接时,SSH 客户端通常会提示用户是否信任服务器的主机密钥,并将主机密钥保存在本地 known_hosts
文件中,以便后续连接时进行验证。
⑤ 加密算法协商: 客户端和服务器协商加密算法、MAC 算法、压缩算法等。协商结果将用于后续的数据加密和完整性保护。
⑥ 用户认证 (User Authentication): 客户端向服务器进行用户身份验证。SSH 支持多种认证方法:
▮▮▮▮⚝ 密码认证 (Password Authentication): 客户端发送用户名和密码给服务器进行验证。虽然简单易用,但密码认证的安全性相对较低,容易受到暴力破解和中间人攻击。
▮▮▮▮⚝ 公钥认证 (Public Key Authentication): 客户端使用私钥对消息进行签名,服务器使用事先配置好的用户的公钥验证签名。公钥认证比密码认证更安全,推荐使用。用户需要先将自己的公钥上传到服务器的 ~/.ssh/authorized_keys
文件中。
▮▮▮▮⚝ GSSAPI 认证 (Generic Security Services Application Program Interface Authentication): 使用 Kerberos 等 GSSAPI 机制进行认证。
▮▮▮▮⚝ 键盘交互认证 (Keyboard-interactive Authentication): 一种交互式的认证方式,服务器可以向客户端发送问题,客户端需要根据问题进行回答。常用于支持多因素认证的场景。
⑦ 连接建立 (Connection Establishment): 用户认证成功后,SSH 连接建立完成。客户端可以向服务器发送请求,例如请求打开 shell 会话、进行端口转发等。
⑧ 会话管理和数据传输: 连接建立后,客户端和服务器之间可以进行安全的双向数据传输。所有传输的数据都会被加密和完整性保护。SSH 支持多种会话类型,例如:
▮▮▮▮⚝ Shell 会话: 用于远程命令行操作。
▮▮▮▮⚝ 端口转发 (Port Forwarding): 允许将本地端口或远程端口转发到 SSH 连接的另一端,实现安全的隧道传输。端口转发包括本地端口转发、远程端口转发和动态端口转发(SOCKS 代理)。
▮▮▮▮⚝ X11 转发 (X11 Forwarding): 允许在本地显示远程服务器上的图形界面应用程序。
▮▮▮▮⚝ 文件传输 (File Transfer): 可以使用 scp
(Secure Copy) 和 sftp
(SSH File Transfer Protocol) 等工具进行安全的文件传输。sftp
是一个基于 SSH 的交互式文件传输协议,提供了比 scp
更丰富的功能。
SSH 的应用场景:
⚝ 远程服务器管理: 系统管理员可以使用 SSH 安全地远程登录到服务器进行管理和维护。
⚝ 安全文件传输: 使用 scp
和 sftp
等工具进行加密的文件传输,保护数据在传输过程中的安全。
⚝ 端口转发和 VPN: SSH 端口转发可以用于创建安全的隧道,实现 VPN 的部分功能,例如绕过防火墙、访问内网资源等。
⚝ 自动化脚本和任务: 可以使用 SSH 在远程服务器上执行自动化脚本和任务,例如备份、部署等。
⚝ Git 和代码托管: Git 等代码托管平台通常使用 SSH 协议进行代码仓库的访问和管理。
总而言之,SSH 协议为网络通信提供了强大的安全保障,是远程管理、安全文件传输和构建安全网络应用的重要工具。
8.3 IP 安全协议 IPsec (IP Security IPsec)
IPsec(IP Security,IP 安全协议)是一套用于保护 IP 网络通信安全的协议族。IPsec 在网络层提供安全服务,为 IP 数据包提供保密性、完整性和身份验证。与 TLS/SSL 和 SSH 等应用层安全协议不同,IPsec 对应用层透明,无需应用程序进行任何修改即可使用 IPsec 提供的安全服务。IPsec 主要用于构建 VPN(Virtual Private Network,虚拟专用网络),实现安全的站点到站点或客户端到站点的网络连接。
IPsec 协议族主要包括以下几个核心协议和组件:
⚝ AH (Authentication Header, 认证头):提供数据完整性、数据来源认证和抗重放攻击保护。AH 协议对整个 IP 数据包(除了可变字段)进行认证,但不提供加密功能。
⚝ ESP (Encapsulating Security Payload, 封装安全载荷):提供数据保密性、数据完整性、数据来源认证和抗重放攻击保护。ESP 协议可以只加密 IP 数据包的载荷部分,也可以加密整个 IP 数据包(在隧道模式下)。
⚝ SA (Security Association, 安全关联):是 IPsec 安全的基础。SA 是通信双方之间对于安全参数和密钥的约定。每个 SA 是单向的,如果需要双向安全通信,则需要建立两个 SA,每个方向一个。SA 由 SPI (Security Parameter Index, 安全参数索引)、目的 IP 地址和安全协议类型(AH 或 ESP)唯一标识。
⚝ IKE (Internet Key Exchange, 互联网密钥交换协议):用于自动协商和管理 IPsec SA。IKE 协议负责密钥交换、身份认证和 SA 的建立、修改和删除。IKE 自身也是一个安全的协议,通常使用 ISAKMP (Internet Security Association and Key Management Protocol, 互联网安全关联和密钥管理协议) 作为框架,并结合 Diffie-Hellman 密钥交换算法和数字证书或预共享密钥进行身份认证。
IPsec 的两种主要模式:
IPsec 支持两种主要的运行模式:传输模式(Transport Mode)和隧道模式(Tunnel Mode)。
⚝ 传输模式 (Transport Mode):在传输模式下,IPsec 只保护 IP 数据包的载荷部分,IP 头部保持不变。传输模式适用于主机到主机之间的安全通信,例如两台服务器之间的直接通信。AH 和 ESP 协议都可以在传输模式下工作。
▮▮▮▮⚝ AH 传输模式: AH 头部被插入到 IP 头部之后,传输层协议头部之前。AH 保护从 IP 头部之后到数据包结束的所有数据,但不加密。
▮▮▮▮⚝ ESP 传输模式: ESP 头部被插入到 IP 头部之后,传输层协议头部之前,ESP 尾部和 ESP 认证数据被添加到数据包的末尾。ESP 可以加密和认证从传输层协议头部到数据包结束的所有数据。
⚝ 隧道模式 (Tunnel Mode):在隧道模式下,IPsec 将整个原始 IP 数据包封装在一个新的 IP 数据包中。原始 IP 数据包成为新 IP 数据包的载荷。隧道模式主要用于构建 VPN,实现网关到网关、网关到主机或主机到网关之间的安全通信。AH 和 ESP 协议都可以在隧道模式下工作。
▮▮▮▮⚝ AH 隧道模式: AH 头部被插入到新的 IP 头部之后,原始 IP 数据包之前。AH 保护从原始 IP 头部之后到数据包结束的所有数据,但不加密。新的 IP 头部用于路由到 IPsec 网关。
▮▮▮▮⚝ ESP 隧道模式: ESP 头部被插入到新的 IP 头部之后,原始 IP 数据包之前,ESP 尾部和 ESP 认证数据被添加到数据包的末尾。ESP 可以加密和认证整个原始 IP 数据包。新的 IP 头部用于路由到 IPsec 网关。
IPsec 的工作流程:
一个典型的 IPsec 通信过程包括以下步骤:
① IPsec 策略检查: 发送方主机或网关检查 IPsec 策略数据库,判断是否需要对出站 IP 数据包应用 IPsec 安全保护。策略可以基于源地址、目的地址、协议类型、端口号等进行配置。
② IKE 协商 (IKE Negotiation): 如果需要应用 IPsec 保护,并且没有现有的 SA 可用,则发起 IKE 协商过程。IKE 协商分为两个阶段:
▮▮▮▮⚝ IKE Phase 1 (阶段 1):建立一个安全的 IKE SA,用于保护后续的 IKE Phase 2 协商过程。Phase 1 主要协商 IKE 安全参数,例如加密算法、哈希算法、认证方法、Diffie-Hellman 群组等,并进行身份认证(例如使用预共享密钥或数字证书)。
▮▮▮▮⚝ IKE Phase 2 (阶段 2):使用 Phase 1 建立的 IKE SA,协商 IPsec SA 的参数,例如安全协议类型(AH 或 ESP)、加密算法、认证算法、密钥、SPI 等。Phase 2 协商的结果是建立一个或多个 IPsec SA。
③ 数据包处理 (Packet Processing): 一旦 IPsec SA 建立完成,发送方主机或网关根据 SA 的参数对出站 IP 数据包进行处理。
▮▮▮▮⚝ AH 处理: 如果使用 AH 协议,则计算数据包的认证哈希值,并将 AH 头部添加到数据包中。
▮▮▮▮⚝ ESP 处理: 如果使用 ESP 协议,则对数据包进行加密和认证,并将 ESP 头部、ESP 尾部和 ESP 认证数据添加到数据包中。
④ 数据传输 (Data Transmission): 发送方将处理后的 IP 数据包发送到网络。
⑤ IPsec 处理 (IPsec Processing): 接收方主机或网关接收到 IP 数据包后,根据 IP 数据包中的 SPI 和目的 IP 地址查找对应的 IPsec SA。
⑥ 安全检查 (Security Check): 接收方根据 SA 的参数对接收到的 IP 数据包进行安全检查。
▮▮▮▮⚝ AH 验证: 如果使用 AH 协议,则验证数据包的认证哈希值,确保数据完整性和来源认证。
▮▮▮▮⚝ ESP 验证和解密: 如果使用 ESP 协议,则验证数据包的认证标签,并对加密的数据包进行解密。
⑦ 数据包传递 (Packet Delivery): 如果安全检查通过,则将解密后的原始 IP 数据包传递给上层协议栈或应用程序。
IPsec 的应用场景:
⚝ VPN (Virtual Private Network, 虚拟专用网络):IPsec 是构建 VPN 的主要技术之一。通过 IPsec VPN,可以实现安全的站点到站点连接(例如连接公司总部和分支机构)或客户端到站点连接(例如远程员工安全访问公司内网)。
⚝ 安全路由: 路由器可以使用 IPsec 协议保护路由协议的通信,例如 BGP (Border Gateway Protocol, 边界网关协议) 的安全。
⚝ 保护敏感网络流量: 可以使用 IPsec 保护对安全性要求较高的网络流量,例如金融交易数据、医疗数据等。
⚝ 移动安全: 移动设备可以使用 IPsec VPN 安全地连接到企业网络或互联网。
总而言之,IPsec 协议族为 IP 网络通信提供了强大的安全保障,是构建安全网络基础设施的关键技术。
8.4 电子邮件安全协议 S/MIME, PGP (Secure/Multipurpose Internet Mail Extensions S/MIME, Pretty Good Privacy PGP)
S/MIME (Secure/Multipurpose Internet Mail Extensions, 安全多用途互联网邮件扩展) 和 PGP (Pretty Good Privacy, 优良保密协议) 是两种主要的电子邮件安全协议,用于提供电子邮件的保密性、完整性、身份验证和不可否认性。它们都使用密码学技术来保护电子邮件通信的安全。
S/MIME (Secure/Multipurpose Internet Mail Extensions):
S/MIME 是一种基于公钥密码体制的电子邮件安全协议,被广泛支持和集成到各种电子邮件客户端软件中。S/MIME 标准由 IETF 定义,并基于 X.509 数字证书体系。
S/MIME 主要提供以下安全功能:
⚝ 加密 (Encryption):使用接收方的公钥加密邮件内容,保证邮件的机密性。只有拥有对应私钥的接收方才能解密邮件。S/MIME 支持对称加密算法(例如 AES)和非对称加密算法(例如 RSA)。
⚝ 数字签名 (Digital Signature):使用发送方的私钥对邮件进行签名,保证邮件的完整性和发送方身份的不可否认性。接收方可以使用发送方的公钥验证签名,确认邮件没有被篡改,并且确实来自声明的发送方。S/MIME 支持多种哈希算法(例如 SHA-256)和数字签名算法(例如 RSA, ECDSA)。
⚝ 身份验证 (Authentication):通过数字证书验证发送方和接收方的身份。S/MIME 依赖于 X.509 数字证书体系,证书由可信的证书颁发机构(CA)签发。
⚝ 不可否认性 (Non-repudiation):由于数字签名与发送方的私钥绑定,发送方无法否认自己发送过邮件。
S/MIME 的工作流程:
⚝ 邮件加密:
1. 发送方获取接收方的 X.509 数字证书,证书中包含接收方的公钥。
2. 发送方生成一个随机的对称密钥(会话密钥)。
3. 发送方使用对称密钥加密邮件内容。
4. 发送方使用接收方的公钥加密对称密钥。
5. 发送方将加密后的邮件内容和加密后的对称密钥一起发送给接收方。
6. 接收方收到邮件后,使用自己的私钥解密加密后的对称密钥,得到对称密钥。
7. 接收方使用对称密钥解密加密后的邮件内容,得到原始邮件。
⚝ 邮件签名:
1. 发送方使用哈希函数计算邮件内容的哈希值(消息摘要)。
2. 发送方使用自己的私钥对哈希值进行签名,生成数字签名。
3. 发送方将原始邮件和数字签名一起发送给接收方。
4. 接收方收到邮件后,使用发送方的公钥验证数字签名。
5. 接收方使用相同的哈希函数计算邮件内容的哈希值。
6. 接收方比较解密后的签名与计算出的哈希值是否一致。如果一致,则签名验证成功,邮件完整性得到保证,发送方身份得到验证。
PGP (Pretty Good Privacy):
PGP 也是一种广泛使用的电子邮件安全协议,由 Phil Zimmermann 开发。PGP 协议族包括 PGP 和 GnuPG (GNU Privacy Guard, GPG),GnuPG 是 PGP 的开源替代品,遵循 OpenPGP 标准。PGP 提供了与 S/MIME 类似的安全功能,包括加密、数字签名、身份验证和不可否认性。
PGP 的特点和与 S/MIME 的区别:
⚝ 信任模型: PGP 使用“信任网络”(Web of Trust)模型,而 S/MIME 使用基于 CA 的证书体系。在 PGP 的信任网络中,用户可以互相签名对方的公钥,形成信任链。用户需要自己判断信任链的可靠性。S/MIME 则依赖于中心化的 CA 机构,用户信任 CA 机构签发的证书。
⚝ 密钥管理: PGP 密钥管理相对灵活,用户可以自行生成和管理密钥对,并通过密钥服务器分发公钥。S/MIME 密钥管理通常与 X.509 证书体系绑定,证书的获取和管理可能需要通过商业 CA 机构。
⚝ 标准和兼容性: S/MIME 是 IETF 标准,被广泛支持和集成到各种商业电子邮件客户端中。OpenPGP 是一个开放标准,GnuPG 是其主要的实现,也被广泛使用,但商业支持和集成程度可能不如 S/MIME。
⚝ 加密算法: S/MIME 和 PGP 都支持多种加密算法和签名算法,但默认和推荐的算法可能有所不同。
PGP 的工作流程:
PGP 的加密和签名流程与 S/MIME 类似,但细节上有所不同。PGP 也使用对称加密和非对称加密相结合的方式进行邮件加密,使用数字签名技术进行邮件签名。
⚝ 邮件加密: 类似于 S/MIME,使用接收方的公钥加密对称密钥,然后使用对称密钥加密邮件内容。
⚝ 邮件签名: 类似于 S/MIME,使用发送方的私钥对邮件内容的哈希值进行签名。
S/MIME vs PGP 的选择:
S/MIME 和 PGP 都是成熟可靠的电子邮件安全协议,选择哪个协议取决于具体的需求和应用场景:
⚝ 企业环境: S/MIME 由于其基于 X.509 证书体系,更易于在企业环境中部署和管理,与企业现有的 PKI (Public Key Infrastructure, 公钥基础设施) 系统可以更好地集成。商业电子邮件客户端通常对 S/MIME 提供更好的支持。
⚝ 个人用户和开源社区: PGP/GnuPG 由于其开放性、灵活性和信任网络模型,在个人用户和开源社区中更受欢迎。GnuPG 是开源软件,可以自由使用和分发。
⚝ 兼容性: S/MIME 的兼容性更好,特别是在商业电子邮件客户端中。PGP/GnuPG 的兼容性也很好,但可能需要安装额外的插件或软件。
⚝ 易用性: S/MIME 的证书管理和密钥管理可能相对复杂,但对于用户来说,使用过程可能更简单,因为很多电子邮件客户端已经内置了 S/MIME 支持。PGP/GnuPG 的密钥管理和使用可能需要一定的技术知识。
总而言之,S/MIME 和 PGP 都为电子邮件通信提供了重要的安全保障,用户可以根据自己的需求和偏好选择合适的协议。在很多情况下,两者可以互补使用,例如在需要与企业用户安全通信时使用 S/MIME,在与个人用户或开源社区用户通信时使用 PGP。
8.5 区块链与密码学 (Blockchain and Cryptography)
区块链技术的核心基石之一就是密码学。区块链的安全性、去中心化特性以及各种功能的实现都离不开密码学的支撑。密码学在区块链中扮演着至关重要的角色,主要应用在数据加密、身份认证、交易验证、共识机制等方面。
8.5.1 区块链中的哈希函数应用 (Hash Function Applications in Blockchain)
哈希函数在区块链中有着广泛而核心的应用,是构建区块链数据结构和保证数据完整性的关键技术。
① 数据完整性 (Data Integrity):区块链使用哈希函数来保证数据的完整性。每个区块都包含前一个区块的哈希值(Prev Hash),形成一个链式结构。任何对区块数据的篡改都会导致该区块的哈希值发生变化,进而影响后续区块的哈希值,最终破坏整个区块链的完整性。这种链式结构和哈希函数的特性使得区块链数据具有极高的防篡改性。
② 区块哈希 (Block Hash):每个区块都有一个唯一的哈希值(Block Hash),作为区块的数字指纹。区块哈希是通过对区块头(Block Header)中的信息(包括前一个区块哈希、时间戳、Merkle 根、难度目标、Nonce 等)进行哈希运算得到的。区块哈希用于唯一标识一个区块,并被后续区块引用。
③ Merkle 树 (Merkle Tree):区块链使用 Merkle 树来高效地验证区块中交易数据的完整性。Merkle 树是一种树状数据结构,叶子节点是交易数据的哈希值,非叶子节点是其子节点哈希值的哈希值,根节点称为 Merkle 根(Merkle Root)。Merkle 根被包含在区块头中。使用 Merkle 树可以快速验证某个交易是否包含在区块中,而无需下载整个区块数据。只需要提供 Merkle 路径(从交易哈希到 Merkle 根的哈希值路径)即可进行验证。
④ 工作量证明 (Proof-of-Work, PoW):在一些区块链(例如比特币)中,工作量证明共识机制使用哈希函数来寻找满足特定条件的哈希值。矿工需要不断尝试不同的 Nonce 值,计算区块头的哈希值,直到找到一个小于或等于目标值(Target)的哈希值。这个寻找过程需要大量的计算工作,因此称为工作量证明。找到满足条件的哈希值的矿工有权将新的区块添加到区块链中,并获得奖励。
⑤ 地址生成 (Address Generation):在一些区块链中,用户的地址(例如比特币地址)是通过对公钥进行哈希运算得到的。例如,在比特币中,常用的地址生成过程包括:
▮▮▮▮⚝ 生成 ECDSA 公钥。
▮▮▮▮⚝ 对公钥进行 SHA-256 哈希运算。
▮▮▮▮⚝ 对 SHA-256 哈希结果进行 RIPEMD-160 哈希运算。
▮▮▮▮⚝ 对 RIPEMD-160 哈希结果进行 Base58Check 编码,得到比特币地址。
⑥ 密码学承诺 (Cryptographic Commitment):哈希函数可以用于实现密码学承诺方案。承诺方案允许一方(承诺者)向另一方(验证者)承诺一个值,但不透露该值的内容。在稍后的时间,承诺者可以打开承诺,向验证者证明自己确实承诺了该值。哈希函数的单向性使得承诺方案具有约束性和隐藏性。
常用的哈希算法在区块链中包括 SHA-256, SHA-3, RIPEMD-160, Keccak-256 等。选择哈希算法需要考虑安全性、性能和标准性等因素。
8.5.2 区块链中的数字签名应用 (Digital Signature Applications in Blockchain)
数字签名在区块链中也扮演着至关重要的角色,主要用于交易的身份验证、交易的不可否认性以及智能合约的安全性。
① 交易签名 (Transaction Signature):在区块链中,每一笔交易都需要发送方使用自己的私钥进行数字签名。数字签名证明了交易的来源是合法的,并且交易内容在传输过程中没有被篡改。只有拥有对应私钥的用户才能发起交易,保证了账户的安全性。交易签名通常使用 ECDSA (Elliptic Curve Digital Signature Algorithm, 椭圆曲线数字签名算法) 等算法。
② 交易验证 (Transaction Verification):区块链网络中的节点需要验证每一笔交易的数字签名是否有效。验证过程使用发送方的公钥对签名进行验证。如果签名验证成功,则说明交易是合法的,可以被添加到区块链中。交易验证保证了区块链交易的有效性和安全性。
③ 身份认证 (Authentication):数字签名可以用于区块链中的身份认证。用户可以使用自己的私钥对身份信息进行签名,向区块链网络证明自己的身份。例如,在一些去中心化身份认证系统中,用户可以使用数字签名来控制自己的数字身份。
④ 智能合约签名 (Smart Contract Signature):在一些区块链平台(例如以太坊)中,智能合约的部署和调用也可能需要数字签名。合约部署者需要使用自己的私钥对合约代码进行签名,证明合约的来源。用户在调用智能合约时,也可能需要使用数字签名来授权交易。
⑤ 共识机制中的应用 (Applications in Consensus Mechanisms):在一些共识机制中,数字签名也发挥着重要作用。例如,在权益证明 (Proof-of-Stake, PoS) 共识机制中,验证者可能需要使用数字签名来对区块进行签名,证明自己参与了区块的验证过程。在拜占庭容错 (Byzantine Fault Tolerance, BFT) 共识机制中,节点之间需要使用数字签名来对消息进行签名和验证,保证消息的可靠性和不可否认性。
⑥ 多重签名 (Multi-signature):多重签名技术允许多个私钥共同控制一个账户。发起交易需要多个私钥的签名才能生效。多重签名提高了账户的安全性,常用于需要多人共同管理的场景,例如企业级钱包、机构账户等。多重签名可以使用数字签名技术来实现。
常用的数字签名算法在区块链中包括 ECDSA, EdDSA (Edwards-curve Digital Signature Algorithm, Edwards 曲线数字签名算法), Schnorr 签名等。选择数字签名算法需要考虑安全性、性能、密钥长度和标准性等因素。
总而言之,密码学,特别是哈希函数和数字签名,是区块链技术的核心支撑。它们共同保证了区块链的安全性、去中心化特性和各种功能的实现,使得区块链成为一种安全、可信、透明的分布式账本技术。
9. chapter 9: 高级密码学专题 (Advanced Topics in Cryptography)
9.1 零知识证明 (Zero-Knowledge Proofs)
零知识证明 (Zero-Knowledge Proofs, ZKP) 是一种密码学协议,它允许一方(证明者)向另一方(验证者)证明某个陈述是真实的,而无需透露除该陈述的真实性之外的任何信息。换句话说,验证者确信证明者知道某个秘密,但对秘密本身一无所知。零知识证明在身份验证、安全交易、以及需要保护隐私的场景中具有广泛的应用。
零知识证明的核心特性包括:
① 完整性 (Completeness):如果陈述是真实的,诚实的证明者能够说服诚实的验证者相信该陈述。
② 可靠性 (Soundness):如果陈述是虚假的,那么即使是恶意的证明者也无法欺骗诚实的验证者相信该陈述。
③ 零知识性 (Zero-Knowledge):验证者在验证过程中,除了知道陈述是真以外,无法获得任何额外的信息。
一个经典的零知识证明例子是“阿里巴巴的洞穴”:
假设阿里巴巴想向验证者证明他知道打开一个洞穴秘密之门的咒语,这个洞穴有两个入口,中间由一条路连接。验证者在远处,只能看到洞穴的两个入口。
证明过程如下:
- 验证者在洞外喊:“阿里巴巴,从左边的入口进去!”
- 阿里巴巴进入左边的入口,并使用咒语打开秘密之门(如果他知道咒语)。
- 验证者稍后喊:“阿里巴巴,从右边的入口出来!”
- 如果阿里巴巴真的知道咒语,他可以从右边的入口出来(无论他从哪个入口进入,因为他可以穿过秘密之门)。如果验证者看到阿里巴巴从右边的入口出来,他就相信阿里巴巴知道咒语,但验证者并不知道咒语本身。
更正式的零知识证明通常涉及以下步骤和概念:
⚝ 交互式与非交互式证明 (Interactive vs. Non-interactive Proofs):
▮▮▮▮ⓐ 交互式零知识证明 (Interactive Zero-Knowledge Proofs):证明者和验证者之间需要进行多轮交互,如上述“阿里巴巴的洞穴”例子。
▮▮▮▮ⓑ 非交互式零知识证明 (Non-interactive Zero-Knowledge Proofs, NIZK):证明者生成一个证明,验证者可以独立验证,无需与证明者进一步交互。这更适用于实际应用,例如数字签名。
⚝ 承诺方案 (Commitment Scheme):证明者先对某个值进行承诺,但不立即揭示该值,以保证在证明过程中不会改变值。
⚝ 挑战-响应协议 (Challenge-Response Protocol):验证者向证明者提出挑战,证明者根据挑战给出相应的响应。通过多次挑战-响应,验证者可以增加对证明者诚实性的信心。
常见的零知识证明协议包括:
⚝ Fiat-Shamir 启发式方法 (Fiat-Shamir Heuristic):一种将交互式证明转换为非交互式证明的常用技术,通过哈希函数模拟验证者的随机挑战。
⚝ zk-SNARKs (Zero-Knowledge Succinct Non-Interactive Argument of Knowledge):简洁的非交互式知识零知识证明,具有证明尺寸小、验证速度快的特点,常用于区块链和隐私计算领域。
⚝ zk-STARKs (Zero-Knowledge Scalable Transparent Argument of Knowledge):可扩展的透明非交互式知识零知识证明,与 zk-SNARKs 相比,zk-STARKs 不需要可信设置,但证明尺寸通常较大。
零知识证明的应用领域:
⚝ 身份验证 (Authentication):在不泄露密码的情况下验证用户身份。
⚝ 隐私保护的交易 (Privacy-Preserving Transactions):例如,在区块链中实现匿名交易。
⚝ 安全多方计算 (Secure Multi-Party Computation):验证计算结果的正确性,同时保护输入数据的隐私。
⚝ 合规性证明 (Compliance Proofs):在不泄露敏感数据的情况下,证明系统或操作符合特定的合规性要求。
零知识证明是密码学中一个非常活跃的研究领域,不断涌现出新的协议和应用,为构建更安全、更隐私的系统提供了强大的工具。
9.2 同态加密 (Homomorphic Encryption)
同态加密 (Homomorphic Encryption, HE) 是一种特殊的加密形式,它允许对密文进行特定的代数运算,运算结果解密后与对明文进行相同运算的结果一致。换句话说,可以在不解密数据的情况下对加密数据进行计算。同态加密是实现隐私计算和云计算安全的关键技术之一。
同态加密的核心特性:
① 同态性 (Homomorphism):加密方案支持对密文进行某种或某些运算,使得运算后的密文解密结果等于对原始明文进行相同运算的结果。
② 安全性 (Security):同态加密方案必须是语义安全的,即从密文无法有效获取明文信息。
根据支持的运算类型,同态加密可以分为:
⚝ 部分同态加密 (Partially Homomorphic Encryption, PHE):仅支持一种运算(加法或乘法)。
▮▮▮▮ⓐ 加法同态加密 (Additive Homomorphic Encryption):支持密文加法运算。例如,Paillier 密码系统。
▮▮▮▮ⓑ 乘法同态加密 (Multiplicative Homomorphic Encryption):支持密文乘法运算。例如,RSA 密码系统、ElGamal 密码系统。
⚝ 类同态加密 (Somewhat Homomorphic Encryption, SHE):支持有限次数的加法和乘法运算。例如,BFV 密码系统、BGV 密码系统。
⚝ 全同态加密 (Fully Homomorphic Encryption, FHE):支持任意次数的加法和乘法运算,即可以对密文进行任意计算。例如,BGLL 密码系统、CKKS 密码系统。全同态加密是同态加密的最高目标,也是密码学领域的一个重大突破。
同态加密的原理简述 (以加法同态的 Paillier 密码系统为例):
Paillier 密码系统是一种加法同态公钥密码系统。其加密和同态运算过程大致如下:
- 密钥生成:生成公钥 \( pk \) 和私钥 \( sk \)。
- 加密:明文 \( m \) 加密为密文 \( c = Enc(pk, m) \)。
- 同态加法:对于两个密文 \( c_1 = Enc(pk, m_1) \) 和 \( c_2 = Enc(pk, m_2) \),它们的同态加法运算结果为 \( c' = c_1 \otimes c_2 \),解密后得到 \( m_1 + m_2 \),即 \( Dec(sk, c') = m_1 + m_2 \)。
同态加密的应用领域:
⚝ 安全云计算 (Secure Cloud Computing):用户可以将加密数据上传到云端,云服务提供商可以在不解密数据的情况下进行计算,并将加密结果返回给用户。
⚝ 隐私保护的数据分析 (Privacy-Preserving Data Analysis):在保护数据隐私的前提下,进行数据挖掘、机器学习等分析任务。
⚝ 安全多方计算 (Secure Multi-Party Computation):多个参与方可以在不泄露各自私有数据的情况下,共同完成计算任务。
⚝ 电子投票 (Electronic Voting):实现投票过程的隐私性和可验证性。
⚝ 金融领域的隐私计算 (Privacy-Preserving Computation in Finance):例如,在反洗钱、风险评估等场景中保护用户隐私。
同态加密技术仍在快速发展中,全同态加密的性能和效率仍然是研究的重点。随着技术的进步,同态加密将在保护数据隐私和安全方面发挥越来越重要的作用。
9.3 多方安全计算 MPC (Secure Multi-Party Computation MPC)
多方安全计算 (Secure Multi-Party Computation, MPC) 是一门密码学分支,它研究如何在多个参与者之间安全地进行联合计算,每个参与者拥有私有输入数据,但希望共同计算一个预定的函数,而无需向其他参与者泄露自己的输入数据,除非是函数计算结果本身所必须泄露的信息。MPC 旨在解决分布式计算环境下的隐私保护问题。
多方安全计算的核心目标:
① 隐私性 (Privacy):每个参与者的输入数据对其他参与者保密。
② 正确性 (Correctness):计算结果必须是正确的,即与在中心化可信第三方计算的结果一致。
③ 独立性 (Independence):计算过程不依赖于可信第三方。
MPC 的基本模型:
假设有 \( n \) 个参与者 \( P_1, P_2, ..., P_n \),每个参与者 \( P_i \) 拥有私有输入 \( x_i \)。他们希望共同计算一个函数 \( f(x_1, x_2, ..., x_n) = y \),其中 \( y \) 是计算结果。MPC 协议的目标是让所有参与者都得到 \( y \),同时保证除了 \( y \) 之外,任何参与者都无法获得其他参与者的输入信息。
MPC 的实现方法和技术:
⚝ 秘密共享 (Secret Sharing):将每个参与者的私有输入分成多个份额,分发给不同的参与者。只有当足够数量的份额汇集在一起时,才能恢复出原始秘密。常见的秘密共享方案包括 Shamir 秘密共享、加法秘密共享等。
⚝ 混淆电路 (Garbled Circuits):将要计算的函数表示为一个布尔电路,然后对电路进行加密混淆,使得参与者可以在混淆电路中进行计算,得到结果,但无法了解电路的具体结构和中间值。姚氏混淆电路 (Yao's Garbled Circuits) 是最早也是最著名的混淆电路协议。
⚝ 同态加密 (Homomorphic Encryption):利用同态加密的性质,可以在加密数据上进行计算,从而实现 MPC。例如,可以使用加法同态加密实现多方求和计算。
⚝ 不经意传输 (Oblivious Transfer, OT):一种两方协议,发送方拥有多个秘密,接收方希望获得其中一个秘密,但发送方不知道接收方选择了哪个秘密,接收方也不知道自己没有选择的秘密。不经意传输是构建更复杂 MPC 协议的重要基础模块。
MPC 的应用领域:
⚝ 隐私保护的数据挖掘与机器学习 (Privacy-Preserving Data Mining and Machine Learning):在多个数据拥有者之间进行联合数据分析和模型训练,保护各方的数据隐私。
⚝ 安全电子投票 (Secure Electronic Voting):实现投票过程的隐私性、匿名性和可验证性。
⚝ 秘密拍卖 (Secure Auctions):在拍卖过程中保护竞标者的出价隐私。
⚝ 分布式数据库安全查询 (Secure Querying of Distributed Databases):在多个数据库之间进行联合查询,保护各数据库的敏感信息。
⚝ 金融领域的安全计算 (Secure Computation in Finance):例如,联合风险评估、反洗钱等。
MPC 是一个非常活跃的研究领域,各种新的协议和技术不断涌现,旨在提高 MPC 的效率、安全性和实用性。随着对数据隐私保护需求的日益增长,MPC 技术将在未来发挥越来越重要的作用。
9.4 属性基加密 ABE (Attribute-Based Encryption ABE)
属性基加密 (Attribute-Based Encryption, ABE) 是一种公钥密码学的高级形式,它允许用户根据属性 (attributes) 而不是身份 (identities) 来加密和解密数据。在传统的公钥密码学中,加密通常是针对特定的接收者公钥进行的,只有拥有对应私钥的接收者才能解密。而在 ABE 中,密文和密钥都与一组属性相关联,只有当用户的属性集合与密文的属性策略相匹配时,用户才能解密密文。ABE 提供了更细粒度的访问控制和更灵活的数据共享机制。
属性基加密的两种主要类型:
⚝ 密钥策略属性基加密 KP-ABE (Key-Policy Attribute-Based Encryption):用户的私钥与一组属性相关联,密文与一个访问策略 (access policy) 相关联。用户只有当其属性集合满足密文的访问策略时才能解密。KP-ABE 更适合于发送者定义访问策略的场景。
⚝ 密文策略属性基加密 CP-ABE (Ciphertext-Policy Attribute-Based Encryption):用户的私钥与一个访问策略相关联,密文与一组属性相关联。用户只有当密文的属性集合满足其私钥的访问策略时才能解密。CP-ABE 更适合于数据拥有者定义访问策略的场景。
ABE 的核心概念:
① 属性 (Attributes):描述用户或数据的特征,例如“学生”、“教师”、“财务部门”、“级别=高级”等。属性可以是字符串或更复杂的数据结构。
② 属性集合 (Attribute Set):用户的属性集合,例如,一个用户的属性集合可能是 {“学生”, “计算机科学专业”, “本科三年级”}。
③ 访问策略 (Access Policy):定义了解密密文所需的属性条件。访问策略通常用布尔表达式表示,例如 “(“财务部门” AND “级别=高级”) OR “经理””。
④ 权威机构 (Authority):负责管理属性和密钥的机构。在 ABE 系统中,可能有一个或多个权威机构负责颁发属性密钥。
ABE 的工作流程 (以 CP-ABE 为例):
- 系统建立 (Setup):权威机构生成系统公钥 \( PK \) 和主密钥 \( MK \)。
- 密钥生成 (Key Generation):对于用户属性集合 \( S \),权威机构使用主密钥 \( MK \) 生成用户的私钥 \( SK_S \)。
- 加密 (Encryption):加密者根据访问策略 \( P \) 和系统公钥 \( PK \) 加密明文 \( M \),生成密文 \( CT_P \)。
- 解密 (Decryption):如果用户的属性集合 \( S \) 满足密文的访问策略 \( P \),则用户可以使用私钥 \( SK_S \) 和密文 \( CT_P \) 解密得到明文 \( M \)。
ABE 的应用领域:
⚝ 云计算访问控制 (Cloud Computing Access Control):在云环境中实现细粒度的数据访问控制,只有满足特定属性条件的用户才能访问数据。
⚝ 物联网安全 (Internet of Things Security):在物联网设备之间实现安全的、基于属性的数据共享和访问控制。
⚝ 在线社交网络 (Online Social Networks):控制用户在社交网络上发布的内容的访问权限,例如,只有特定群组的用户才能查看某些帖子。
⚝ 电子健康记录 (Electronic Health Records):保护患者的电子健康记录的隐私,只有具有相应属性的医生或研究人员才能访问。
⚝ 军事和政府部门 (Military and Government Sectors):实现机密信息的安全共享和访问控制。
ABE 是一种非常灵活和强大的访问控制技术,可以满足各种复杂场景下的数据安全需求。ABE 的研究和应用正在不断深入,成为密码学领域的热点方向之一。
9.5 后量子密码学 (Post-Quantum Cryptography)
后量子密码学 (Post-Quantum Cryptography, PQC),也称为抗量子密码学 (Quantum-resistant Cryptography) 或量子安全密码学 (Quantum-safe Cryptography),是指研究和开发能够抵抗量子计算机攻击的密码算法。当前广泛使用的公钥密码算法,如 RSA、ECC 和 DH,在量子计算机面前将不再安全。后量子密码学的目标是寻找新的密码算法,能够在经典计算机上高效运行,同时能够抵抗未来量子计算机的攻击。
9.5.1 量子计算与密码学的挑战 (Quantum Computing and Cryptographic Challenges)
量子计算 (Quantum Computing) 是一种基于量子力学原理的新型计算模式。与经典计算机使用比特 (bits) 表示 0 或 1 不同,量子计算机使用量子比特 (qubits) 表示 0 和 1 的叠加态,利用量子叠加和量子纠缠等特性,量子计算机在解决某些特定类型的计算问题时,具有远超经典计算机的潜力。
量子计算机对现有密码体系的威胁主要来自于 Shor 算法和 Grover 算法:
① Shor 算法 (Shor's Algorithm):由 Peter Shor 于 1994 年提出的量子算法,可以在多项式时间内分解大整数和求解离散对数问题。而 RSA、Diffie-Hellman 和 ECC 等公钥密码算法的安全性正是基于大整数分解和离散对数问题的计算困难性。一旦量子计算机足够强大,Shor 算法将能够轻易破解这些密码算法。
② Grover 算法 (Grover's Algorithm):由 Lov Grover 于 1996 年提出的量子算法,可以加速无结构数据的搜索过程。对于对称密码算法(如 AES)和哈希函数,Grover 算法可以将暴力破解的复杂度从 \( O(2^n) \) 降低到 \( O(2^{n/2}) \)。虽然 Grover 算法不能完全破解对称密码,但它降低了密钥长度的要求,意味着需要使用更长的密钥才能达到相同的安全级别。
量子计算对密码学的挑战总结:
⚝ 公钥密码体系的瓦解:Shor 算法威胁了当前广泛使用的公钥密码体系,包括密钥交换、数字签名和公钥加密。
⚝ 对称密码和哈希函数的安全性降低:Grover 算法降低了对称密码和哈希函数的有效密钥长度,需要增加密钥长度以应对量子攻击。
⚝ 密码迁移的紧迫性:虽然实用的通用量子计算机尚未出现,但密码系统的部署和更新周期较长,需要提前开始研究和部署抗量子密码算法,以应对未来的量子计算威胁。
9.5.2 抗量子密码算法 (Quantum-resistant Cryptographic Algorithms)
为了应对量子计算的威胁,密码学界正在积极研究和开发抗量子密码算法。美国国家标准与技术研究院 (NIST) 自 2016 年启动了后量子密码标准化项目,旨在征集、评估和标准化下一代抗量子密码算法。目前,NIST 已经进入标准化进程的最后阶段,并选定了几种主要的抗量子密码算法。
主要的抗量子密码算法方向包括:
9.5.2.1 格密码 (Lattice-based Cryptography)
格密码 (Lattice-based Cryptography) 是一类基于格 (lattice) 上数学难题的密码算法。格是一种离散的、周期性的点集。格密码的安全性主要基于格上的最短向量问题 (Shortest Vector Problem, SVP) 和最近向量问题 (Closest Vector Problem, CVP) 等数学难题,这些问题被认为是经典计算机和量子计算机都难以有效解决的。
格密码的优点:
⚝ 抗量子性:目前没有已知的量子算法能够有效解决格上的 SVP 和 CVP 问题。
⚝ 高效性:格密码算法通常具有较高的运算效率,可以实现快速的加密、解密和签名操作。
⚝ 多功能性:格密码可以用于构建各种密码学原语,包括公钥加密、密钥交换、数字签名、同态加密、零知识证明等。
⚝ 数学结构良好:格密码的数学结构相对简单,易于分析和实现。
常见的格密码算法包括:
⚝ NTRU:一种基于环上学习 (Ring-LWE) 问题的公钥加密和密钥交换算法。
⚝ CRYSTALS-Kyber:NIST 标准化项目中选定的密钥封装机制 (Key Encapsulation Mechanism, KEM),基于模块化学习 (Module-LWE) 问题。
⚝ CRYSTALS-Dilithium:NIST 标准化项目中选定的数字签名算法,基于模块化短整数解 (Module-SIS) 问题。
⚝ Falcon:NIST 标准化项目中选定的数字签名算法,基于短整数解 (SIS) 问题。
9.5.2.2 编码密码 (Code-based Cryptography)
编码密码 (Code-based Cryptography) 是一类基于纠错码 (error-correcting codes) 的密码算法。编码密码的安全性主要基于解码一般线性码 (decoding a general linear code) 的困难性,这是一个经典的 NP 完全问题,并且被认为是量子计算机也难以有效解决的。
编码密码的优点:
⚝ 抗量子性:解码一般线性码问题被认为是抗量子的。
⚝ 成熟的理论基础:编码理论经过多年的发展,具有成熟的理论基础和丰富的研究成果。
编码密码的缺点:
⚝ 密钥尺寸较大:编码密码的公钥尺寸通常比较大,例如,经典 McEliece 算法的公钥尺寸可达兆字节级别。
⚝ 运算效率相对较低:与格密码相比,编码密码的运算效率通常较低。
常见的编码密码算法包括:
⚝ 经典 McEliece:NIST 标准化项目中选定的密钥封装机制,基于 Goppa 码解码问题。
⚝ BIKE:NIST 标准化项目中进入第二轮的密钥封装机制,基于中等密度奇偶校验码 (MDPC) 解码问题。
⚝ HQC:NIST 标准化项目中进入第二轮的密钥封装机制,基于汉明码 (Hamming code) 和循环码的混合结构。
9.5.2.3 多变量密码 (Multivariate Cryptography)
多变量密码 (Multivariate Cryptography) 是一类基于有限域上多元多项式方程组 (Multivariate Quadratic, MQ) 求解困难性的密码算法。MQ 问题是一个 NP 完全问题,被认为是经典计算机和量子计算机都难以有效解决的。
多变量密码的优点:
⚝ 抗量子性:MQ 问题被认为是抗量子的。
⚝ 签名算法效率较高:多变量密码的签名算法通常具有较高的效率,签名速度快,签名尺寸小。
多变量密码的缺点:
⚝ 公钥加密方案设计困难:设计安全高效的多变量公钥加密方案比较困难。
⚝ 安全性分析复杂:多变量密码的安全性分析相对复杂,容易出现安全漏洞。
常见的多变量密码算法包括:
⚝ Rainbow:一种基于油醋 (Oil and Vinegar) 方案的数字签名算法。
⚝ GeMSS:一种基于彩虹带符号 (Rainbow Banded) 方案的数字签名算法。
⚝ UOV (Unbalanced Oil and Vinegar):一种早期的多变量签名方案。
9.5.2.4 哈希密码 (Hash-based Cryptography)
哈希密码 (Hash-based Cryptography) 是一类基于密码学哈希函数 (cryptographic hash functions) 的密码算法。哈希密码的安全性主要基于哈希函数的单向性和抗碰撞性等性质。由于哈希函数本身被认为能够抵抗量子计算机的攻击(Grover 算法只是降低了暴力破解的效率,但并没有完全破解哈希函数),因此基于哈希函数的密码算法也被认为是抗量子的。
哈希密码的优点:
⚝ 抗量子性:基于哈希函数的安全性,被认为是抗量子的。
⚝ 安全性证明相对简单:哈希密码的安全性可以归约到哈希函数的安全性。
⚝ 算法结构简单:哈希密码的算法结构相对简单,易于理解和实现。
哈希密码的缺点:
⚝ 通常为一次性签名:早期的哈希签名方案,如 Lamport 签名和 Winternitz 签名,通常为一次性签名 (one-time signature),即每个密钥对只能用于签名一次。
⚝ 状态管理复杂:一些哈希签名方案需要维护签名状态,增加了密钥管理的复杂性。
常见的哈希密码算法包括:
⚝ XMSS (Extended Merkle Signature Scheme):一种基于 Merkle 树的哈希签名方案,是 IETF 标准 RFC 8391。
⚝ LMS (Leighton-Micali Signature Scheme):一种基于 Leighton-Micali 一次性签名的哈希签名方案,是 IETF 标准 RFC 8554。
⚝ SPHINCS+:NIST 标准化项目中选定的数字签名算法,是一种无状态哈希签名方案,不需要维护签名状态。
后量子密码的标准化与发展趋势:
NIST 的后量子密码标准化项目是推动后量子密码发展的重要力量。除了上述四类主要的抗量子密码算法之外,还有一些其他的抗量子密码方向,例如基于同源 (isogeny-based) 的密码学等。后量子密码的研究和标准化仍在进行中,未来几年将是后量子密码技术发展和应用的关键时期。随着量子计算技术的进步,后量子密码将成为保障未来信息安全的重要基石。
10. chapter 10: 密码分析与安全性评估 (Cryptanalysis and Security Evaluation)
10.1 密码分析概述 (Overview of Cryptanalysis)
密码分析 (Cryptanalysis) 是研究如何破解密码系统,即在不知道密钥 (key) 的情况下,恢复出明文 (plaintext) 或密钥本身。密码分析是密码学 (Cryptography) 的孪生学科,二者相辅相成,共同推动密码技术的发展。密码分析不仅关注破解密码,也致力于评估密码系统的安全性,从而发现潜在的弱点,为设计更安全的密码系统提供指导。
10.1.1 密码分析的目标 (Goals of Cryptanalysis)
密码分析的主要目标可以归纳为以下几点:
① 破解密文 (ciphertext) 恢复明文 (plaintext):这是密码分析最直接的目标。攻击者试图在未知密钥的情况下,通过分析密文,推导出原始的明文信息。例如,在截获一段加密通信后,密码分析者希望能够解读出通信的内容。
② 推导密钥 (key):即使无法直接恢复所有明文,如果能够推导出加密所使用的密钥,攻击者就可以解密所有使用该密钥加密的信息,甚至可以冒充合法用户进行加密操作。密钥的泄露通常比单条消息的泄露危害更大。
③ 发现密码系统的弱点 (vulnerabilities):密码分析不仅仅是为了破解特定的密文或密钥,更重要的是发现密码算法或协议设计上的缺陷和弱点。这些弱点可能允许攻击者在不完全破解密码的情况下,获取部分信息,或者降低破解的难度。发现弱点有助于改进密码系统,提升整体安全性。
④ 评估密码系统的安全性 (security evaluation):密码分析是评估密码系统安全性的重要手段。通过模拟各种攻击场景,分析密码系统在不同攻击下的表现,可以评估其抵抗攻击的能力,确定其安全强度。这种评估对于选择合适的密码算法和配置安全的密码系统至关重要。
⑤ 促进密码学理论与技术的发展 (development of cryptography):密码分析与密码设计是相互促进的。成功的密码分析案例能够揭示现有密码技术的不足,推动密码学家研究和设计更强大的密码算法和更安全的密码协议。反过来,新的密码学理论和技术也会为密码分析提供新的工具和方法。
10.1.2 常见的密码分析方法 (Common Cryptanalysis Methods)
密码分析方法多种多样,根据攻击者所掌握的信息和攻击策略的不同,可以分为多种类型。以下介绍几种常见的密码分析方法:
10.1.2.1 穷举攻击 (Brute-force Attack)
穷举攻击 (Brute-force Attack),也称为暴力破解,是最基本也是最直接的密码分析方法。它尝试所有可能的密钥,直到找到正确的密钥,能够解密密文或完成其他攻击目标。
① 原理:穷举攻击基于一个简单的原理:密钥空间是有限的。对于任何密码系统,密钥的可能取值范围都是有限的。只要密钥空间足够小,理论上就可以通过遍历所有可能的密钥来找到正确的密钥。
② 方法:
⚝ 密钥空间确定:首先需要确定密码算法使用的密钥长度和类型,从而确定密钥空间的大小。例如,一个 8 位二进制密钥的密钥空间大小为 \(2^8 = 256\)。
⚝ 密钥遍历:按照一定的顺序(例如字典序)生成所有可能的密钥。
⚝ 密钥验证:对于每个生成的密钥,尝试使用它来解密密文或进行其他操作(如身份验证)。如果解密结果有意义(例如,可以识别为自然语言),或者操作成功,则认为找到了正确的密钥。
③ 示例:假设使用简单的替换密码加密了一段英文文本,密钥是字母表的一个排列。如果密钥长度较短,例如只替换前 3 个字母,那么密钥空间相对较小,可以通过穷举攻击来破解。
④ 优缺点:
⚝ 优点:原理简单,易于理解和实现。对于密钥空间较小的密码系统,穷举攻击是有效的。
⚝ 缺点:效率低下,计算量大。密钥空间的大小随着密钥长度的增加呈指数级增长。对于现代密码算法,密钥长度通常足够长,使得穷举攻击在计算上不可行。例如,AES-128 的密钥空间大小为 \(2^{128}\),即使使用最快的计算机,也需要极长的时间才能完成穷举。
⑤ 防御:
⚝ 增加密钥长度:最有效的防御方法是使用足够长的密钥,使得密钥空间足够大,穷举攻击在计算上不可行。
⚝ 使用复杂的密码算法:设计复杂的密码算法,使得即使密钥空间较小,穷举攻击也难以有效实施。
⚝ 密钥管理:加强密钥管理,防止密钥泄露,避免攻击者直接获取密钥。
10.1.2.2 统计分析 (Statistical Analysis)
统计分析 (Statistical Analysis) 是一种基于数据统计规律的密码分析方法。它利用明文和密文的统计特性,例如字符频率、n-gram 频率等,来破解密码。统计分析在破解经典密码和某些现代密码时非常有效。
① 原理:统计分析基于一个观察:自然语言(如英文、中文)的字符和字符组合的出现频率不是均匀分布的,而是存在一定的统计规律。例如,在英文文本中,字母 'e' 的出现频率最高,字母 'z' 的出现频率最低。双字母组合 'th'、'he' 等的频率也高于其他组合。密码算法加密后的密文,如果保留了明文的统计特性,就可以利用这些特性进行分析。
② 方法:
⚝ 频率分析 (Frequency Analysis):
▮▮▮▮ⓐ 单字符频率分析:统计密文中各个字符出现的频率,并与已知语言的单字符频率分布进行比较。在简单的替换密码中,密文和明文的字符频率分布之间存在对应关系。例如,如果密文中字符 'X' 的频率最高,可能对应于明文中的 'e'。
▮▮▮▮ⓑ 多字符频率分析:统计密文中双字母组合 (digram)、三字母组合 (trigram) 等的频率,并与已知语言的多字符频率分布进行比较。多字符频率分析可以提供更丰富的信息,有助于破解更复杂的密码,如维吉尼亚密码 (Vigenère Cipher)。
⚝ 模式识别 (Pattern Recognition):在密文中寻找重复出现的模式,例如重复的字符序列。这些模式可能对应于明文中的常用词汇、短语或结构。
⚝ 熵分析 (Entropy Analysis):计算密文的熵值,评估密文的随机性。理想的密文应该具有较高的熵值,接近于完全随机。如果密文的熵值偏低,可能表明密码算法的加密效果不佳,存在统计可利用的弱点。
③ 示例:破解替换密码。在替换密码中,每个明文字符都被替换成另一个字符。通过统计密文中各个字符的频率,可以推测出替换规则。例如,如果密文中 'Q' 出现频率最高,可能对应明文 'e'。
④ 优缺点:
⚝ 优点:对于保留明文统计特性的密码算法,统计分析非常有效。计算复杂度相对较低,适用于手工破解和计算机辅助破解。
⚝ 缺点:对于设计良好的现代密码算法,密文的统计特性通常被消除或隐藏,使得统计分析的效果大大降低。对于短消息或非自然语言文本,统计分析的效果也可能不佳。
⑤ 防御:
⚝ 混淆 (Confusion):通过复杂的替换操作,使得密文的每个比特都与多个密钥比特相关联,从而隐藏明文和密钥之间的统计关系。
⚝ 扩散 (Diffusion):通过置换操作,将明文的统计特性扩散到整个密文中,使得局部的统计规律难以利用。
⚝ 使用分组密码和流密码:现代分组密码和流密码的设计目标之一就是抵抗统计分析。例如,AES 和 ChaCha20 等算法都采用了复杂的混淆和扩散机制。
10.1.2.3 差分密码分析 (Differential Cryptanalysis)
差分密码分析 (Differential Cryptanalysis) 是一种主要用于分析分组密码 (Block Cipher) 的方法。它通过研究明文对 (plaintext pairs) 的差异 (difference) 如何影响密文对 (ciphertext pairs) 的差异,来推导出密钥信息。差分密码分析是现代密码分析学中最重要和最有效的方法之一。
① 原理:差分密码分析的核心思想是利用密码算法的非线性特性。分组密码通常由多轮迭代运算组成,每一轮运算都包含非线性变换。差分分析关注的是,当输入明文对之间存在特定差异时,经过多轮加密后,输出密文对的差异分布是否具有可预测的统计规律。如果存在这种规律,就可以利用它来推导出密钥。
② 方法:
⚝ 选择明文对 (Chosen Plaintext Pairs):攻击者选择具有特定差异的明文对,例如,只在一个比特位上不同的明文对。
⚝ 加密并获取密文对 (Ciphertext Pairs):使用目标密码算法和未知密钥加密这些明文对,得到相应的密文对。
⚝ 差异传播分析 (Difference Propagation Analysis):分析明文对的差异在经过每一轮加密运算后的传播规律。通过统计分析大量明文对和密文对的差异,找到具有高概率的差异传播路径 (differential characteristic)。
⚝ 密钥猜测与验证 (Key Guessing and Verification):利用找到的差异传播路径,猜测最后一轮或几轮加密的密钥比特。通过部分解密和统计分析,验证密钥猜测的正确性。重复这个过程,逐步推导出完整的密钥。
③ 示例:DES 算法的差分密码分析。差分密码分析最初就是为了分析 DES 算法而提出的。通过精心选择明文对和分析差异传播,可以有效地破解简化轮数的 DES 算法。
④ 优缺点:
⚝ 优点:对于分组密码,差分密码分析是一种非常强大的攻击方法。它能够有效地利用密码算法的结构弱点,破解许多实际应用的密码算法。
⚝ 缺点:差分密码分析的复杂度较高,需要大量的明文-密文对。对于轮数较多的密码算法,差分分析的难度会显著增加。差分分析的效果也依赖于密码算法的具体结构和非线性特性。
⑤ 防御:
⚝ 设计抵抗差分分析的密码算法:在设计分组密码时,需要考虑抵抗差分密码分析的能力。例如,增加轮数,使用具有良好差分特性的 S-盒 (Substitution-box),设计复杂的轮函数结构等。
⚝ 增加密钥长度:更长的密钥长度可以增加差分分析的复杂度,提高安全性。
⚝ 避免使用弱密钥:某些密码算法可能存在弱密钥,这些密钥容易受到差分分析的攻击。应避免使用这些弱密钥。
10.1.2.4 线性密码分析 (Linear Cryptanalysis)
线性密码分析 (Linear Cryptanalysis) 是另一种主要用于分析分组密码的方法,与差分密码分析并列为现代密码分析学的两大支柱。线性密码分析通过寻找明文比特、密文比特和密钥比特之间的线性关系 (linear approximation),来推导出密钥信息。
① 原理:线性密码分析的核心思想是利用密码算法的线性逼近。理想的分组密码应该表现得像一个随机置换,但实际的密码算法为了实现高效,通常会存在一定的线性偏差。线性分析的目标就是找到这种线性偏差,并利用它来破解密码。
② 方法:
⚝ 寻找线性逼近 (Linear Approximation):分析密码算法的每一轮运算,寻找明文比特、密文比特和密钥比特之间近似成立的线性方程。线性逼近的质量用线性概率 (linear probability) 来衡量,线性概率越偏离 0.5,线性逼近的效果越好。
⚝ 收集明文-密文对 (Plaintext-Ciphertext Pairs):收集大量的明文-密文对,可以使用选择明文攻击 (Chosen Plaintext Attack) 或已知明文攻击 (Known Plaintext Attack)。
⚝ 统计分析 (Statistical Analysis):利用收集到的明文-密文对,统计线性逼近方程成立的次数。如果线性逼近方程的线性概率显著偏离 0.5,就可以利用这个偏差来推导出密钥比特。
⚝ 密钥猜测与验证 (Key Guessing and Verification):根据线性逼近方程和统计结果,猜测最后一轮或几轮加密的密钥比特。通过部分解密和统计分析,验证密钥猜测的正确性。重复这个过程,逐步推导出完整的密钥。
③ 示例:DES 算法的线性密码分析。线性密码分析最初也是为了分析 DES 算法而提出的。松井充 (Mitsuru Matsui) 利用线性密码分析成功地破解了 DES 算法。
④ 优缺点:
⚝ 优点:线性密码分析是分析分组密码的有效方法之一,与差分密码分析互为补充。对于某些类型的分组密码,线性分析可能比差分分析更有效。
⚝ 缺点:线性密码分析的复杂度也较高,需要大量的明文-密文对。线性逼近的质量直接影响线性分析的效果。如果密码算法的线性特性不明显,线性分析的效果会受到限制。
⑤ 防御:
⚝ 设计抵抗线性分析的密码算法:在设计分组密码时,需要考虑抵抗线性密码分析的能力。例如,使用具有良好线性特性的 S-盒,设计复杂的轮函数结构,使得线性逼近的线性概率接近 0.5。
⚝ 增加密钥长度:更长的密钥长度可以增加线性分析的复杂度,提高安全性。
⚝ 增加轮数:增加密码算法的轮数可以降低线性逼近的质量,提高抵抗线性分析的能力。
10.2 对称密码的密码分析 (Cryptanalysis of Symmetric Ciphers)
对称密码 (Symmetric Cipher) 的密码分析主要关注使用相同密钥进行加密和解密的密码算法。常见的对称密码包括分组密码 (Block Cipher) 和流密码 (Stream Cipher)。
① 分组密码的密码分析:
⚝ 差分密码分析 (Differential Cryptanalysis):如前所述,差分密码分析是分析分组密码的重要方法。
⚝ 线性密码分析 (Linear Cryptanalysis):线性密码分析也是分析分组密码的有效方法。
⚝ 积分密码分析 (Integral Cryptanalysis):积分密码分析,也称为 Square 攻击,是一种针对分组密码的统计攻击方法,它利用了密码算法的积分性质。
⚝ 截断差分分析 (Truncated Differential Cryptanalysis):截断差分分析是差分密码分析的变种,它关注的是部分比特的差异传播,而不是全部比特的差异。
⚝ 不可能差分分析 (Impossible Differential Cryptanalysis):不可能差分分析利用不可能发生的差异传播路径来排除错误的密钥猜测。
⚝ 相关密钥攻击 (Related-key Attack):相关密钥攻击是指攻击者可以利用多个使用相关密钥加密的明文-密文对进行分析。
⚝ 侧信道攻击 (Side-channel Attack):侧信道攻击利用密码算法在执行过程中泄露的物理信息,如功耗、电磁辐射、时序等,来推导密钥。
② 流密码的密码分析:
⚝ 统计分析 (Statistical Analysis):对于某些线性反馈移位寄存器 (LFSR) 流密码,可以使用统计分析方法,例如 Berlekamp-Massey 算法,来恢复密钥流生成器的线性反馈多项式。
⚝ 相关性攻击 (Correlation Attack):相关性攻击利用密钥流生成器的输出比特与密钥比特之间的相关性进行分析。
⚝ 区分器攻击 (Distinguishing Attack):区分器攻击的目标是区分密钥流的输出序列与真随机序列。如果能够有效区分,就可能存在安全漏洞。
⚝ 代数攻击 (Algebraic Attack):代数攻击将密码算法表示为代数方程组,然后通过求解方程组来恢复密钥。
⚝ 时间-存储权衡攻击 (Time-Memory Tradeoff Attack):时间-存储权衡攻击通过预计算和存储大量数据,来加速在线攻击过程。
10.3 公钥密码的密码分析 (Cryptanalysis of Public-key Ciphers)
公钥密码 (Public-key Cryptography) 的密码分析主要关注基于数学难题的密码算法,例如 RSA、Diffie-Hellman、ECC 等。公钥密码的安全性通常依赖于这些数学难题的计算 сложность (complexity)。
① RSA 算法的密码分析:
⚝ 大整数分解 (Integer Factorization):RSA 算法的安全性基于大整数分解难题。如果能够有效地分解 RSA 模数 \(n\),就可以破解 RSA。常见的大整数分解算法包括试除法 (Trial Division)、Pollard's rho 算法、二次筛法 (Quadratic Sieve)、数域筛法 (Number Field Sieve) 等。
⚝ 共模攻击 (Common Modulus Attack):如果多个用户使用相同的 RSA 模数 \(n\),但使用不同的公钥 \(e_i\),攻击者可以通过共模攻击来破解。
⚝ 低加密指数攻击 (Low Exponent Attack):如果 RSA 的公钥指数 \(e\) 选择过小,例如 \(e=3\),可能会受到低加密指数攻击。
⚝ Wiener's Attack:如果 RSA 的私钥指数 \(d\) 满足特定条件,例如 \(d < n^{0.25}\),可能会受到 Wiener's Attack。
⚝ 选择密文攻击 (Chosen Ciphertext Attack):RSA 算法在某些使用模式下可能容易受到选择密文攻击。例如,Padding Oracle Attack。
② Diffie-Hellman 密钥交换的密码分析:
⚝ 离散对数问题 (Discrete Logarithm Problem DLP):Diffie-Hellman 密钥交换的安全性基于离散对数难题。如果能够有效地求解离散对数问题,就可以破解 Diffie-Hellman。求解离散对数问题的算法包括 Baby-step Giant-step 算法、Pollard's rho 算法、指数演算法 (Index Calculus Algorithm) 等。
⚝ 中间人攻击 (Man-in-the-Middle Attack):Diffie-Hellman 密钥交换容易受到中间人攻击。在没有身份验证的情况下,中间人可以冒充双方进行密钥交换,从而窃听或篡改通信内容。
③ 椭圆曲线密码学 ECC 的密码分析:
⚝ 椭圆曲线离散对数问题 ECDLP (Elliptic Curve Discrete Logarithm Problem):ECC 的安全性基于椭圆曲线离散对数难题。如果能够有效地求解 ECDLP,就可以破解 ECC。求解 ECDLP 的算法包括 Pollard's rho 算法、Baby-step Giant-step 算法、MOV 攻击、Weil Descent 攻击等。
⚝ 小群攻击 (Small Subgroup Attack):如果椭圆曲线的阶数包含小素因子,可能会受到小群攻击。
⚝ 侧信道攻击 (Side-channel Attack):ECC 的实现容易受到侧信道攻击,例如功耗分析、时序分析等。
10.4 哈希函数的密码分析 (Cryptanalysis of Hash Functions)
哈希函数 (Hash Function) 的密码分析主要关注寻找哈希函数的碰撞 (collision)、原像 (preimage) 和第二原像 (second preimage)。理想的哈希函数应该具有抗碰撞性 (collision resistance)、原像抗性 (preimage resistance) 和第二原像抗性 (second preimage resistance)。
① 碰撞攻击 (Collision Attack):
⚝ 生日攻击 (Birthday Attack):生日攻击是一种通用的碰撞攻击方法,它利用生日悖论 (Birthday Paradox) 来寻找碰撞。对于一个输出长度为 \(n\) 比特的哈希函数,生日攻击的复杂度约为 \(2^{n/2}\)。
⚝ 中间相遇攻击 (Meet-in-the-Middle Attack):中间相遇攻击是一种通用的攻击方法,可以用于提高碰撞攻击的效率。
⚝ 差分分析 (Differential Analysis):差分分析也可以用于分析哈希函数的碰撞特性。通过研究输入差异如何影响输出差异,可以构造碰撞。
⚝ 长度扩展攻击 (Length Extension Attack):某些哈希函数(如 MD5、SHA-1)存在长度扩展漏洞,攻击者可以在不知道密钥的情况下,利用哈希值和消息长度,计算出附加消息后的哈希值。
② 原像攻击 (Preimage Attack):
⚝ 穷举搜索 (Brute-force Search):原像攻击最基本的方法是穷举搜索,尝试所有可能的输入,直到找到一个输入,其哈希值等于目标哈希值。对于一个输出长度为 \(n\) 比特的哈希函数,穷举搜索的复杂度约为 \(2^n\)。
⚝ 预计算攻击 (Precomputation Attack):预计算攻击通过预先计算和存储大量哈希值,来加速在线原像搜索过程。
③ 第二原像攻击 (Second Preimage Attack):
⚝ 穷举搜索 (Brute-force Search):第二原像攻击也可以使用穷举搜索方法。对于一个输出长度为 \(n\) 比特的哈希函数,穷举搜索的复杂度约为 \(2^n\)。
⚝ 滑跃攻击 (Slide Attack):滑跃攻击是一种针对迭代哈希函数的攻击方法,可以用于寻找第二原像。
10.5 密码系统的安全性评估 (Security Evaluation of Cryptographic Systems)
密码系统的安全性评估 (Security Evaluation of Cryptographic Systems) 是指对密码系统的安全性进行全面的分析和评估,以确定其抵抗各种攻击的能力,并发现潜在的安全风险。安全性评估是密码系统设计、部署和应用的重要环节。
10.5.1 安全性需求分析 (Security Requirements Analysis)
安全性需求分析 (Security Requirements Analysis) 是密码系统安全性评估的第一步。它旨在明确密码系统需要达到的安全目标和安全需求。
① 确定安全目标 (Security Goals):
⚝ 机密性 (Confidentiality):确保信息不被未经授权的实体访问。例如,加密通信、数据加密存储等。
⚝ 完整性 (Integrity):确保信息不被未经授权的修改或篡改。例如,消息认证码 (MAC)、数字签名 (Digital Signature)、哈希函数 (Hash Function) 等。
⚝ 可用性 (Availability):确保授权用户可以及时访问和使用信息和资源。例如,抗拒绝服务攻击 (Anti-DDoS) 措施、容错机制等。
⚝ 认证性 (Authentication):验证通信实体的身份,确保通信双方是合法的。例如,数字证书 (Digital Certificate)、身份验证协议 (Authentication Protocol) 等。
⚝ 不可否认性 (Non-repudiation):防止通信实体否认其发送或接收过的信息。例如,数字签名 (Digital Signature)。
② 识别安全威胁 (Security Threats):
⚝ 窃听 (Eavesdropping):未经授权地监听通信内容。
⚝ 篡改 (Tampering):未经授权地修改信息内容。
⚝ 伪造 (Forgery):冒充合法用户或实体。
⚝ 重放攻击 (Replay Attack):重复发送之前截获的有效数据。
⚝ 拒绝服务攻击 (Denial of Service Attack, DoS):阻止合法用户访问服务或资源。
⚝ 中间人攻击 (Man-in-the-Middle Attack):攻击者位于通信双方之间,窃听或篡改通信内容。
③ 定义安全需求 (Security Requirements):
⚝ 功能性安全需求 (Functional Security Requirements):描述密码系统需要提供的安全功能。例如,使用 AES-256 加密算法进行数据加密,使用 SHA-256 哈希函数进行消息摘要。
⚝ 非功能性安全需求 (Non-functional Security Requirements):描述密码系统的安全性能指标。例如,加密速度、密钥长度、安全性强度级别等。
10.5.2 威胁建模 (Threat Modeling)
威胁建模 (Threat Modeling) 是识别和分析潜在安全威胁的过程。通过威胁建模,可以系统地分析密码系统可能面临的各种威胁,并评估其风险级别。
① 识别资产 (Identify Assets):确定需要保护的关键资产,例如敏感数据、密钥、系统资源等。
② 识别威胁 (Identify Threats):针对每个资产,识别可能存在的威胁类型和攻击场景。可以使用 STRIDE 模型 (Spoofing, Tampering, Repudiation, Information Disclosure, Denial of Service, Elevation of Privilege) 等威胁分类方法。
③ 评估漏洞 (Assess Vulnerabilities):分析密码系统可能存在的漏洞,这些漏洞可能被攻击者利用来实施威胁。
④ 风险评估 (Risk Assessment):评估每个威胁的风险级别,通常基于威胁发生的可能性 (likelihood) 和影响 (impact)。风险级别可以分为高、中、低等。
⑤ 制定应对策略 (Develop Mitigation Strategies):针对高风险威胁,制定相应的应对策略,例如,采用更强的密码算法、加强访问控制、实施安全审计等。
10.5.3 安全性测试与评估方法 (Security Testing and Evaluation Methods)
安全性测试与评估方法 (Security Testing and Evaluation Methods) 是指通过各种测试和评估手段,验证密码系统是否满足安全需求,并评估其安全性强度。
① 密码算法评估 (Cryptographic Algorithm Evaluation):
⚝ 理论分析 (Theoretical Analysis):对密码算法的数学原理、结构和安全性证明进行分析,评估其理论安全性。
⚝ 密码分析 (Cryptanalysis):使用各种密码分析方法,尝试破解密码算法,评估其抗攻击能力。
⚝ 标准化评估 (Standardization Evaluation):参考国际标准和规范,例如 NIST 密码算法评估标准,评估密码算法的安全性级别。
② 密码协议评估 (Cryptographic Protocol Evaluation):
⚝ 协议分析 (Protocol Analysis):使用形式化方法 (Formal Methods) 或非形式化方法,分析密码协议的设计和实现,查找协议漏洞。
⚝ 渗透测试 (Penetration Testing):模拟真实攻击场景,对密码协议进行渗透测试,评估其抵抗攻击能力。
⚝ 安全审计 (Security Audit):对密码协议的实现代码、配置和部署进行安全审计,查找安全配置错误和代码漏洞。
③ 密码系统实现评估 (Cryptographic System Implementation Evaluation):
⚝ 代码审查 (Code Review):对密码系统的实现代码进行人工或自动代码审查,查找代码漏洞和安全缺陷。
⚝ 单元测试 (Unit Testing):对密码系统的各个模块进行单元测试,验证其功能和安全性。
⚝ 集成测试 (Integration Testing):对密码系统的各个模块进行集成测试,验证其整体功能和安全性。
⚝ 性能测试 (Performance Testing):评估密码系统的性能指标,例如加密速度、解密速度、密钥生成速度等。
⚝ 侧信道分析 (Side-channel Analysis):对密码系统的硬件或软件实现进行侧信道分析,评估其抵抗侧信道攻击的能力。
通过综合运用上述安全性评估方法,可以全面评估密码系统的安全性,发现潜在的安全风险,并为改进密码系统和提升整体安全性提供依据。密码分析与安全性评估是一个持续的过程,随着密码技术和攻击技术的发展,需要不断进行评估和改进,以应对新的安全挑战。
11. chapter 11: 密码学工程实践 (Cryptography Engineering Practice)
11.1 密码算法库的使用 (Using Cryptographic Algorithm Libraries)
在密码学工程实践中,直接从头开始实现密码算法既耗时又容易出错。因此,利用成熟、经过广泛测试和审计的密码算法库是至关重要的。这些库提供了各种预先构建的密码学函数和协议,可以帮助开发者快速、安全地构建密码学应用。本节将介绍几个常用的密码算法库,包括 OpenSSL, Libsodium 和 Bouncy Castle,并探讨如何在工程实践中有效地使用它们。
11.1.1 OpenSSL
OpenSSL 是一个强大、全面的开源密码学工具包,广泛应用于各种操作系统和应用场景中。它实现了 SSL/TLS 协议以及各种通用的密码算法。
① OpenSSL 的特点
⚝ 历史悠久且成熟:OpenSSL 项目始于 1998 年,经过多年的发展和社区的广泛使用,其代码库已经相当成熟和稳定。
⚝ 功能全面:OpenSSL 提供了对称加密算法(如 AES, DES, 3DES),非对称加密算法(如 RSA, DSA, ECC),哈希函数(如 MD5, SHA-1, SHA-256),消息认证码 (MAC),以及 SSL/TLS 协议的完整实现。
⚝ 跨平台性:OpenSSL 可以在多种操作系统上编译和运行,包括 Linux, Windows, macOS, 以及各种 Unix 系统。
⚝ 命令行工具:OpenSSL 提供了一套强大的命令行工具 openssl
,可以用于密钥生成、证书管理、加解密、哈希计算等多种密码学操作,方便快捷地进行测试和管理。
⚝ 编程接口:OpenSSL 提供了 C 语言的 API,开发者可以使用这些 API 在自己的程序中集成密码学功能。同时,也有许多其他语言的封装库(如 Python 的 pyOpenSSL
, cryptography
等)方便在不同语言环境中使用 OpenSSL。
② OpenSSL 的常用功能
⚝ 对称加密与解密:支持多种对称加密算法,例如 AES (Advanced Encryption Standard 高级加密标准), DES (Data Encryption Standard 数据加密标准), 3DES (Triple DES 三重DES), Blowfish 等。可以使用 openssl enc
命令行工具进行对称加解密操作,或者使用 API 函数如 EVP_EncryptInit_ex
, EVP_EncryptUpdate
, EVP_EncryptFinal_ex
等在程序中实现。
⚝ 非对称加密与解密:支持 RSA (Rivest-Shamir-Adleman), ECC (Elliptic Curve Cryptography 椭圆曲线密码学) 等非对称加密算法。可以使用 openssl rsautl
, openssl pkeyutl
等命令行工具进行 RSA 加解密,或者使用 API 函数如 RSA_public_encrypt
, RSA_private_decrypt
, EVP_PKEY_encrypt
, EVP_PKEY_decrypt
等。
⚝ 哈希计算:支持多种哈希算法,例如 MD5, SHA-1, SHA-256, SHA-512 等。可以使用 openssl dgst
命令行工具计算哈希值,或者使用 API 函数如 EVP_DigestInit_ex
, EVP_DigestUpdate
, EVP_DigestFinal_ex
等。
⚝ 数字签名与验证:支持 RSA, DSA (Digital Signature Algorithm 数字签名算法), ECDSA (Elliptic Curve Digital Signature Algorithm 椭圆曲线数字签名算法) 等数字签名算法。可以使用 openssl dgst -sign
, openssl dgst -verify
等命令行工具进行签名和验证,或者使用 API 函数如 EVP_SignInit_ex
, EVP_SignUpdate
, EVP_SignFinal
, EVP_VerifyInit_ex
, EVP_VerifyUpdate
, EVP_VerifyFinal
等。
⚝ 密钥和证书管理:OpenSSL 提供了强大的密钥和证书管理功能,可以生成各种类型的密钥(RSA, ECC 等),生成和管理 X.509 证书,创建证书签名请求 (CSR),以及进行证书吊销列表 (CRL) 管理等。可以使用 openssl genrsa
, openssl ecparam
, openssl req
, openssl x509
, openssl ca
等命令行工具进行操作,或者使用相应的 API 函数。
⚝ SSL/TLS 协议支持:OpenSSL 是 SSL/TLS 协议的广泛使用的实现,提供了服务端和客户端的 API,可以用于构建安全的网络应用。可以使用 openssl s_server
, openssl s_client
等命令行工具进行 SSL/TLS 连接测试,或者使用 API 函数如 SSL_CTX_new
, SSL_new
, SSL_accept
, SSL_connect
, SSL_read
, SSL_write
等。
③ OpenSSL 使用示例 (命令行)
⚝ 生成 RSA 密钥:
1
openssl genrsa -out private.pem 2048
这条命令生成一个 2048 位的 RSA 私钥,并保存到 private.pem
文件中。
⚝ 从私钥导出公钥:
1
openssl rsa -in private.pem -pubout -out public.pem
这条命令从 private.pem
文件中读取私钥,并导出对应的公钥到 public.pem
文件中。
⚝ 使用 AES-256-CBC 加密文件:
1
openssl enc -aes-256-cbc -in input.txt -out output.enc
这条命令使用 AES-256-CBC 算法加密 input.txt
文件,并将加密结果保存到 output.enc
文件中。命令会提示输入加密密码。
⚝ 计算 SHA-256 哈希值:
1
openssl dgst -sha256 input.txt
这条命令计算 input.txt
文件的 SHA-256 哈希值并输出。
④ OpenSSL 使用注意事项
⚝ 版本选择:OpenSSL 有多个版本分支,应选择稳定且维护良好的版本。同时,关注安全公告,及时更新到修复了安全漏洞的版本。
⚝ 配置选项:编译 OpenSSL 时,可以根据实际需求配置编译选项,例如启用或禁用某些算法,优化性能等。
⚝ API 使用:使用 OpenSSL 的 API 时,需要仔细阅读文档,理解各个函数的参数和返回值,避免错误使用导致安全问题。特别是内存管理,需要手动释放分配的内存。
⚝ 随机数生成:OpenSSL 依赖于安全的随机数生成器。在某些平台上,可能需要配置或检查随机数源,确保生成高质量的随机数。
⚝ 侧信道攻击防护:某些密码算法的 OpenSSL 实现可能存在侧信道攻击的风险。在对安全性要求极高的场景下,需要考虑使用具有侧信道防护的 OpenSSL 版本或采取其他防护措施。
11.1.2 Libsodium
Libsodium 是一个现代的、易于使用的密码学库。它的目标是提供安全、高性能的密码学功能,同时简化 API 设计,减少开发者的使用难度,避免常见的安全陷阱。
① Libsodium 的特点
⚝ 现代密码学算法:Libsodium 默认采用现代、安全的密码学算法,例如 ChaCha20, Poly1305, Curve25519, EdDSA 等,避免使用过时或安全性较弱的算法。
⚝ 安全默认配置:Libsodium 在设计上力求安全,提供了安全的默认配置,例如自动选择安全的密钥长度、填充模式等,减少开发者配置错误的可能性。
⚝ 易于使用:Libsodium 提供了简洁、一致的 API,函数命名清晰,参数易于理解,降低了学习和使用的门槛。
⚝ 抗误用设计:Libsodium 的 API 设计考虑了常见的密码学误用场景,例如提供了内存擦除函数 sodium_memzero
,防止密钥等敏感信息泄露在内存中。
⚝ 高性能:Libsodium 针对性能进行了优化,采用高效的算法实现,并利用硬件加速(如果可用)。
⚝ 跨平台性:Libsodium 支持多种操作系统和编程语言,包括 C, C++, Python, Go, Java 等。
② Libsodium 的常用功能
⚝ 对称加密与认证加密:Libsodium 强调使用认证加密 (Authenticated Encryption) 算法,例如 crypto_aead_chacha20poly1305_ietf_encrypt
和 crypto_aead_chacha20poly1305_ietf_decrypt
函数提供了 ChaCha20-Poly1305 认证加密算法的实现。认证加密算法在加密的同时提供数据完整性和认证,防止数据被篡改。
⚝ 哈希计算:提供了 BLAKE2b 哈希算法的实现,例如 crypto_generichash_blake2b_simple
函数。BLAKE2b 是一种高性能、安全的哈希算法,被认为是 MD5 和 SHA-1 等传统哈希算法的更好替代品。
⚝ 数字签名:使用 EdDSA (Edwards-curve Digital Signature Algorithm) 算法进行数字签名,例如 crypto_sign_detached
和 crypto_sign_verify_detached
函数。EdDSA 是一种快速、安全的数字签名算法,基于 Curve25519 椭圆曲线。
⚝ 密钥交换:支持 Curve25519 密钥交换算法,例如 crypto_kx_client_session_keys
和 crypto_kx_server_session_keys
函数。Curve25519 是一种高性能、安全的椭圆曲线,广泛应用于密钥交换协议中。
⚝ 密码学工具函数:Libsodium 还提供了一些实用的密码学工具函数,例如安全的随机数生成函数 randombytes_buf
, 密钥派生函数 crypto_pwhash_scryptsalsa208sha256
, 内存擦除函数 sodium_memzero
等。
③ Libsodium 使用示例 (C 语言)
1
#include <sodium.h>
2
#include <stdio.h>
3
#include <stdlib.h>
4
5
int main() {
6
if (sodium_init() == -1) {
7
fprintf(stderr, "Libsodium initialization failed!\n");
8
return 1;
9
}
10
11
unsigned char key[crypto_aead_chacha20poly1305_ietf_KEYBYTES];
12
unsigned char nonce[crypto_aead_chacha20poly1305_ietf_NPUBBYTES];
13
unsigned char plaintext[] = "Hello, Libsodium!";
14
size_t plaintext_len = sizeof(plaintext) - 1;
15
unsigned char ciphertext[plaintext_len + crypto_aead_chacha20poly1305_ietf_ABYTES];
16
unsigned long long ciphertext_len;
17
18
crypto_aead_chacha20poly1305_ietf_keygen(key); // 生成密钥
19
randombytes_buf(nonce, sizeof(nonce)); // 生成随机 nonce
20
21
// 加密
22
if (crypto_aead_chacha20poly1305_ietf_encrypt(ciphertext, &ciphertext_len,
23
plaintext, plaintext_len,
24
NULL, 0, // 无附加数据
25
NULL, nonce, key) != 0) {
26
fprintf(stderr, "Encryption failed!\n");
27
return 1;
28
}
29
30
printf("Ciphertext: ");
31
for (size_t i = 0; i < ciphertext_len; ++i) {
32
printf("%02x", ciphertext[i]);
33
}
34
printf("\n");
35
36
unsigned char decryptedtext[ciphertext_len];
37
unsigned long long decryptedtext_len;
38
39
// 解密
40
if (crypto_aead_chacha20poly1305_ietf_decrypt(decryptedtext, &decryptedtext_len,
41
NULL, ciphertext, ciphertext_len,
42
NULL, 0, nonce, key) != 0) {
43
fprintf(stderr, "Decryption failed! Authentication failed.\n");
44
return 1;
45
}
46
47
decryptedtext[decryptedtext_len] = '\0'; // 添加字符串结束符
48
printf("Decrypted text: %s\n", decryptedtext);
49
50
return 0;
51
}
这个示例演示了使用 Libsodium 进行 ChaCha20-Poly1305 认证加密和解密的过程。代码首先初始化 Libsodium 库,然后生成密钥和 nonce。接着,使用 crypto_aead_chacha20poly1305_ietf_encrypt
函数加密明文,并使用 crypto_aead_chacha20poly1305_ietf_decrypt
函数解密密文。
④ Libsodium 使用注意事项
⚝ 初始化:在使用 Libsodium 的任何函数之前,必须先调用 sodium_init()
函数进行初始化。
⚝ 内存管理:Libsodium 内部管理内存,一般不需要手动分配和释放内存。但是,对于密钥等敏感信息,应使用 sodium_memzero
函数及时擦除内存,防止泄露。
⚝ Nonce 管理:对于认证加密算法,nonce (Number used once 仅使用一次的数) 必须是唯一的。在每次加密操作时,都应该生成新的 nonce。通常使用随机数生成器生成 nonce。
⚝ 错误处理:Libsodium 的函数通常通过返回值指示成功或失败。应检查返回值,并进行相应的错误处理。
⚝ 算法选择:Libsodium 默认选择安全的现代算法。在大多数情况下,使用默认算法即可。如果需要使用特定的算法,需要仔细评估其安全性和适用性。
11.1.3 Bouncy Castle
Bouncy Castle 是一个开源的密码学库集合,提供了 Java 和 C# 两个主要版本,也支持其他语言。Bouncy Castle 提供了广泛的密码学算法和协议实现,包括对称加密、非对称加密、哈希函数、数字签名、消息认证码、PKI (Public Key Infrastructure 公钥基础设施) 支持等。
① Bouncy Castle 的特点
⚝ 广泛的算法支持:Bouncy Castle 提供了非常广泛的密码学算法支持,包括各种国际标准和行业标准的算法,以及一些较新的算法。
⚝ Java 和 C# 版本:Bouncy Castle 主要提供 Java 和 C# 两个版本,方便在 Java 和 .NET 平台上进行密码学开发。
⚝ PKI 支持:Bouncy Castle 提供了全面的 PKI 支持,包括 X.509 证书生成、解析、验证,证书吊销列表 (CRL) 处理,以及 OCSP (Online Certificate Status Protocol 在线证书状态协议) 支持等。
⚝ JCA/JCE 兼容 (Java 版本):Bouncy Castle 的 Java 版本可以作为 Java Cryptography Architecture (JCA Java密码体系结构) 和 Java Cryptography Extension (JCE Java密码扩展) 的提供者 (Provider) 集成到 Java 平台中,方便在 Java 应用中使用。
⚝ 灵活性和可配置性:Bouncy Castle 提供了灵活的 API 和配置选项,可以根据需求选择和配置不同的算法和参数。
⚝ 开源和社区支持:Bouncy Castle 是一个开源项目,拥有活跃的社区支持,代码质量较高,并持续更新和维护。
② Bouncy Castle 的常用功能 (Java 版本为例)
⚝ 对称加密与解密:Bouncy Castle 提供了多种对称加密算法的实现,例如 AES, DES, 3DES, Blowfish, ChaCha20 等。可以使用 javax.crypto.Cipher
类进行对称加解密操作。Bouncy Castle 提供了各种模式 (如 CBC, CTR, GCM) 和填充方式 (如 PKCS#5, NoPadding) 的支持。
⚝ 非对称加密与解密:支持 RSA, DSA, ECC 等非对称加密算法。可以使用 java.security.KeyPairGenerator
, java.security.KeyFactory
, javax.crypto.Cipher
等类进行非对称加解密操作。Bouncy Castle 提供了对各种密钥格式 (如 PKCS#1, PKCS#8, SubjectPublicKeyInfo) 的支持。
⚝ 哈希计算:提供了多种哈希算法的实现,例如 MD5, SHA-1, SHA-256, SHA-512, BLAKE2b 等。可以使用 java.security.MessageDigest
类计算哈希值。
⚝ 数字签名与验证:支持 RSA, DSA, ECDSA, EdDSA 等数字签名算法。可以使用 java.security.Signature
类进行数字签名和验证操作。
⚝ 消息认证码 (MAC):提供了 HMAC (Hash-based Message Authentication Code 基于哈希函数的消息认证码), CMAC (Cipher-based Message Authentication Code 基于密码分组的消息认证码) 等消息认证码算法的实现。可以使用 javax.crypto.Mac
类计算 MAC 值。
⚝ 密钥生成与管理:Bouncy Castle 提供了密钥生成器 (KeyGenerator), 密钥工厂 (KeyFactory), 密钥对生成器 (KeyPairGenerator) 等类,用于生成和管理各种类型的密钥。
⚝ PKI 功能:Bouncy Castle 提供了丰富的 PKI 功能,包括 X.509 证书生成器 (X509CertificateBuilder), 证书解析器 (X509CertificateParser), 证书验证器 (CertPathValidator), CRL 解析器 (X509CRLParser), OCSP 客户端 (OCSPReq, OCSPResp) 等类,用于构建和管理 PKI 系统。
③ Bouncy Castle 使用示例 (Java)
1
import org.bouncycastle.jce.provider.BouncyCastleProvider;
2
import javax.crypto.Cipher;
3
import javax.crypto.KeyGenerator;
4
import javax.crypto.SecretKey;
5
import javax.crypto.spec.IvParameterSpec;
6
import java.security.Security;
7
8
public class AESEncryptionExample {
9
public static void main(String[] args) throws Exception {
10
Security.addProvider(new BouncyCastleProvider()); // 注册 Bouncy Castle Provider
11
12
String plaintext = "Hello, Bouncy Castle!";
13
byte[] keyBytes = new byte[32]; // 256-bit AES key
14
byte[] ivBytes = new byte[16]; // 16-byte IV
15
16
// 生成 AES 密钥
17
KeyGenerator keyGen = KeyGenerator.getInstance("AES", "BC");
18
keyGen.init(256);
19
SecretKey secretKey = keyGen.generateKey();
20
keyBytes = secretKey.getEncoded();
21
22
// 生成随机 IV
23
java.security.SecureRandom random = new java.security.SecureRandom();
24
random.nextBytes(ivBytes);
25
IvParameterSpec iv = new IvParameterSpec(ivBytes);
26
27
// 使用 AES/CBC/PKCS5Padding 加密
28
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding", "BC");
29
cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
30
byte[] ciphertext = cipher.doFinal(plaintext.getBytes("UTF-8"));
31
32
System.out.println("Ciphertext: " + bytesToHex(ciphertext));
33
34
// 解密
35
cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
36
byte[] decryptedtext = cipher.doFinal(ciphertext);
37
System.out.println("Decrypted text: " + new String(decryptedtext, "UTF-8"));
38
}
39
40
private static String bytesToHex(byte[] bytes) {
41
StringBuilder sb = new StringBuilder();
42
for (byte b : bytes) {
43
sb.append(String.format("%02x", b));
44
}
45
return sb.toString();
46
}
47
}
这个示例演示了使用 Bouncy Castle Java 库进行 AES/CBC/PKCS5Padding 对称加密和解密的过程。代码首先注册 Bouncy Castle Provider,然后生成 AES 密钥和随机 IV。接着,使用 javax.crypto.Cipher
类进行加密和解密操作。
④ Bouncy Castle 使用注意事项
⚝ Provider 注册 (Java):在 Java 环境中使用 Bouncy Castle 时,通常需要将其注册为 JCA/JCE Provider,才能方便地使用 Bouncy Castle 提供的算法实现。可以使用 Security.addProvider(new BouncyCastleProvider())
注册。
⚝ API 选择:Bouncy Castle 提供了丰富的 API,需要根据具体需求选择合适的类和方法。阅读 Bouncy Castle 的文档和示例代码可以帮助理解 API 的使用方式。
⚝ 配置选项:Bouncy Castle 提供了许多配置选项,例如算法参数、密钥格式、证书类型等。需要根据实际需求进行配置。
⚝ 性能考虑:Bouncy Castle 的性能在不同算法和配置下可能有所差异。在性能敏感的应用中,需要进行性能测试和优化。
⚝ 版本兼容性:Bouncy Castle 有多个版本,不同版本之间可能存在 API 兼容性问题。选择合适的版本,并注意版本更新和迁移。
11.2 安全随机数生成 (Secure Random Number Generation)
随机数在密码学中扮演着至关重要的角色。密钥生成、nonce 生成、盐值 (salt) 生成、以及各种密码协议都需要高质量的随机数。如果随机数生成器 (RNG) 的质量不高,或者使用不当,可能会导致严重的安全性问题。安全随机数生成 (Secure Random Number Generation) 的目标是生成不可预测、统计特性良好的随机数,以满足密码学应用的需求。
① 随机数生成器的类型
⚝ 伪随机数生成器 (PRNG - Pseudo-Random Number Generator):PRNG 是一种确定性算法,它从一个初始值(种子 - seed)开始,通过一系列运算生成看似随机的数字序列。由于 PRNG 是确定性的,只要种子相同,生成的随机数序列就完全相同。PRNG 的优点是生成速度快,可重复性好。但是,如果种子泄露或者可预测,那么生成的随机数序列也就失去了随机性。
⚝ 密码学安全伪随机数生成器 (CSPRNG - Cryptographically Secure Pseudo-Random Number Generator):CSPRNG 是一种特殊的 PRNG,它在设计上满足密码学安全需求。CSPRNG 除了要具有良好的统计特性外,更重要的是要具有不可预测性。即使攻击者知道 CSPRNG 的输出序列的一部分,也无法有效地预测后续的输出。CSPRNG 通常会使用熵源 (entropy source) 收集环境噪声,例如硬件噪声、系统时间、用户输入等,作为种子或定期注入到生成过程中,以增加随机性。
⚝ 硬件随机数生成器 (HRNG - Hardware Random Number Generator):HRNG 利用物理过程中的随机现象(例如热噪声、放射性衰变、量子效应等)来生成随机数。HRNG 生成的随机数具有真正的随机性,不依赖于算法和种子。HRNG 的优点是随机性高,安全性好。缺点是生成速度可能较慢,成本较高,并且可能受到环境因素的影响。
② 安全随机数生成的要求
⚝ 不可预测性 (Unpredictability):对于 CSPRNG 和 HRNG,最基本的要求是不可预测性。即在不知道内部状态的情况下,无法有效地预测后续生成的随机数。即使攻击者获取了部分输出序列,也无法预测未来的输出。
⚝ 统计特性良好 (Good Statistical Properties):生成的随机数序列应具有良好的统计特性,例如均匀分布、独立性等。可以通过各种统计测试(例如 Dieharder, NIST STS)来评估随机数序列的统计特性。
⚝ 抗种子泄露 (Seed Resistance):对于 CSPRNG,即使种子泄露,也应该保证在一段时间内的安全性。CSPRNG 应该具有抵抗 “状态泄露前向安全性 (forward secrecy)” 的能力,即即使当前状态被泄露,也不会影响之前生成的随机数的安全性。
⚝ 抗逆向工程 (Reverse Engineering Resistance):CSPRNG 的算法和实现应该具有一定的抗逆向工程能力,防止攻击者通过分析算法和实现来预测随机数。
⚝ 性能 (Performance):在满足安全性的前提下,随机数生成器应该具有足够的性能,以满足应用的需求。
③ 常用的 CSPRNG
⚝ /dev/random 和 /dev/urandom (Linux):在 Linux 系统中,/dev/random
和 /dev/urandom
是两个常用的 CSPRNG 接口。它们都从系统环境噪声中收集熵,并生成随机数。
▮▮▮▮⚝ /dev/random
:当熵池 (entropy pool) 中的熵不足时,/dev/random
会阻塞 (block) 读取操作,直到收集到足够的熵。因此,/dev/random
提供的随机数质量较高,但生成速度可能较慢。
▮▮▮▮⚝ /dev/urandom
:/dev/urandom
不会阻塞读取操作,即使熵池中的熵不足,也会继续生成随机数。当熵池中的熵耗尽时,/dev/urandom
的安全性可能会降低。但在大多数情况下,/dev/urandom
提供的随机数质量已经足够高,并且性能更好,因此更常用。
⚝ Windows CryptGenRandom (Windows):Windows 系统提供了 CryptGenRandom
API,用于生成密码学安全的随机数。CryptGenRandom
使用操作系统的熵源,并经过了安全审计。
⚝ arc4random (BSD, macOS, iOS):在 BSD 系统(包括 macOS 和 iOS)中,arc4random
是一系列用于生成随机数的函数。arc4random
基于 ChaCha20 算法,并从系统熵源获取种子。
⚝ Fortuna 和 Yarrow:Fortuna 和 Yarrow 是两种著名的 CSPRNG 算法设计。它们都采用了复杂的熵收集和混合机制,以及周期性的重新播种 (reseeding) 策略,以提高安全性和抗攻击能力。许多操作系统和密码学库都采用了基于 Fortuna 或 Yarrow 算法的 CSPRNG 实现。
④ 安全随机数生成最佳实践
⚝ 使用操作系统提供的 CSPRNG 接口:优先使用操作系统提供的 CSPRNG 接口,例如 /dev/urandom
(Linux), CryptGenRandom
(Windows), arc4random
(BSD, macOS, iOS)。这些接口通常经过了安全审计和优化,并且能够利用系统底层的熵源。
⚝ 避免使用 PRNG 作为 CSPRNG:不要使用普通的 PRNG(例如 rand()
, srand()
等 C 标准库函数)来生成密码学相关的随机数。这些 PRNG 通常不满足密码学安全要求,容易被预测。
⚝ 正确播种 CSPRNG:如果需要手动播种 CSPRNG,务必使用高质量的熵源作为种子。可以使用操作系统提供的熵源接口,或者使用 HRNG 生成的随机数作为种子。避免使用固定值或可预测的值作为种子。
⚝ 定期重新播种 CSPRNG:对于长时间运行的 CSPRNG,应该定期重新播种,以增加随机性,并抵抗状态泄露攻击。重新播种的频率取决于具体的应用场景和安全需求。
⚝ 限制随机数的使用范围:生成的随机数应该只用于预期的目的。例如,用于生成密钥的随机数不应该用于生成 nonce。避免随机数重用,特别是在 nonce 和盐值等场景中。
⚝ 进行随机数质量测试:对于安全性要求较高的应用,应该对使用的 CSPRNG 进行随机数质量测试,例如使用 Dieharder, NIST STS 等测试套件,评估其统计特性和不可预测性。
11.3 密钥管理最佳实践 (Key Management Best Practices)
密钥管理 (Key Management) 是密码学应用中至关重要的一环。密钥的安全性直接关系到整个密码系统的安全性。密钥管理涵盖了密钥的整个生命周期,包括密钥的生成、存储、分发、使用、轮换、备份、恢复和销毁等环节。良好的密钥管理实践可以有效地保护密钥的机密性、完整性和可用性,降低密钥泄露和滥用的风险。
① 密钥生命周期管理
⚝ 密钥生成 (Key Generation):密钥生成是密钥生命周期的起点。密钥生成过程必须使用安全的随机数生成器,确保生成的密钥具有足够的随机性和不可预测性。密钥的类型和长度应根据所使用的密码算法和安全需求选择。例如,AES-256 密钥长度为 256 位,RSA 密钥长度通常为 2048 位或更高。
⚝ 密钥存储 (Key Storage):密钥存储是指将生成的密钥安全地保存起来。密钥存储方式的选择取决于密钥的类型、用途和安全需求。常见的密钥存储方式包括:
▮▮▮▮⚝ 软件存储:将密钥存储在文件系统、数据库或应用程序的配置中。软件存储的优点是成本较低,易于实现。缺点是安全性相对较低,容易受到恶意软件和攻击者的窃取。对于软件存储的密钥,应采取加密保护措施,例如使用密钥加密密钥 (KEK - Key Encrypting Key) 对密钥进行加密存储。
▮▮▮▮⚝ 硬件存储:将密钥存储在专用的硬件设备中,例如硬件安全模块 (HSM - Hardware Security Module), 智能卡 (Smart Card), USB 令牌 (USB Token), 安全元件 (Secure Element) 等。硬件存储的优点是安全性高,密钥受到硬件的保护,难以被窃取和篡改。缺点是成本较高,部署和管理相对复杂。
▮▮▮▮⚝ 密钥管理系统 (KMS - Key Management System):KMS 是一种集中化的密钥管理解决方案,用于统一管理组织内的所有密钥。KMS 通常提供密钥生成、存储、分发、轮换、备份、恢复、审计等功能,并支持多种密钥存储方式(包括软件和硬件存储)。KMS 可以提高密钥管理的效率和安全性,降低管理成本。
⚝ 密钥分发 (Key Distribution):密钥分发是指将密钥安全地传递给需要使用密钥的实体。密钥分发的方式取决于密钥的类型和使用场景。常见的密钥分发方式包括:
▮▮▮▮⚝ 手动分发:通过人工方式传递密钥,例如通过安全信道传递密钥文件,或者通过电话、邮件等方式传递密钥信息。手动分发的优点是简单易行,适用于小规模的密钥分发场景。缺点是效率较低,容易出错,安全性较差。
▮▮▮▮⚝ 密钥协商协议:使用密钥协商协议 (Key Exchange Protocol) 在通信双方之间安全地协商生成共享密钥,例如 Diffie-Hellman 密钥交换, ECDH 密钥交换等。密钥协商协议的优点是自动化程度高,安全性较好。缺点是需要通信双方在线交互。
▮▮▮▮⚝ 密钥传输协议:使用密钥传输协议 (Key Transport Protocol) 将密钥安全地加密传输给接收方,例如 RSA 密钥传输, 基于公钥加密的密钥传输等。密钥传输协议的优点是适用于离线密钥分发场景。缺点是需要预先分发公钥。
▮▮▮▮⚝ 密钥托管 (Key Escrow):将密钥备份托管给可信的第三方机构。在密钥丢失或需要恢复时,可以从托管机构获取密钥。密钥托管适用于密钥恢复和灾难恢复场景。但需要谨慎选择托管机构,并确保托管过程的安全性。
⚝ 密钥使用 (Key Usage):密钥使用是指在密码操作中使用密钥。密钥使用应遵循最小权限原则,只在必要时使用密钥,并限制密钥的使用范围和权限。例如,用于加密的密钥不应该用于签名,用于数据加密的密钥不应该用于密钥加密。
⚝ 密钥轮换 (Key Rotation):密钥轮换是指定期更换密钥。密钥轮换可以降低密钥泄露的风险,限制密钥泄露的影响范围。密钥轮换的频率取决于密钥的类型、用途和安全风险评估。例如,会话密钥 (session key) 通常需要频繁轮换,而长期使用的密钥 (例如根密钥 - root key) 可以较长时间轮换一次。
⚝ 密钥备份与恢复 (Key Backup and Recovery):密钥备份是指将密钥安全地备份起来,以防止密钥丢失或损坏。密钥备份应采取加密保护措施,并存储在安全的地方。密钥恢复是指在密钥丢失或损坏时,从备份中恢复密钥。密钥备份和恢复是保证密钥可用性的重要措施。
⚝ 密钥销毁 (Key Destruction):密钥销毁是指在密钥不再需要使用时,安全地销毁密钥,防止密钥泄露和滥用。密钥销毁的方法取决于密钥的存储介质。对于软件存储的密钥,可以使用安全擦除 (secure erase) 工具覆盖密钥数据。对于硬件存储的密钥,可以使用物理销毁 (physical destruction) 方法,例如粉碎、熔化等。
② 密钥管理最佳实践
⚝ 采用分层密钥体系 (Hierarchical Key System):使用分层密钥体系,将密钥分为不同层次,不同层次的密钥承担不同的功能。例如,可以使用根密钥 (root key) 加密密钥加密密钥 (KEK),使用 KEK 加密数据加密密钥 (DEK - Data Encryption Key),使用 DEK 加密数据。分层密钥体系可以提高密钥管理的灵活性和安全性。
⚝ 最小权限原则 (Principle of Least Privilege):密钥的使用应遵循最小权限原则,只授予用户和应用程序必要的密钥访问权限。避免过度授权,降低密钥滥用的风险。
⚝ 职责分离 (Separation of Duties):密钥管理的关键操作(例如密钥生成、密钥分发、密钥备份、密钥销毁)应由不同的角色或人员负责,实现职责分离,防止单点故障和内部人员作恶。
⚝ 安全审计 (Security Audit):建立完善的密钥管理审计机制,记录密钥的生成、存储、分发、使用、轮换、备份、恢复和销毁等操作日志。定期审计密钥管理操作日志,及时发现和处理异常行为。
⚝ 物理安全 (Physical Security):对于硬件存储的密钥,需要加强物理安全保护,防止硬件设备被盗窃、破坏或非法访问。例如,将 HSM 放置在安全机房,限制访问权限,安装监控设备等。
⚝ 人员安全 (Personnel Security):对参与密钥管理的人员进行安全背景审查和安全培训,提高人员的安全意识和技能。签订保密协议,约束人员的行为。
⚝ 定期安全评估 (Regular Security Assessment):定期对密钥管理系统和流程进行安全评估,识别安全漏洞和风险,并及时采取改进措施。
11.4 密码学在软件开发中的应用 (Cryptography in Software Development)
密码学在软件开发中扮演着至关重要的角色。从保护用户数据隐私,到确保数据传输安全,再到验证软件的完整性和来源,密码学技术都发挥着关键作用。在软件开发的不同阶段和层面,都需要考虑如何有效地应用密码学技术,构建安全的软件系统。
① 软件开发中的密码学应用场景
⚝ 数据加密存储 (Data Encryption at Rest):对存储在磁盘、数据库或其他存储介质上的敏感数据进行加密,防止数据泄露。例如,可以使用全盘加密 (Full Disk Encryption), 数据库加密 (Database Encryption), 文件系统加密 (File System Encryption) 等技术。
⚝ 数据传输加密 (Data Encryption in Transit):对在网络上传输的数据进行加密,防止数据在传输过程中被窃听和篡改。例如,可以使用 TLS/SSL 协议保护 Web 应用的通信安全,使用 SSH 协议保护远程登录和文件传输安全,使用 VPN (Virtual Private Network 虚拟专用网络) 保护整个网络连接的安全。
⚝ 用户身份认证 (User Authentication):使用密码学技术验证用户身份,防止非法用户访问系统和数据。例如,可以使用基于密码的身份认证 (Password-based Authentication), 基于双因素认证 (Two-Factor Authentication), 基于证书的身份认证 (Certificate-based Authentication) 等技术。
⚝ 数据完整性校验 (Data Integrity Check):使用哈希函数和消息认证码 (MAC) 校验数据的完整性,防止数据被篡改。例如,可以使用哈希函数计算文件或数据的哈希值,并与预先计算的哈希值进行比较,验证数据是否被修改。可以使用 MAC 算法对数据进行认证,确保数据来源的可靠性和完整性。
⚝ 数字签名 (Digital Signature):使用数字签名技术对软件代码、文档或消息进行签名,验证软件的来源和完整性,防止软件被篡改和伪造。例如,可以使用代码签名 (Code Signing) 技术对软件安装包和可执行文件进行签名,确保用户下载和安装的软件是来自可信的开发者,并且没有被恶意修改。
⚝ 安全随机数生成 (Secure Random Number Generation):在软件开发中,需要使用安全随机数生成器生成密钥、nonce, 盐值等密码学参数。确保生成的随机数具有足够的随机性和不可预测性。
⚝ 密钥管理 (Key Management):在软件开发中,需要妥善管理密钥,包括密钥的生成、存储、分发、使用、轮换和销毁等环节。确保密钥的安全性,防止密钥泄露和滥用。
② 软件开发中的密码学最佳实践
⚝ 安全设计 (Security by Design):在软件开发的早期阶段,就应该将安全考虑纳入设计之中。进行威胁建模 (Threat Modeling), 识别安全风险,并选择合适的密码学技术来缓解风险。
⚝ 使用成熟的密码学库:避免自行实现密码算法,而是使用成熟、经过广泛测试和审计的密码学库,例如 OpenSSL, Libsodium, Bouncy Castle 等。这些库提供了各种预先构建的密码学函数和协议,可以帮助开发者快速、安全地构建密码学应用。
⚝ 遵循密码学最佳实践:遵循密码学最佳实践,例如使用安全的默认配置,避免使用过时或安全性较弱的算法,正确管理密钥和 nonce, 防止侧信道攻击等。
⚝ 安全编码 (Secure Coding):编写安全的代码,避免常见的安全漏洞,例如缓冲区溢出 (Buffer Overflow), 跨站脚本攻击 (Cross-Site Scripting), SQL 注入 (SQL Injection) 等。特别是在处理用户输入和外部数据时,要进行严格的输入验证和输出编码。
⚝ 代码审查 (Code Review):进行代码审查,由安全专家或经验丰富的开发者对代码进行安全审查,发现潜在的安全漏洞和密码学误用。
⚝ 安全测试 (Security Testing):进行安全测试,包括渗透测试 (Penetration Testing), 漏洞扫描 (Vulnerability Scanning), 模糊测试 (Fuzzing) 等,评估软件的安全性,发现和修复安全漏洞。
⚝ 持续安全监控 (Continuous Security Monitoring):部署安全监控系统,实时监控软件系统的安全状态,及时发现和响应安全事件。
⚝ 安全更新和维护 (Security Update and Maintenance):及时发布安全更新,修复已知的安全漏洞。定期维护软件系统,保持安全配置和安全措施的有效性。
③ 常见的密码学软件开发陷阱
⚝ 使用弱密码算法或配置:例如使用 DES, MD5, SHA-1 等过时或安全性较弱的算法,或者使用不安全的密码模式和参数配置。
⚝ 密钥硬编码 (Hardcoded Keys):将密钥直接硬编码在源代码或配置文件中。这种做法非常危险,密钥容易被泄露。
⚝ 密钥存储不安全:将密钥以明文形式存储在文件系统、数据库或应用程序的配置中。或者使用弱加密算法保护密钥。
⚝ 随机数生成不安全:使用不安全的随机数生成器生成密钥、nonce, 盐值等密码学参数。或者没有正确播种 CSPRNG。
⚝ 密码协议实现错误:在实现密码协议时,容易出现各种错误,例如协议逻辑错误、状态管理错误、消息处理错误等。这些错误可能导致协议的安全性被破坏。
⚝ 侧信道攻击漏洞:软件实现可能存在侧信道攻击漏洞,例如时间攻击 (Timing Attack), 功耗分析 (Power Analysis), 电磁辐射分析 (Electromagnetic Radiation Analysis) 等。攻击者可以通过分析软件运行时的侧信道信息,获取密钥或其他敏感信息。
⚝ 缺乏安全意识和培训:开发团队缺乏安全意识和密码学知识,容易犯一些低级错误,导致安全漏洞。
11.5 密码学硬件加速 (Cryptography Hardware Acceleration)
密码学运算,特别是公钥密码算法和哈希函数,通常计算量较大,会消耗大量的 CPU 资源,影响系统性能。密码学硬件加速 (Cryptography Hardware Acceleration) 是指使用专用的硬件设备或指令集来加速密码学运算,提高密码运算的性能和效率。
① 硬件加速的优势
⚝ 性能提升 (Performance Improvement):硬件加速可以显著提高密码运算的性能。专用的硬件设备通常采用优化的算法实现和并行处理架构,可以比软件实现快几个数量级。
⚝ 降低 CPU 负载 (Reduced CPU Load):将密码运算卸载到硬件设备上,可以降低 CPU 的负载,释放 CPU 资源用于其他任务,提高系统的整体性能和响应速度。
⚝ 安全性增强 (Enhanced Security):硬件安全模块 (HSM) 等硬件设备可以提供更高的安全性。密钥可以存储在 HSM 的安全存储区内,受到硬件的保护,难以被窃取和篡改。硬件加速还可以提供抗侧信道攻击的能力。
⚝ 能效比提高 (Improved Energy Efficiency):专用的硬件设备通常比通用 CPU 更节能。使用硬件加速可以降低功耗,延长电池续航时间,特别是在移动设备和嵌入式系统中。
② 硬件加速的类型
⚝ 专用密码处理器 (Dedicated Crypto Processor):专用密码处理器是一种专门设计用于执行密码学运算的芯片。它通常集成了多种密码算法的硬件实现,例如对称加密算法 (AES, DES, 3DES), 非对称加密算法 (RSA, ECC), 哈希函数 (SHA-256, SHA-512) 等。专用密码处理器可以提供高性能的密码运算能力,并具有较高的安全性。例如,HSM 通常会使用专用密码处理器。
⚝ 密码学指令集扩展 (Cryptographic Instruction Set Extensions):现代 CPU 通常会提供密码学指令集扩展,例如 Intel AES-NI (Advanced Encryption Standard New Instructions), ARM Crypto Extensions, VIA PadLock 等。这些指令集扩展在 CPU 内部增加了硬件实现的密码算法指令,可以加速特定的密码运算。例如,AES-NI 指令集可以加速 AES 加密和解密运算。
⚝ 现场可编程门阵列 (FPGA - Field-Programmable Gate Array):FPGA 是一种可编程的硬件芯片,可以根据需要配置成各种数字电路。可以使用 FPGA 实现自定义的密码算法硬件加速器。FPGA 的优点是灵活性高,可以实现各种复杂的密码算法和协议。缺点是开发难度较高,性能和效率可能不如专用密码处理器。
⚝ 专用集成电路 (ASIC - Application-Specific Integrated Circuit):ASIC 是一种为特定应用定制设计的集成电路。可以设计 ASIC 芯片来实现特定的密码算法硬件加速。ASIC 的优点是性能和效率最高,功耗最低。缺点是开发成本高,灵活性差,一旦设计完成,功能难以更改。
③ 硬件加速的应用场景
⚝ TLS/SSL 卸载 (TLS/SSL Offloading):在 Web 服务器、负载均衡器、VPN 网关等网络设备中,TLS/SSL 协议的握手和加密解密运算会消耗大量的 CPU 资源。使用硬件加速卡 (例如 TLS/SSL 加速卡) 可以将 TLS/SSL 运算卸载到硬件上,提高网络设备的性能和吞吐量。
⚝ VPN 加速 (VPN Acceleration):VPN 网关需要进行大量的加密和解密运算,以保护 VPN 通道的安全。使用硬件加速可以提高 VPN 网关的性能,支持更多的并发连接和更高的带宽。
⚝ 数据库加密加速 (Database Encryption Acceleration):在数据库系统中,对敏感数据进行加密存储和查询会增加数据库的负载。使用硬件加速可以加速数据库加密和解密运算,提高数据库的性能。
⚝ 存储加密加速 (Storage Encryption Acceleration):在存储系统中,对数据进行加密存储可以保护数据的机密性。使用硬件加速可以加速存储加密和解密运算,提高存储系统的性能。
⚝ 区块链加速 (Blockchain Acceleration):区块链技术中,哈希运算和数字签名运算是核心操作。使用硬件加速可以加速区块链节点的交易处理速度和区块生成速度。
⚝ 嵌入式系统密码加速 (Embedded System Crypto Acceleration):在资源受限的嵌入式系统中,密码运算的性能和功耗非常重要。使用硬件加速可以提高嵌入式系统的密码运算性能,并降低功耗。例如,智能卡、物联网设备、移动支付终端等。
④ 硬件加速的选择和使用
⚝ 评估性能需求:在选择硬件加速方案之前,需要评估应用的性能需求,确定需要加速的密码算法和运算类型,以及所需的性能指标。
⚝ 选择合适的硬件加速方案:根据性能需求、成本预算、安全要求和开发难度等因素,选择合适的硬件加速方案。例如,对于高性能需求的应用,可以考虑使用专用密码处理器或 ASIC。对于灵活性需求较高的应用,可以考虑使用 FPGA。对于只需要加速特定算法的应用,可以考虑使用 CPU 的指令集扩展。
⚝ 软件集成:硬件加速器通常需要通过驱动程序或 API 与软件系统集成。需要选择易于集成、提供完善文档和示例代码的硬件加速方案。
⚝ 安全考虑:硬件加速器也可能存在安全漏洞。需要选择经过安全认证和评估的硬件加速方案,并采取必要的安全措施,例如固件更新、安全配置等。
⚝ 成本效益分析:硬件加速的成本包括硬件设备的采购成本、开发成本、集成成本和维护成本等。需要进行成本效益分析,评估硬件加速是否能够带来足够的性能提升和安全收益,并与软件实现方案进行比较。
12. chapter 12: 密码学的未来趋势与展望 (Future Trends and Prospects of Cryptography)
12.1 量子计算对密码学的影响 (Impact of Quantum Computing on Cryptography)
量子计算 (Quantum Computing) 的发展是密码学领域当前和未来面临的最重大挑战之一。与经典计算机使用比特 (bit) 表示 0 或 1 不同,量子计算机利用量子比特 (qubit),它可以同时处于 0 和 1 的叠加态。这种叠加态以及量子纠缠 (quantum entanglement) 等现象,使得量子计算机在处理某些特定类型的计算问题时,拥有超越经典计算机的强大能力。然而,这种能力也对当前广泛使用的密码体系构成了潜在威胁。
① 量子计算的威胁:
⚝ Shor 算法:由 Peter Shor 提出的 Shor 算法,是一种可以在量子计算机上高效分解大整数质因数的算法。RSA 算法、Diffie-Hellman 密钥交换以及椭圆曲线密码学 (ECC) 等公钥密码体系的安全性,都依赖于大整数分解或离散对数问题的计算 сложность (computational complexity)。一旦量子计算机足够强大,Shor 算法将能够快速破解这些密码体系,从而威胁到当前互联网通信、数据存储和数字签名等安全应用的基础。
⚝ Grover 算法:Grover 算法是一种量子搜索算法,虽然它不像 Shor 算法那样具有颠覆性,但它能够加速暴力破解密钥的速度。对于对称密钥密码学,Grover 算法可以将密钥的有效长度缩减一半。例如,对于 128 位的 AES 密钥,Grover 算法的攻击复杂度相当于经典计算机上的 264 次操作,虽然仍然具有一定的安全性,但相比于理论上的 2128 安全强度有所降低。
② 密码学应对量子计算的策略:
⚝ 后量子密码学 (Post-Quantum Cryptography):为了应对量子计算的威胁,密码学界正在积极研究和发展后量子密码学。后量子密码学旨在设计新的密码算法,这些算法在经典计算机上是安全的,并且被认为能够抵抗量子计算机的攻击。目前,有几种主要的后量子密码学方向正在研究中,包括:
▮▮▮▮ⓐ 格密码 (Lattice-based Cryptography):格密码是基于格 (lattice) 上数学难题的密码学方案。格密码被认为是抵抗量子计算攻击最有希望的方向之一,其安全性基于一些经过长期研究的格难题,例如最短向量问题 (Shortest Vector Problem, SVP) 和最近向量问题 (Closest Vector Problem, CVP)。NTRU、CRYSTALS-Kyber 和 CRYSTALS-Dilithium 等算法都属于格密码范畴。
▮▮▮▮ⓑ 编码密码 (Code-based Cryptography):编码密码基于纠错码理论中的难题,例如 синдром декодирования (syndrome decoding) 问题。经典 McEliece 算法是编码密码的代表,其安全性基于一般线性码的解码难题。
▮▮▮▮ⓒ 多变量密码 (Multivariate Cryptography):多变量密码基于有限域上多元多项式方程组的求解难题。Rainbow 签名方案是多变量密码的典型例子。
▮▮▮▮ⓓ 哈希密码 (Hash-based Cryptography):哈希密码主要依赖于安全哈希函数的性质。Merkle 签名树和 SPHINCS+ 签名方案是哈希密码的代表。哈希密码的优势在于其安全性相对容易理解和分析,并且通常具有较小的密钥尺寸。
⚝ 混合密码系统 (Hybrid Cryptosystems):在后量子密码学算法成熟和广泛部署之前,一种过渡方案是采用混合密码系统。混合密码系统将传统的、抗经典攻击的密码算法与后量子密码算法结合使用,以提供双重安全保障。例如,在 TLS/SSL 协议中,可以同时协商传统的密钥交换算法(如 ECDH)和后量子密钥交换算法(如 CRYSTALS-Kyber),从而在量子计算机出现之前提供向后兼容性,并在量子计算机出现后提供抗量子攻击能力。
③ 量子密钥分发 (Quantum Key Distribution, QKD):量子密钥分发是一种利用量子力学原理实现安全密钥分发的技术。QKD 的安全性基于量子力学的基本定律,例如海森堡不确定性原理 (Heisenberg uncertainty principle) 和量子不可克隆定理 (no-cloning theorem)。BB84 协议和 E91 协议是两种经典的 QKD 协议。QKD 的优势在于其安全性是信息论安全的 (information-theoretically secure),即其安全性不依赖于计算 сложность 假设,即使攻击者拥有无限的计算能力也无法破解。然而,QKD 技术目前还面临着成本高昂、传输距离受限等挑战,距离大规模实际应用还有一段距离。
量子计算对密码学的影响是深远的,它既带来了严峻的挑战,也推动了密码学领域的创新和发展。后量子密码学和量子密钥分发等新兴技术,将是未来密码学研究的重要方向。
12.2 人工智能与密码学 (Artificial Intelligence and Cryptography)
人工智能 (Artificial Intelligence, AI) 的快速发展正在深刻地改变着各个领域,密码学也不例外。AI 技术,特别是机器学习 (Machine Learning, ML) 和深度学习 (Deep Learning, DL),正在从多个方面影响着密码学,既带来了新的机遇,也带来了新的挑战。
① AI 在密码分析中的应用:
⚝ 模式识别与自动化分析:机器学习算法,例如神经网络 (Neural Networks) 和支持向量机 (Support Vector Machines, SVM),在模式识别方面具有强大的能力。这些算法可以被应用于分析密码算法的输出、中间状态或侧信道信息 (side-channel information),以发现潜在的模式和漏洞,从而辅助密码分析。例如,深度学习模型已经被成功应用于分析分组密码的差分特征 (differential characteristics) 和线性特征 (linear characteristics),以及攻击流密码的密钥流生成器。
⚝ 自适应攻击策略:传统的密码分析方法通常需要人工设计和调整攻击策略。AI 技术可以帮助自动化这个过程,通过强化学习 (Reinforcement Learning, RL) 等方法,训练 AI 智能体 (agent) 学习最优的攻击策略,并根据密码算法的反馈进行自适应调整,从而提高密码分析的效率和成功率。
⚝ 侧信道攻击 (Side-channel Attacks) 与故障注入攻击 (Fault Injection Attacks):AI 技术可以用于分析和增强侧信道攻击和故障注入攻击。例如,深度学习模型可以用于处理和分析复杂的电磁辐射 (electromagnetic radiation) 或功耗 (power consumption) 侧信道信号,从而更有效地提取密钥信息。AI 也可以用于优化故障注入策略,提高故障注入攻击的精度和成功率。
② AI 在密码算法设计与应用中的应用:
⚝ 密码算法的自动化设计:AI 技术,特别是神经架构搜索 (Neural Architecture Search, NAS) 和遗传算法 (Genetic Algorithms, GA),可以用于自动化设计新的密码算法。通过定义密码算法的设计空间和安全目标,AI 算法可以搜索和优化密码算法的结构和参数,从而发现新的、高效且安全的密码算法。
⚝ 智能密钥管理 (Intelligent Key Management):密钥管理是密码学应用中的一个关键环节。AI 技术可以用于实现更智能化的密钥管理系统,例如,利用机器学习算法预测密钥的生命周期和使用模式,自动化密钥的生成、分发、存储和撤销,以及检测和响应密钥泄露事件。
⚝ 隐私保护机器学习 (Privacy-Preserving Machine Learning, PPML):在机器学习应用中,数据隐私保护变得越来越重要。密码学技术,例如同态加密 (Homomorphic Encryption)、安全多方计算 (Secure Multi-Party Computation, MPC) 和差分隐私 (Differential Privacy),可以与机器学习技术相结合,实现隐私保护机器学习。AI 技术也可以用于优化 PPML 方案的性能和效率。例如,AI 可以用于选择合适的同态加密方案参数,或者优化 MPC 协议的通信轮数。
③ AI 带来的密码学新挑战:
⚝ 对抗性机器学习 (Adversarial Machine Learning):机器学习模型容易受到对抗样本 (adversarial examples) 的攻击。对抗样本是指经过精心设计的输入样本,它们与正常样本非常相似,但可以导致机器学习模型产生错误的输出。在密码学领域,对抗样本可以被用于绕过基于机器学习的安全系统,例如入侵检测系统 (Intrusion Detection Systems, IDS) 和恶意软件检测系统 (Malware Detection Systems)。
⚝ 后门攻击 (Backdoor Attacks) 与模型投毒攻击 (Model Poisoning Attacks):机器学习模型可能被植入后门或被投毒攻击。后门攻击是指攻击者在机器学习模型中植入后门,使得模型在特定条件下产生攻击者期望的输出。模型投毒攻击是指攻击者通过篡改训练数据,使得训练出来的机器学习模型性能下降或产生偏差。这些攻击对基于机器学习的安全系统构成了潜在威胁。
⚝ AI 算法自身的安全性和可解释性:AI 算法,特别是深度学习模型,通常具有复杂的结构和大量的参数,其安全性和可解释性是一个挑战。如何验证 AI 算法的安全性,以及如何理解 AI 算法的决策过程,是密码学和 AI 领域共同面临的问题。
人工智能与密码学的交叉融合正在催生新的研究方向和应用场景。密码学家需要积极拥抱 AI 技术,利用 AI 提升密码分析和密码算法设计的能力,同时也要警惕 AI 带来的新的安全风险,并发展相应的防御技术。
12.3 隐私计算技术 (Privacy-preserving Computation Technologies)
随着数据价值的日益凸显和数据隐私保护意识的增强,隐私计算技术 (Privacy-preserving Computation Technologies) 逐渐成为密码学领域的研究热点。隐私计算技术旨在在保护数据隐私的前提下,实现数据的计算和分析,从而在数据可用不可见的情况下,充分发挥数据的价值。
① 隐私计算的核心技术:
⚝ 同态加密 (Homomorphic Encryption, HE):同态加密是一种特殊的加密技术,它允许在密文上直接进行计算,计算结果解密后与在明文上进行相同计算的结果一致。同态加密技术使得可以在不解密数据的情况下,对加密数据进行处理和分析,从而保护数据隐私。根据支持的运算类型,同态加密可以分为部分同态加密 (Partially Homomorphic Encryption, PHE)、半同态加密 (Somewhat Homomorphic Encryption, SHE) 和全同态加密 (Fully Homomorphic Encryption, FHE)。
⚝ 安全多方计算 (Secure Multi-Party Computation, MPC):安全多方计算是一种允许多方在不泄露各自私有数据的情况下,共同计算一个预定函数的技术。MPC 技术可以用于解决多方数据联合计算和分析的隐私保护问题。根据参与方的数量和计算模型的不同,MPC 可以分为两方计算 (Two-Party Computation, 2PC) 和多方计算 (Multi-Party Computation, MPC)。常见的 MPC 协议包括 Yao's garbled circuits, GMW 协议和 BGW 协议等。
⚝ 零知识证明 (Zero-Knowledge Proofs, ZKP):零知识证明是一种证明技术,它允许证明者 (prover) 在不泄露任何额外信息的情况下,向验证者 (verifier) 证明某个陈述是正确的。ZKP 技术可以用于实现身份认证、数据完整性验证和隐私保护的交易等应用。根据交互方式的不同,ZKP 可以分为交互式零知识证明 (Interactive Zero-Knowledge Proofs) 和非交互式零知识证明 (Non-Interactive Zero-Knowledge Proofs, NIZK)。
⚝ 差分隐私 (Differential Privacy, DP):差分隐私是一种数据脱敏技术,它通过在数据集中添加噪声,使得即使攻击者拥有辅助信息,也无法区分某个个体是否在数据集中,从而保护个体隐私。差分隐私常用于发布统计数据和进行数据分析,例如,在联邦学习 (Federated Learning) 中,可以使用差分隐私保护本地模型的梯度信息。
⚝ 联邦学习 (Federated Learning, FL):联邦学习是一种分布式机器学习框架,它允许多个参与方在本地训练模型,并将模型更新信息聚合到中心服务器,从而在不共享原始数据的情况下,共同训练一个全局模型。联邦学习可以与同态加密、差分隐私等隐私计算技术相结合,进一步增强数据隐私保护。
② 隐私计算的应用场景:
⚝ 金融领域:在金融领域,隐私计算可以用于实现安全的多方数据联合分析,例如,联合风控、反欺诈和信用评估。银行、保险公司和金融科技公司可以利用 MPC 技术,在不泄露用户敏感数据的情况下,共同分析用户行为和交易数据,提高风险识别和防范能力。
⚝ 医疗健康领域:在医疗健康领域,隐私计算可以用于实现医疗数据的安全共享和分析,例如,疾病预测、药物研发和个性化医疗。医院、研究机构和制药公司可以利用同态加密和联邦学习技术,在保护患者隐私的前提下,共同分析医疗数据,加速医学研究和临床应用。
⚝ 政务领域:在政务领域,隐私计算可以用于实现政务数据的安全共享和开放,例如,数据开放平台、智慧城市和公共安全。政府部门可以利用差分隐私和 MPC 技术,在保护公民隐私和国家安全的前提下,开放政务数据,促进数据驱动的政务服务和决策。
⚝ 互联网领域:在互联网领域,隐私计算可以用于实现用户数据的隐私保护和价值挖掘,例如,个性化推荐、精准营销和广告投放。互联网公司可以利用联邦学习和同态加密技术,在保护用户隐私的前提下,分析用户行为数据,提供更个性化的服务和产品。
③ 隐私计算的挑战与展望:
⚝ 性能与效率:隐私计算技术,特别是同态加密和安全多方计算,通常计算复杂度较高,性能和效率是其大规模应用的关键挑战。如何优化隐私计算协议的性能,降低计算和通信开销,是隐私计算研究的重要方向。
⚝ 标准化与互操作性:隐私计算领域缺乏统一的标准和规范,不同隐私计算技术和方案之间互操作性较差。推动隐私计算技术的标准化,制定统一的接口和协议,是促进隐私计算技术普及应用的重要举措。
⚝ 安全性与可证明安全性:隐私计算技术的安全性是其核心价值所在。如何严格证明隐私计算协议的安全性,抵抗各种可能的攻击,是隐私计算研究的根本任务。形式化验证 (Formal Verification) 和可证明安全 (Provable Security) 方法在隐私计算安全分析中发挥着重要作用。
⚝ 法律法规与伦理规范:隐私计算技术的应用涉及到数据隐私保护、数据安全和数据伦理等法律法规和伦理规范问题。如何平衡数据价值挖掘和数据隐私保护,制定合理的法律法规和伦理规范,是隐私计算健康发展的保障。
隐私计算技术是密码学领域近年来发展最迅速、最受关注的方向之一。随着数据要素市场的建立和完善,隐私计算技术将在数据安全流通和价值挖掘中发挥越来越重要的作用。
12.4 轻量级密码学 (Lightweight Cryptography)
在物联网 (Internet of Things, IoT)、移动设备和嵌入式系统等资源受限的环境中,传统的密码算法可能由于计算开销大、功耗高、内存占用多等原因而难以应用。轻量级密码学 (Lightweight Cryptography, LWC) 应运而生,它旨在设计和分析适用于资源受限环境的密码算法,满足这些环境下的安全需求。
① 轻量级密码算法的设计原则:
⚝ 低资源消耗:轻量级密码算法的首要设计目标是低资源消耗,包括低计算复杂度、低功耗、低内存占用和代码尺寸小。轻量级密码算法通常采用简单的运算操作,例如位运算、查表和简单的线性变换,以降低计算开销。
⚝ 高效率:在保证安全性的前提下,轻量级密码算法需要尽可能地提高加解密和密钥生成等操作的效率,以满足实时性和低延迟的应用需求。
⚝ 灵活性与可配置性:轻量级密码算法需要具有一定的灵活性和可配置性,以适应不同资源受限环境和应用场景的安全需求。例如,可以根据资源限制和安全需求,调整密钥长度、分组长度和算法参数。
⚝ 抗侧信道攻击能力:资源受限设备通常容易受到侧信道攻击,例如功耗分析攻击 (Power Analysis Attacks) 和电磁辐射分析攻击 (Electromagnetic Analysis Attacks)。轻量级密码算法需要考虑抗侧信道攻击的设计,例如采用掩码 (masking) 和隐藏 (hiding) 等技术,降低侧信道信息的泄露。
② 轻量级密码算法的分类:
⚝ 轻量级分组密码 (Lightweight Block Ciphers):轻量级分组密码是轻量级密码学中最主要的研究方向之一。许多轻量级分组密码算法被提出,例如:
▮▮▮▮ⓐ AES 变体:基于 AES 算法进行简化和优化的变体,例如 AES-128-Lite 和 Light-weight AES (LWAES)。这些变体通过减少轮数、简化 S盒 (S-box) 或使用更小的密钥长度,降低资源消耗。
▮▮▮▮ⓑ SPN 结构密码:基于 Substitution-Permutation Network (SPN) 结构的轻量级分组密码,例如 PRESENT, SKINNY, GIFT 和 SPARKLE。这些密码算法通常采用简单的 S盒和线性层,以及优化的密钥扩展方案。
▮▮▮▮ⓒ Feistel 结构密码:基于 Feistel 结构的轻量级分组密码,例如 CLEFIA, SIMON 和 SPECK。SIMON 和 SPECK 是由美国国家安全局 (NSA) 设计的轻量级分组密码,它们采用位切片 (bit-slice) 实现,具有较高的效率。
▮▮▮▮ⓓ ARX 结构密码:基于 Addition-Rotation-XOR (ARX) 结构的轻量级分组密码,例如 ChaCha20 和 LEA。ARX 结构密码只使用加法、循环移位和异或运算,易于硬件和软件实现,且具有较高的效率。
⚝ 轻量级流密码 (Lightweight Stream Ciphers):轻量级流密码的研究相对较少,但也有一些代表性的算法,例如 Grain, Trivium 和 eSTREAM 项目中的一些流密码算法。
⚝ 轻量级哈希函数 (Lightweight Hash Functions):轻量级哈希函数的设计目标是低资源消耗和高效率。一些轻量级哈希函数被提出,例如 PHOTON, SPONGENT 和 TinyJAMBU。
⚝ 轻量级消息认证码 (Lightweight Message Authentication Codes, MACs):轻量级 MAC 算法用于在资源受限环境下提供消息认证功能。基于分组密码的 CMAC 和基于哈希函数的 HMAC 都可以被认为是轻量级 MAC 算法。此外,还有一些专门为资源受限环境设计的轻量级 MAC 算法,例如 Chaskey 和 SipHash。
⚝ 轻量级公钥密码学 (Lightweight Public-key Cryptography):轻量级公钥密码学是轻量级密码学中一个具有挑战性的研究方向。传统的公钥密码算法,例如 RSA 和 ECC,计算开销较大,不适合资源受限环境。一些基于格密码和椭圆曲线密码的轻量级公钥密码算法被提出,例如 ECC-based signatures for constrained environments 和 lattice-based signatures for IoT devices。
③ 轻量级密码学的标准化与应用:
⚝ 标准化:国际标准化组织 (ISO) 和美国国家标准与技术研究院 (NIST) 等机构正在积极推动轻量级密码学的标准化工作。NIST 于 2018 年启动了轻量级密码算法标准化竞赛,旨在征集和评估适用于资源受限环境的密码算法。预计 NIST 将在未来几年内发布轻量级密码算法标准。
⚝ 应用场景:轻量级密码学在物联网、移动设备、嵌入式系统、智能卡、无线传感器网络 (Wireless Sensor Networks, WSNs) 和工业控制系统 (Industrial Control Systems, ICS) 等领域具有广泛的应用前景。例如,在物联网设备中,轻量级密码算法可以用于实现设备认证、数据加密和完整性保护。在移动支付和智能卡应用中,轻量级密码算法可以用于保护交易安全和用户隐私。
轻量级密码学是密码学领域一个充满活力和快速发展的分支。随着物联网和嵌入式技术的普及,轻量级密码学将在信息安全领域发挥越来越重要的作用。
12.5 密码学标准化与发展 (Cryptography Standardization and Development)
密码学标准化 (Cryptography Standardization) 在密码技术的发展和应用中起着至关重要的作用。密码学标准定义了密码算法、协议和安全实践的规范,确保了密码技术的互操作性、安全性和可靠性,促进了密码技术的广泛应用。
① 密码学标准化的重要性:
⚝ 互操作性 (Interoperability):密码学标准确保了不同厂商和不同系统之间密码技术的互操作性。例如,TLS/SSL 协议标准使得不同浏览器和服务器之间可以安全地建立连接,进行加密通信。密码学标准的互操作性促进了密码技术的普及应用,降低了集成和部署的成本。
⚝ 安全性 (Security):密码学标准通常经过严格的安全性评估和审查,确保了标准中密码算法和协议的安全性。密码学标准化的过程通常包括公开征集、专家评审、密码分析和测试等环节,以提高标准的安全性。遵循密码学标准可以降低安全风险,提高密码系统的整体安全性。
⚝ 可靠性 (Reliability):密码学标准化的过程通常包括详细的规范文档、测试用例和参考实现,确保了密码技术的可靠性和一致性。遵循密码学标准可以提高密码系统的稳定性和可靠性,降低故障率。
⚝ 促进创新 (Innovation):密码学标准化并非一成不变,而是随着密码技术的发展不断更新和演进。密码学标准化机构通常会定期评估和更新现有标准,并积极推动新技术的标准化。密码学标准化过程也为密码学研究人员和工程师提供了交流和合作的平台,促进了密码技术的创新和发展。
② 主要的密码学标准化组织:
⚝ 国际标准化组织 (International Organization for Standardization, ISO):ISO 是全球最大的国际标准化组织之一,其下属的 ISO/IEC JTC 1/SC 27 委员会专门负责信息安全、密码学和安全机制的标准化工作。ISO/IEC 18033 系列标准定义了对称密钥密码算法,ISO/IEC 9796 系列标准定义了数字签名方案,ISO/IEC 15408 (Common Criteria) 标准定义了信息技术安全评估准则。
⚝ 国际电信联盟 (International Telecommunication Union, ITU):ITU 是联合国负责信息通信技术的专门机构,其下属的 ITU-T SG17 研究组负责安全、密码学和隐私保护的标准化工作。ITU-T X.509 标准定义了公钥基础设施 (PKI) 和数字证书 (Digital Certificates)。
⚝ 互联网工程任务组 (Internet Engineering Task Force, IETF):IETF 是负责互联网标准制定的主要国际标准化组织。IETF 的许多 RFC 文档定义了互联网安全协议和密码技术标准,例如 TLS/SSL, IPsec, SSH 和 S/MIME。
⚝ 美国国家标准与技术研究院 (National Institute of Standards and Technology, NIST):NIST 是美国商务部下属的非监管机构,负责制定和发布美国国家标准。NIST 的密码学标准,例如 FIPS 140 系列 (Cryptographic Modules Validation Program), AES (FIPS 197), SHA-3 (FIPS 202) 和 SP 800 系列 (Special Publications),在美国和全球范围内被广泛采用。
⚝ 中国国家标准化管理委员会 (Standardization Administration of China, SAC):SAC 是中国负责标准化工作的政府机构。SAC 下属的全国信息安全标准化技术委员会 (TC260) 负责信息安全领域的国家标准制定工作。GM/T 系列标准是中国国家密码管理局 (SCA) 发布的密码行业标准,包括 SM2, SM3, SM4 等密码算法标准。
③ 密码学标准的发展趋势:
⚝ 后量子密码学标准化:随着量子计算威胁的日益临近,后量子密码学标准化成为当前密码学标准化的重要趋势。NIST 于 2016 年启动了后量子密码算法标准化竞赛,经过多轮评估和筛选,预计将在 2024 年左右发布首批后量子密码算法标准。ISO 和 IETF 等标准化组织也在积极开展后量子密码学标准化工作。
⚝ 隐私计算技术标准化:隐私计算技术是近年来兴起的热门领域,其标准化工作也在逐步推进。一些标准化组织正在开展隐私计算技术标准的研究和制定工作,例如,定义隐私计算术语、安全模型、评估方法和应用指南。
⚝ 轻量级密码学标准化:轻量级密码学标准化是物联网安全和嵌入式系统安全的关键。NIST 于 2018 年启动了轻量级密码算法标准化竞赛,旨在征集和评估适用于资源受限环境的密码算法。ISO 和 IETF 等标准化组织也在关注轻量级密码学标准化。
⚝ 密码算法的敏捷更新 (Agile Cryptography):传统的密码算法标准化周期较长,难以快速响应新的安全威胁和技术发展。敏捷密码学 (Agile Cryptography) 倡导更快速、更灵活的密码算法更新和部署机制。未来的密码学标准化可能朝着更加敏捷和迭代的方向发展,以适应快速变化的安全环境。
⚝ 密码学与新兴技术的融合标准化:密码学与人工智能、区块链、云计算、大数据等新兴技术的融合日益紧密。未来的密码学标准化需要关注密码技术与新兴技术的融合应用,例如,制定区块链密码学标准、人工智能安全标准和云计算安全标准。
密码学标准化是密码技术发展的重要推动力,也是保障信息安全的关键基础设施。随着信息技术的不断发展和安全威胁的日益复杂,密码学标准化将继续发挥重要作用,引领密码技术的未来发展方向。