计算机中熵的详解
在计算机科学中,“熵”(Entropy)是一个核心而多维的概念,它源于信息论,并被广泛应用于随机数生成、密码学和系统安全等领域。理解熵对于构建健壮和安全的现代计算系统至关重要。 熵 (Entropy) 在信息论中,是一种衡量信息源不确定性或信息量的度量。在计算机领域,它通常指代随机性或不可预测性的量度,用于量化系统或数据中存在的无序程度或信息含量。更高的熵意味着更强的随机性和更大的不可预测性。 核心概念:熵是信息的不确定性或随机性大小的度量。 一、熵的引入:热力学与信息论的对比“熵”这个词最早来源于热力学,但在计算机科学中,我们通常主要关注的是信息熵 (Information Entropy)。尽管名称相同,它们描述的“无序”或“不确定性”在概念上存在一定的关联,但在具体领域和衡量方式上却存在显著差异: 1.1 热力学熵 (Thermodynamic Entropy) 领域:物理学,热力学。 衡量对象:一个物理系统中的混乱程度、分子无序性或能量分散程度。它与系统的微观状态数量(通过玻尔兹曼方程 $S = k \ln \Omega$)以及能量转换的不可逆性(热力...
双棘轮算法 (Double Ratchet Algorithm) 详解
双棘轮算法 (Double Ratchet Algorithm, DRA) 是 Signal Protocol 的核心密码学机制,由 Moxie Marlinspike 和 Trevor Perrin 设计。它旨在为异步、双向、端到端加密 (E2EE) 的消息会话提供前向保密性 (Forward Secrecy) 和未来保密性 (Post-Compromise Security / Future Secrecy)。通过结合对称密钥棘轮和Diffie-Hellman 棘轮,该算法能够确保即使会话中的某些密钥被攻击者窃取,过去和未来的消息内容依然保持安全,极大地增强了通讯的韧性。 核心思想:双棘轮算法通过两种交织的密钥更新机制——每条消息更新的对称密钥棘轮和定期更新的 Diffie-Hellman 棘轮——来不断地“棘轮前进”会话密钥,保证即使攻击者在任意时刻攻破了通信方的一些秘密,也无法解密所有过去或所有未来的消息。 一、为什么需要双棘轮算法?在传统的 E2EE 方案中,如果用于加密整个会话的唯一共享秘密密钥被泄露,那么所有通过该密钥加密的消息都可能被解密。为了提...
椭圆曲线密码学 (ECC) 详解
椭圆曲线密码学 (Elliptic Curve Cryptography, ECC) 是一种基于椭圆曲线数学理论的公钥加密算法 (Public-Key Cryptosystem)。它提供了一种替代传统 RSA 和 Diffie-Hellman 的强大加密方法,其核心优势在于在更短的密钥长度下提供同等或更高的安全强度。ECC 的安全性基于椭圆曲线离散对数问题 (Elliptic Curve Discrete Logarithm Problem, ECDLP) 的计算复杂性。 核心思想:利用椭圆曲线上的点运算构建单向函数,使得正向计算容易,逆向计算(ECDLP)困难,从而实现非对称加密。 一、为什么需要 ECC?传统的公钥密码算法如 RSA 和 Diffie-Hellman 的安全性基于大整数分解问题 (FIP) 和离散对数问题 (DLP)。随着计算能力的提升,为了维持相同的安全级别,RSA 和 DH 的密钥长度需要不断增加(例如,从 1024 位到 2048 位,再到 3072 位)。这会带来以下问题: 性能开销:更长的密钥意味着更复杂的数学运算,导致加密、解密和签名验证...
X3DH 密钥协商协议详解
X3DH (Extended Triple Diffie-Hellman) 协议是 Signal Protocol 的一个核心组件,由 Open Whisper Systems(现为 Signal Foundation 和 Signal Messenger LLC)设计。它是一种异步密钥协商协议,旨在在两个用户之间建立一个安全的、经过认证的共享密钥,即使一方或双方不在线也能完成。X3DH 巧妙地结合了长期身份密钥、中期签名预密钥和短期一次性预密钥,以提供强大的前向保密性 (Forward Secrecy) 和未来保密性 (Future Secrecy),同时能够抵抗中间人攻击和密钥妥协。 核心思想:X3DH 解决了在异步通信环境中首次建立安全端到端加密会话的关键挑战。它通过使用不同生命周期的密钥(身份、签名预密钥、一次性预密钥)进行多次 Diffie-Hellman 交换,确保了即使在一方不在线的情况下,也能安全地协商出一个共享的初始根密钥,并提供双方身份的认证。 一、背景与动机传统的 Diffie-Hellman (DH) 密钥交换协议需要在通信双方同时在线才能进行。然...
RSA (Rivest–Shamir–Adleman) 加密算法详解
RSA (Rivest-Shamir-Adleman) 是一种基于大素数分解困难性的公钥加密算法 (Public-Key Cryptosystem)。它于 1977 年由 Ron Rivest、Adi Shamir 和 Leonard Adleman 三位科学家首次提出,并以他们姓氏的首字母命名。RSA 广泛应用于数据加密、数字签名和密钥交换等领域,是目前应用最广泛的非对称加密算法之一。 核心思想:利用数学单向函数(大整数分解在计算上是困难的),生成一对关联的公钥 (Public Key) 和私钥 (Private Key)。公钥公开用于加密,私钥保密用于解密。 一、为什么需要公钥密码学?在传统的对称加密中(如 AES、DES),通信双方必须共享同一个秘密密钥。这会带来密钥分发难题:如何在不安全的信道上安全地将密钥传递给对方? 公钥密码学(也称为非对称加密)解决了这个问题: 密钥对:每个用户拥有一个公钥和一个私钥。 公钥公开:公钥可以安全地发布给任何人。 私钥保密:私钥必须严格保密,只有所有者知道。 加密:发送方使用接收方的公钥加密消息。 解密:接收方使用自己的私钥解密...
Diffie-Hellman 密钥交换算法 (DH 算法) 详解
Diffie-Hellman 密钥交换 (Diffie-Hellman Key Exchange, DH) 是一种特殊的密钥协商协议,它允许两个通信方在不安全的通信信道上,在没有预先共享任何秘密的情况下,共同建立一个安全的共享秘密密钥。这个共享密钥随后可以用于对称加密算法(如 AES)来加密后续的通信内容。DH 算法由 Whitfield Diffie 和 Martin Hellman 于 1976 年发表,是公钥密码学 (Public-Key Cryptography) 领域的开创性工作之一。 核心思想:在开放信道上,通过数学上的“单向函数”(易于计算,难以逆推)特性,协商生成共同的秘密密钥,而非直接传输秘密密钥。 一、为什么需要密钥交换?在加密通信中,如果希望使用对称加密(如 AES),通信双方(例如 Alice 和 Bob)需要共享一个相同的秘密密钥。然而,如何在不安全的、可能被窃听的公共信道(如互联网)上安全地将这个密钥传递给对方,是一个核心难题: 如果直接发送密钥:任何窃听者(Eve)都可以截获该密钥,并用它来解密后续的敏感信息。 如果预先共享密钥:需要双方提...
ChaCha20 流密码加密算法详解
ChaCha20 是一种高性能、高安全性的对称流密码算法,由 Google 的 Dan Bernstein 于 2008 年设计。它是 Salsa20 算法的改进版本,旨在提供比其前辈更高的抗攻击能力和更简洁的实现。ChaCha20 因其卓越的性能和安全性,已成为 TLS 协议中的重要组成部分,特别是在移动设备和低功耗环境中,替代了传统的 AES-GCM。 核心思想:通过一个密钥 (Key) 和一个随机数 (Nonce) 生成一个无限长的伪随机密钥流,然后将密钥流与明文进行异或 (XOR) 操作得到密文。解密时,使用相同的密钥和随机数生成相同的密钥流,再与密文异或即可还原明文。 一、流密码 (Stream Cipher) 简介流密码是一种对称加密算法,它将明文的每个比特或每个字节与一个伪随机密钥流的对应比特或字节进行组合(通常是异或)来生成密文。 1.1 与分组密码 (Block Cipher) 的区别 特性 流密码 (Stream Cipher) 分组密码 (Block Cipher) 工作方式 逐位/逐字节加密 将明文分成固定大小的块,逐块加密 ...
AES (Advanced Encryption Standard) 加密算法详解
AES (Advanced Encryption Standard),即高级加密标准,是当今最广泛使用的对称密钥分组密码算法之一。它由比利时密码学家 Joan Daemen 和 Vincent Rijmen 设计,原名为 Rijndael 算法。2001 年,美国国家标准与技术研究院 (NIST) 选定 Rijndael 算法作为新的联邦信息处理标准 (FIPS 197),取代了 DES (Data Encryption Standard),并将其命名为 AES。AES 具有出色的安全性、高效的性能和广泛的硬件及软件支持,已成为保护敏感数据的事实标准。 核心思想:AES 是一种对称密钥分组密码,它采用 SPN (Substitution-Permutation Network) 结构,通过反复迭代四种基本操作:SubBytes (替换)、ShiftRows (行移位)、MixColumns (列混合) 和 AddRoundKey (密钥加),将固定大小的明文块加密成相同大小的密文块,并支持 128、192 或 256 位密钥,从而提供强大的安全性。 一、引言:对称加密的王...
Substitution-box (S-box) 详解
在现代对称密钥密码算法,特别是分组密码 (Block Ciphers) 中,Substitution-box (S-box) 是一个至关重要的组件。S-box 的引入是为了提供算法的非线性性 (Non-linearity),这是确保密码安全性的核心要素之一。如果一个密码算法是线性的,攻击者可以利用线性代数方法轻松破解它。S-box 通过将输入位模式映射到不同的输出位模式,使得整个加密过程变得高度复杂和混沌,从而抵抗各种密码分析攻击。 核心思想:S-box 的核心作用是在分组密码中引入非线性变换,将输入位序列替换为与输入不呈线性关系的输出位序列,从而增强密码的混淆性 (confusion) 和扩散性 (diffusion),抵抗线性密码分析和差分密码分析等攻击。 一、什么是 S-box?1.1 定义Substitution-box (S-box),也称为替换盒,是一个查找表 (lookup table),它接受一个固定长度的输入位序列(通常是若干位),并生成一个不同或相同长度的输出位序列。S-box 的设计目的是实现非线性变换:它不是一个简单的位移、异或 (XOR) 或加法...
SHA-256 算法详解
SHA-256 (Secure Hash Algorithm 256-bit) 是密码学哈希函数家族 SHA-2 (Secure Hash Algorithm 2) 的成员。它是一个单向 (One-way) 函数,能够接收任意长度的输入数据,并生成一个固定长度为 256 位的(32 字节)哈希值(或称为“消息摘要”)。SHA-256 广泛应用于数字签名、证书验证、数据完整性检查、区块链技术(如比特币)等领域,是目前最受信任和广泛部署的哈希算法之一。 核心思想:SHA-256 通过将输入消息进行填充、分块、迭代压缩,最终生成一个固定长度的 256 位哈希值。其设计利用了一系列复杂的位运算(逻辑运算、循环移位),以确保哈希值的单向性、抗碰撞性、抗原像攻击和抗第二原像攻击,从而提供数据的完整性和身份验证。 一、加密哈希函数的基本特性在深入 SHA-256 之前,理解一个安全的加密哈希函数应具备的关键特性至关重要: 确定性 (Deterministic):相同的输入消息总是产生相同的哈希值。 计算效率 (Computational Efficiency):对于任意输入消息,计算...
SHA (Secure Hash Algorithm) 系列算法详解
SHA (Secure Hash Algorithm) 是一系列由美国国家安全局 (NSA) 设计,并由美国国家标准与技术研究院 (NIST) 发布的安全散列算法。与 MD5 类似,SHA 算法家族将任意长度的输入数据(消息)转换为固定长度的小型字节串,即消息摘要 (Message Digest) 或 哈希值 (Hash Value)。SHA 系列算法在密码学和信息安全领域扮演着至关重要的角色,广泛应用于数字签名、数据完整性校验、密码存储和区块链等场景。 核心思想:通过设计精密的数学和逻辑运算,确保输入数据的微小改变会导致输出哈希值的巨大、不可预测的变化(雪崩效应),并使其具有单向性和抗碰撞性,从而提供数据的完整性和认证功能。 一、SHA 算法家族概述SHA 家族包括以下主要算法版本: SHA-0:1993 年发布,很快发现安全漏洞,被 SHA-1 取代。 SHA-1:1995 年发布,输出 160 位哈希值。曾被广泛使用,但现在已被认为不安全。 SHA-2:2001 年发布,是一个包含多个变体的家族,包括 SHA-224, SHA-256, SHA-384, SHA-...
MD5 (Message-Digest Algorithm 5)算法详解
MD5 (Message Digest Algorithm 5) 是一种广泛使用的加密散列函数,由 Ronald Rivest 于 1991 年设计。它能够将任意长度的输入数据(通常称为“消息”或“原文”)通过哈希运算转换成一个固定长度的 128 位(16 字节)散列值,通常以 32 位十六进制字符串表示。MD5 的设计初衷是用于验证数据完整性,即确保数据在传输或存储过程中未被篡改。 重要安全提示: MD5 算法已被证实存在严重的碰撞漏洞。这意味着可以找到两个不同的输入数据,它们会产生完全相同的 MD5 散列值。因此,MD5 已不再被认为是安全的加密哈希函数,不应再用于需要密码学安全性的场景,如数字签名、密码存储(即使加盐也不推荐)或生成 SSL 证书。 它主要仍用于非安全敏感场景下的文件完整性校验和快速数据比对。 一、引言:哈希函数的基本概念哈希函数 (Hash Function),也称为散列函数,是一类将任意大小的数据映射到固定大小值的函数。在密码学领域,加密哈希函数 (Cryptographic Hash Function) 需要满足更严格的特性: 确定性 (De...
梅森旋转算法 (MT19937) 详解
梅森旋转算法 (Mersenne Twister, MT) 是一种伪随机数生成器 (Pseudorandom Number Generator, PRNG),由日本平山秀一和西村拓士(Makoto Matsumoto 和 Takuji Nishimura)于1997年开发。其中最常用的版本是 MT19937,它的周期非常长,达到了 $2^{19937}-1$,并且通过了严格的统计测试,具有良好的统计均匀性。MT19937 凭借其高质量的随机性、高效的生成速度和极长的周期,已成为许多编程语言和应用中默认的 PRNG。 核心思想:利用伽罗瓦域 (Galois Field) 上的线性递归关系和“扭曲”变换来生成具有极长周期和良好统计特性的伪随机数序列。 一、什么是伪随机数生成器 (PRNG)?在深入了解 MT19937 之前,我们首先需要理解什么是伪随机数生成器。 随机数:通常指不可预测的、没有规律的数字序列。在计算机中,真正的随机性(True Random Number Generation, TRNG)往往依赖于物理世界的不可预测事件,如大气噪声、放射性衰变、鼠标移动等...
计算机随机数生成原理详解
在计算机科学和工程领域,随机数扮演着极其重要的角色,从游戏娱乐到科学模拟,从数据加密到安全协议,几乎处处都需要随机数的支持。然而,计算机本质上是确定性机器,要生成“真正”的随机数并非易事。因此,理解计算机如何生成随机数及其背后的原理变得尤为关键。 随机数是指在一定范围内无法预测,且每个数值出现的概率相等的一组数。在计算机中,我们通常将随机数分为两大类:伪随机数 (Pseudo-Random Number) 和 真随机数 (True Random Number)。 核心概念:随机数并非“无序”,而是指其不可预测性和统计均匀性。 一、伪随机数生成器 (PRNG)伪随机数生成器 (Pseudo-Random Number Generator, PRNG) 是一种算法,它通过一个初始的“种子”(seed) 值,生成一个看似随机的数值序列。这个序列在统计学上表现出随机的特性,但实际上是完全确定性的,即可重现的。 1.1 工作原理PRNG 的核心思想是确定性算法。给定相同的初始种子,PRNG 总是会生成相同的随机数序列。其工作流程通常如下: graph TB %%...
UUID (Universally Unique Identifier) 详解
UUID (Universally Unique Identifier),即通用唯一标识符,是一个由 128 位数字组成的标识符,用于在计算机系统中保证局部或全局的唯一性。它也被称为 GUID (Globally Unique Identifier),特别是在微软的实现中。UUID 的设计目标是在不依赖中央协调机构的情况下,使得分布式系统中的每个实体都能拥有一个足够唯一的标识符,从而避免冲突。 核心思想:UUID 是一种 128 位的数字,通过特定的算法生成,旨在在分布式环境中提供极高的唯一性,无需中央协调。 一、为什么需要 UUID?在现代分布式系统、微服务架构和大型数据库应用中,生成唯一标识符是一个常见而关键的需求。传统的自增 ID(如数据库主键)存在以下问题: 中心化瓶颈: 需要一个中心化的数据库来管理和生成 ID,成为系统的单点故障或性能瓶颈。 分布式冲突: 在多个服务或节点独立生成 ID 时,容易发生冲突。 可预测性: 连续的自增 ID 容易被预测,可能带来安全风险。 数据迁移和合并: 合并来自不同数据库的数据时,自增 ID 可能会重复。 UUID 提供了...
雪花算法 (Snowflake Algorithm) 详解
雪花算法 (Snowflake Algorithm) 是 Twitter 公司开源的一种分布式唯一 ID 生成算法。它旨在解决在分布式系统中生成全局唯一、递增(但非严格递增)且高性能 ID 的需求。其生成的 ID 是一个 64 位的整数,具有时间有序性,并且不依赖于数据库,易于扩展。 核心思想:将 64 位的 Long 型 ID 拆分为多个字段,分别存储时间戳、数据中心 ID、机器 ID 和序列号,通过位运算拼接以保证全局唯一性和大致的时间有序性。 一、为什么需要雪花算法?在分布式系统中,传统的单点自增 ID 方案面临巨大挑战: 唯一性问题:不同的数据库实例或服务节点可能生成相同的 ID。 性能瓶颈:为了保证唯一性,可能需要引入中心化的 ID 生成服务或数据库锁,成为系统瓶颈。 可用性问题:中心化服务一旦宕机,整个系统的 ID 生成将受影响。 虽然 UUID 能够保证全局唯一性,但它存在一些缺点: 存储和传输效率低:128 位,比 64 位 ID 更占用空间,索引性能较差。 无序性:UUID 是无序的,插入数据库时会导致 B+ 树索引频繁分裂和重建,影响数据库性能。...
