U8国际 U8国际官方网站 体育APP下载真实世界的密码学(一)(3)
栏目:U8哈希 发布时间:2025-10-23
  u8,u8国际,u8国际官方网站,u8国际网站,u8国际网址,u8国际链接,u8体育,u8体育官网,u8体育网址,u8注册,u8体育网址,u8官方网站,u8体育APP,u8体育登录,u8体育入口   到目前为止,只有你在使用 MAC。让我们增加参与者的数量,并以此为动机编写一些代码,看看 MAC 在实践中是如何使用的。想象一下,你想

  u8,u8国际,u8国际官方网站,u8国际网站,u8国际网址,u8国际链接,u8体育,u8体育官网,u8体育网址,u8注册,u8体育网址,u8官方网站,u8体育APP,u8体育登录,u8体育入口

U8国际 U8国际官方网站 U8体育APP下载真实世界的密码学(一)(3)

  到目前为止,只有你在使用 MAC。让我们增加参与者的数量,并以此为动机编写一些代码,看看 MAC 在实践中是如何使用的。想象一下,你想与其他人通信,而不在乎其他人是否阅读你的消息。但你真正关心的是消息的完整性:它们不能被修改!一个解决方案是你和你的通信对象使用相同的秘密密钥和 MAC 来保护通信的完整性。

  对于这个示例,我们将使用最流行的 MAC 函数之一——基于哈希的消息认证码(HMAC)与 Rust 编程语言一起使用。HMAC 是一种使用哈希函数作为核心的消息认证码。它与不同的哈希函数兼容,但主要与 SHA-2 一起使用。如下列表所示,发送部分只需接受一个密钥和一个消息,然后返回一个身份验证标签。

  另一方面,流程类似。在接收到消息和身份验证标签后,你的朋友可以使用相同的秘密密钥生成自己的标签,然后进行比较。与加密类似,双方需要共享相同的秘密密钥才能使其正常工作。以下列表显示了这是如何工作的。

  注意,这个协议并不完美:它允许重放攻击。如果一个消息及其认证标签在以后的某个时间点被重放,它们仍然是真实的,但你将无法检测到它是一条旧消息被重新发送给你。本章后面,我会告诉你一个解决方案。现在你知道了 MAC 可以用来做什么,我会在下一节谈谈 MAC 的一些“坑”。

  MACs,像所有的密码学原语一样,有它们的怪异之处和陷阱。在继续之前,我将对 MAC 提供的安全属性以及如何正确使用它们提供一些解释。你会依次学到(按顺序):

  一个 MAC 的一般安全目标是防止在新消息上伪造认证标签。这意味着在不知道秘钥k的情况下,无法计算出认证标签t=MAC(k,m) 在用户选择的消息m上。这听起来合理,对吧?如果我们缺少一个参数,我们就不能计算出一个函数。

  然而,MACs 提供了比这更多的保证。现实世界的应用程序通常会让攻击者获取一些受限制的消息的认证标签。例如,在我们的介绍场景中,这就是问题所在,用户可以通过注册一个可用的昵称来获得几乎任意的认证标签。因此,MACs 必须甚至对这些更强大的攻击者也是安全的。一个 MAC 通常附带一个证明,即使攻击者可以要求你为大量的任意消息产生认证标签,攻击者也不能自己伪造一个以前从未见过的消息的认证标签。

  注意有人可能会想知道证明这样一个极端性质的用处是什么。如果攻击者可以直接请求任意消息的认证标签,那么还剩下什么需要保护的呢?但这就是密码学中安全证明的工作原理:它们考虑到最强大的攻击者,甚至在那种情况下,攻击者也是无能为力的。在实践中,攻击者通常不那么强大,因此,我们相信如果一个强大的攻击者无法做出恶意行为,一个不那么强大的攻击者就更加无能为力了。

  因此,只要与 MAC 一起使用的秘钥保持秘密,你就应该受到保护。这意味着秘钥必须足够随机(在第八章中详细讨论)和足够大(通常为 16 字节)。此外,一个 MAC 对于我们在第二章中看到的相同类型的模糊攻击也是脆弱的。如果你试图验证结构,请确保在用 MAC 验证之前将它们序列化;否则,伪造可能是微不足道的。

  针对 MAC 的另一个可能攻击是碰撞。记住,找到哈希函数的碰撞意味着找到两个不同的输入X和Y,使得HASH(X) =HASH(Y)。我们可以通过定义当MAC(k,X) =MAC(k,Y) 时输入X和Y发生碰撞来将此定义扩展到 MAC。

  正如我们在第二章学到的生日攻击边界一样,如果我们算法的输出长度较小,则可以高概率地找到碰撞。例如,对于 MAC,如果攻击者可以访问生成 64 位认证标签的服务,则可以通过请求较少的标签数(232)高概率地找到碰撞。在实践中,这样的碰撞很少能够被利用,但存在一些碰撞抗性很重要的情况。因此,我们希望认证标签大小能够限制此类攻击。一般来说,使用 128 位认证标签是因为它们提供足够的抗性。

  [请求 2⁶⁴ 个认证标签] 在连续 1Gbps 链路上需要 250,000 年,并且在此期间不更改秘密密钥 K。

  使用 128 位认证标签可能看起来有些反直觉,因为我们希望哈希函数的输出为 256 位。但是哈希函数是公开算法,攻击者可以离线计算,这使得攻击者能够对攻击进行优化和并行化。使用像 MAC 这样的密钥函数,攻击者无法有效地离线优化攻击,而是被迫直接向您请求认证标签,这通常会使攻击速度变慢。128 位认证标签需要攻击者在线% 的机会找到碰撞,这被认为足够大。尽管如此,某些情况下可能仍希望将认证标签增加到 256 位,这也是可能的。

  重播攻击。让我们看一个容易受到此类攻击的场景。假设 Alice 和 Bob 使用不安全的连接在公开场合进行通信。为了防止消息篡改,他们在每条消息后附上认证标签。更具体地说,他们都使用两个不同的秘密密钥来保护连接的不同侧面(按最佳实践)。我在图 3.5 中说明了这一点。

  k1和k2,并随消息一起交换认证标签。这些标签是根据消息的方向从k1或k2计算出来的。恶意观察者会重播其中一条消息给用户。

  k1和k2,并与身份验证标签一起交换消息。这些标签是根据消息的方向从k1或k2计算的。恶意观察者向用户重播其中一个消息。因为受害者已经增加了他的计数器,标签将被计算为2, fine and you?,并且不会与攻击者发送的标签匹配。这使得受害者能够成功拒绝重放的消息。

  X条消息后,参与者同意使用新的共享密钥),那么计数器的大小可以缩小,并且在密钥旋转后重置为 0。(你应该确信重复使用相同的计数器与两个不同的密钥是可以的。)再次强调,由于存在歧义攻击,计数器永远不是可变长度的。

  恒定时间内完成。这意味着比较应该始终花费相同的时间,假设接收到的标签是正确大小的。如果比较两个身份验证标签所花费的时间不是恒定时间,那么很可能是因为它在两个标签不同时返回。这通常提供了足够的信息,以启用通过测量验证完成所需时间来逐字节重新创建有效身份验证标签的攻击。我在以下漫画中解释了这一点。我们将这类攻击称为时序攻击。

  MACs 的一个特点是它们通常被设计为生成看起来随机的字节(就像哈希函数)。您可以利用这个特性实现一个单一的密钥来生成随机数,或者生成更多的密钥。在第八章关于秘密和随机性中,我将介绍基于 HMAC 的密钥派生函数(HKDF),它通过使用 HMAC 来实现这一点,HMAC 是我们将在本章中讨论的 MAC 算法之一。

  想象一下,所有接受可变长度输入并生成固定大小随机输出的函数的集合。如果我们可以从这个集合中随机选择一个函数并将其用作 MAC(没有密钥),那就太好了。我们只需就选择哪个函数达成一致(有点像达成一致选择密钥)。不幸的是,我们不能拥有这样的集合,因为它太大了,但我们可以通过设计一些接近的东西来模拟选择这样一个随机函数:我们称这样的构造为

  伪随机函数(PRFs)。HMAC 和大多数实用的 MAC 都是这样的构造。它们通过一个密钥参数进行随机化。选择不同的密钥就像选择一个随机函数。

  哈希表(也称为哈希映射、字典、关联数组等)的数据结构,这些数据结构使用非密码散列函数。如果一个服务以这样一种方式公开此数据结构,使得攻击者可以控制非密码散列函数的输入,这可能导致拒绝服务(DoS)攻击,意味着攻击者可以使服务无法使用。为了避免这种情况,非密码散列函数通常在程序启动时进行随机化。

  SipHash,一个针对短身份验证标签进行优化的 MAC,该标签在程序启动时生成随机密钥。

  你已经了解到 MAC 是一种加密算法,可以在一个或多个参与方之间使用,以保护信息的完整性和真实性。由于广泛使用的 MAC 也表现出良好的随机性,MAC 也经常被用于在不同类型的算法中确定性地产生随机数(例如,你将在第十一章学习的基于时间的一次性密码[TOTP]算法)。在本节中,我们将介绍两种现在可以使用的标准化的 MAC 算法——HMAC 和 KMAC。

  基于哈希的 MAC),由 M. Bellare、R. Canetti 和 H. Krawczyk 于 1996 年发明,并在 RFC 2104、FIPS 出版物 198 和 ANSI X9.71 中指定。HMAC,正如其名称所示,是一种使用哈希函数和密钥的方法。使用哈希函数构建 MAC 的概念是一个流行的概念,因为哈希函数有广泛可用的实现,在软件中速度快,并且在大多数系统上也受到硬件支持。记得我在第二章提到过,由于长度扩展攻击(本章末尾将详细介绍),SHA-2 不应直接用于对秘密进行哈希处理。那么如何将哈希函数转换为带密钥的函数呢?这就是 HMAC 为我们解决的问题。在幕后,HMAC 遵循以下步骤,我在图 3.7 中通过可视化方式说明:

  k1和输入消息的串联()进行哈希运算,然后再对第一次操作的输出与另一个密钥k2的串联进行哈希运算来工作。k1和k2都是从一个秘密密钥k派生出来的确定性密钥。

  KMAC 利用了 cSHAKE,即您在第二章中看到的可定制版本的 SHAKE 可扩展输出函数(XOF)。KMAC 以一种明确的方式对 MAC 密钥、输入和请求的输出长度进行编码(KMAC 是一种可扩展输出 MAC),并将其作为 cSHAKE 的输入来吸收(参见图 3.8)。KMAC 还使用“KMAC”作为函数名称(以定制 cSHAKE),并且还可以接受用户定义的定制字符串。

  admin=true字段)并重新计算 cookie 的哈希。确实,SHA-2 是一个公共函数,没有任何东西阻止用户这样做。图 3.9 说明了这一点。

  SHA-256(keytampered_cookie),其中表示两个值的连接,并得到一个与恶意用户可能发送的内容不匹配的结果。图 3.10 说明了这种方法。

  input1)连接的秘密进行哈希。请记住,SHA-256 通过使用 Merkle–Damgård 构造来迭代地调用压缩函数对输入的块进行处理,从初始化向量(IV)开始。

  input1是字符串user=bob。请注意,获得的摘要实际上是哈希函数在这一点的完整中间状态。没有什么可以阻止假装填充部分是输入的一部分,继续 Merkle–Damgård 舞蹈。在图 3.12 中,我们说明了这种攻击,其中一个人会取得摘要并计算input1paddinginput2的哈希。在我们的例子中,input2是&admin=true。

  保密性是关于隐藏数据不被未经授权的人看到,而加密是实现这一目标的方法。加密是密码学最初被发明的目的;它是早期密码学家最关心的问题。他们会问自己,“我们如何防止观察者理解我们的对话?”虽然最初科学及其进展是在闭门之后蓬勃发展的,只有政府和军队受益,但现在已经向全世界开放。今天,加密在现代生活的各个方面被广泛使用以增加隐私和安全性。在本章中,我们将了解加密的真正含义,它解决了哪些问题,以及当今的应用程序如何大量使用这种密码原语。

  就像当你用俚语与兄弟姐妹谈论放学后要做什么,这样你的妈妈就不知道你在干什么。

  让我们想象一下我们的两个角色,爱丽丝和鲍勃,想要私下交换一些消息。在实践中,他们有许多可供选择的媒介(邮件、电话、互联网等),每个媒介默认都是不安全的。邮递员可能会打开他们的信件;电信运营商可以窥探他们的通话和短信;互联网服务提供商或者在爱丽丝和鲍勃之间的网络中的任何服务器都可以访问正在交换的数据包的内容。

  加密算法(也称为密码)。现在,让我们把这个新算法想象成爱丽丝可以用来加密她发送给鲍勃的消息的黑匣子。通过对消息进行加密,爱丽丝将其转换为看起来随机的内容。这个加密算法需要

  密文,即加密后的内容。爱丽丝可以安全地使用之前列出的媒介之一将该密文发送给鲍勃。对于不知道秘钥的任何人来说,密文看起来是随机的,消息内容(明文)的任何信息都不会泄露。一旦鲍勃收到这个密文,他可以使用一个解密算法将密文恢复为原始明文。解密需要

  0x8866...(一个缩写的十六进制数)加密明文hello,然后将密文发送给鲍勃。鲍勃(右下)使用相同的密钥和解密算法解密收到的密文。

  高级加密标准(AES)的公开竞赛,他们以前的加密标准开始显露老化迹象。竞赛持续了三年,期间,来自不同国家的密码学家团队提交了 15 种不同的设计。竞赛结束时,只有一个提交作品,由文森特·赖曼和约翰·达曼设计的 Rijndael 被提名为获胜者。2001 年,NIST 发布了 AES 作为 FIPS(联邦信息处理标准)197 出版物的一部分。 AES,即 FIPS 标准中描述的算法,仍然是今天主要使用的密码。在本节中,我将解释 AES 的工作原理。

  越大越强。尽管如此,大多数应用都使用 AES-128,因为它提供足够的安全性(128 位安全性)。

  位安全性常用来指示密码算法的安全性。例如,AES-128 指定我们已知的最佳攻击需要大约 2¹²⁸ 次操作。这个数字是巨大的,它是大多数应用所追求的安全级别。

  128 位密钥提供 128 位安全性的事实是特定于 AES 的;这不是一个黄金法则。在某些其他算法中使用的 128 位密钥理论上可能提供的安全性不到 128 位。虽然 128 位密钥可以提供不到 128 位的安全性,但永远不会提供更多(总是有暴力破解攻击)。尝试所有可能的密钥最多需要 2¹²⁸ 次操作,将安全性至少降低到 128 位。

  2¹²⁸ 有多大?注意两个 2 的幂之间的数量加倍。例如,2³ 是 2² 的两倍。如果说 2¹⁰⁰ 次操作几乎是不可能实现的,想象一下达到其两倍(2¹⁰¹)。要达到 2¹²⁸,你需要将你的初始数量加倍 128 次!简单来说,2¹²⁸ 是 340 个无法想象的无穷大。这个数字是相当巨大的,但你可以假设我们在实践中永远不可能达到这样的数字。我们也没有考虑到任何大规模复杂攻击所需的空间量,实际上同样是巨大的。

  置换:它将所有可能的明文映射到所有可能的密文(请参见图 4.2 中的示例)。更改密钥会更改该映射。置换也是可逆的。从密文,您可以得到回到其相应明文的映射(否则,解密将无法工作)。

  分组密码,它们是加密固定大小的块的密码。AES 还有一个轮函数,它会多次迭代,从原始输入(明文)开始。我在图 4.4 中对此进行了说明。

  轮密钥,它是从主对称密钥派生的(在所谓的密钥调度期间)。这允许对对称密钥位的细微更改产生完全不同的加密(这被称为扩散原理)。

  SubBytes、ShiftRows、MixColumns和AddRoundKey。前三者是容易可逆的(您可以从操作的输出中找到输入),但最后一个不是。它执行轮密钥和状态的异或(XOR)操作,因此需要轮密钥的知识才能反转。我在图 4.5 中说明了轮函数的内部。

  总破解(恢复密钥的攻击)。通过多次迭代,密码将明文转换为看起来与原始明文完全不同的东西。明文中最微小的变化也会返回完全不同的密文。这个原则被称为雪崩效应。

  注意 现实世界中的加密算法通常通过它们提供的安全性、大小和速度进行比较。我们已经讨论了 AES 的安全性和大小;它的安全性取决于密钥大小,并且可以一次加密 128 位的数据块。就速度而言,许多 CPU 厂商已经在硬件中实现了 AES。例如,AES 新指令(AES-NI)是一组可在英特尔和 AMD CPU 中使用的指令,可用于有效地实现 AES 的加密和解密。这些特殊指令使 AES 在实践中变得极快。

  填充字节,但填充的最重要方面是它必须是可逆的。一旦我们解密了密文,我们应该能够去除填充以检索原始的未填充消息。例如,简单地添加随机字节是行不通的,因为你无法辨别随机字节是否是原始消息的一部分。

  PKCS#7 填充,它首次出现在 RSA(一家公司)于 1990 年代末发布的 PKCS#7 标准中。PKCS#7 填充规定一条规则:每个填充字节的值必须设置为所需填充的长度。如果明文已经是 16 字节了怎么办?那么我们添加一个完整块的填充,设置为值 16。我在图 4.6 中用图示说明了这一点。要移除填充,你可以轻松地检查明文的最后一个字节的值,并将其解释为要移除的填充长度。

  电子密码本(ECB)操作模式。正如你所学到的,加密是确定性的,因此对相同的明文块进行两次加密会导致相同的密文。这意味着通过单独加密每个块,生成的密文可能会有重复的模式。

  密码块链接(CBC)。CBC 适用于任何确定性块密码(不仅仅是 AES),通过使用称为初始化向量(IV)的附加值来随机化加密。因此,IV 的长度为块大小(AES 为 16 字节)并且必须是随机且不可预测的。

  唯一的(不能重复)以及不可预测的(真的需要是随机的)。这些要求可能由于多种原因而失败。因为开发人员经常对 IV 感到困惑,一些密码库已经删除了在使用 CBC 加密时指定 IV 的可能性,并自动生成一个随机的 IV。

  到目前为止,我们未能解决一个根本性的缺陷:在 CBC 模式下,密文以及 IV 仍然可以被攻击者修改。实际上,没有完整性机制来防止这种情况!密文或 IV 的更改可能导致解密时出现意外的变化。例如,在 AES-CBC(使用 CBC 模式的 AES),攻击者可以通过翻转 IV 和密文中的特定位来翻转明文的特定位。我在图 4.10 中说明了这种攻击。

  图 4.10 拦截 AES-CBC 密文的攻击者可以执行以下操作:(1)因为 IV 是公开的,所以将 IV 的位(例如从 1 到 0)进行翻转,也会(2)翻转第一个明文块的位。 (3)密文块上也可能发生位的修改。 (4)这样的更改会影响解密后的下一个明文块。 (5)请注意,篡改密文块会直接影响到该块的解密。

  消息认证码(MAC)。对于 AES-CBC,我们通常使用 HMAC(用于基于哈希的 MAC)与 SHA-256 哈希函数结合使用来提供完整性。然后我们在对明文进行填充并将其加密后,将 MAC 应用于密文和 IV 上;否则,攻击者仍然可以修改 IV 而不被发现。

  加密后进行认证。替代方案(如认证后进行加密)有时可能会导致巧妙的攻击(如著名的 Vaudenay 填充预言攻击),因此在实践中要避免使用。

  AES-CBC-HMAC,直到我们开始采用更现代的一体化构造为止,它是最广泛使用的经过身份验证的加密模式之一。

  必须是不可预测的)。我花了几页的篇幅介绍这个算法,因为它仍然被广泛使用且仍然有效,但我建议不要使用它,而是使用我接下来介绍的更现代的构造。

  加密的历史并不美好。不仅人们很少意识到没有认证的加密是危险的,而且错误地应用认证也是开发人员经常犯的系统性错误。因此,出现了大量研究,旨在标准化简化开发人员使用加密的全合一构造。在本节的其余部分,我将介绍这个新概念以及两种广泛采用的标准:AES-GCM 和 ChaCha20-Poly1305。

  带有关联数据的认证加密(AEAD)的全合一构造。该构造与 AES-CBC-HMAC 提供的内容极为接近,因为它在保护明文的同时检测可能发生在密文上的任何修改。此外,它提供了一种验证关联数据的方法。

  ad);例如,消息的发送者。收到密文和认证标签后,Bob 可以使用相同的密钥和关联数据解密。如果关联数据不正确或密文在传输过程中被修改,解密将失败。

  加密库来使用认证加密原语进行加密和解密。为此,我们将使用 JavaScript 编程语言和 Web Crypto API(大多数浏览器支持的官方接口,提供低级加密功能),如下列表所示。

  不需要是不可预测的。一旦这个 16 字节的块被加密,结果被称为密钥流,它与实际的明文进行异或运算以产生加密结果。

  AES-CTR 中的随机数为 96 位(12 字节),大部分用于加密 16 字节的内容。剩下的 32 位(4 字节)作为计数器,从 1 开始,并在每个块加密时递增,直到达到其最大值为 2^(4×8) – 1 = 4,294,967,295. 这意味着,最多可以使用相同的随机数加密 4,294,967,295 个 128 位块(少于 69 GB)。

  GMAC。它是从带有密钥散列(称为GHASH)构造的 MAC。从技术角度来看,GHASH 是几乎异或的通用哈希(AXU),也称为差异不可预测函数(DUF)。这样的函数的要求比哈希要弱。例如,AXU 不需要抗碰撞性。由于这个原因,GHASH 可以显着加快速度。图 4.15 说明了 GHASH 算法。

  一次性 MAC。由于这对我们来说不理想,我们使用一种技术(由 Wegman-Carter 提出)将 GHASH 转换为多次 MAC。我在图 4.16 中进行了说明。

  K的 AES-CTR 来加密明文,并使用 GMAC 来使用认证密钥H对相关数据和密文进行认证。

  H,这是使用密钥K对全零块进行加密。这样,一个密钥K就足以派生另一个密钥,不需要携带两个不同的密钥。

  计数器,从 1 开始逐个加密。在这种情况下,必须使用一个允许用户选择 nonce 的加密库。这样可以在达到 nonce 的最大值之前加密 2^(12×8) - 1 条消息。可以说,这是一个在实践中无法达到的消息数量。

  状态。如果一台机器在错误的时间崩溃,可能会发生 nonce 重用。因此,有时候更倾向于使用随机 nonce。实际上,一些库不允许开发人员选择 nonce,并会随机生成 nonce。这样做可以避免高概率重复,实际上不应该发生这种情况。然而,加密的消息越多,使用的 nonce 越多,发生碰撞的几率就越高。由于我们在第二章讨论的生日界限,建议在随机生成 nonce 时不要使用相同密钥加密超过 2^(92/3) ≈ 2³⁰ 条消息。

  2³⁰ 条消息是相当大量的消息。在许多情况下可能永远不会达到这个数量,但现实世界的加密通常会推动被认为是合理的极限。一些长期存在的系统需要每秒加密许多消息,最终达到这些极限。例如,Visa 每天处理 1.5 亿笔交易。如果需要用唯一密钥加密这些交易,它将在仅一周内达到 2³⁰ 条消息的限制。在这些极端情况下,

  重新生成密钥(更改用于加密的密钥)可能是一个解决方案。还存在一个名为超越生日界限安全性的研究领域,旨在提高可以使用相同密钥加密的最大消息数量。

  )。与所有流密码一样,该算法生成一个密钥流,一个与明文长度相同的随机字节序列。然后将其与明文进行异或运算以创建密文。要解密,使用相同的算法生成相同的密钥流,将其与密文进行异或运算以还原明文。我在图 4.18 中说明了这两个流程。

  由于计数器的上限,你可以使用 ChaCha20 加密与 AES-GCM 相同数量的消息(因为它是由类似的随机数参数化的)。由于这个块函数创建的输出要大得多,你可以加密的消息大小也会受到影响。你可以加密大小为 232 × 64 字节 ≈ 274 GB 的消息。如果重复使用一个随机数来加密明文,会出现与 AES-GCM 类似的问题。观察者可以通过对两个密文进行异或运算来获取两个明文的异或结果,并且还可以恢复随机数的认证密钥。这些是严重的问题,可能导致攻击者能够伪造消息!

  Nonce 和计数器的大小实际上并不总是相同(对于 AES-GCM 和 ChaCha20-Poly1305 都是如此),但它们是采用的标准推荐值。尽管如此,一些加密库接受不同大小的 nonce,一些应用程序增加计数器(或 nonce)的大小以允许加密更大的消息(或更多的消息)。增加一个组件的大小必然会减少另一个组件的大小。

  Quarter Round(QR)函数,每次在内部状态的不同字上操作,具体取决于轮数是奇数还是偶数。图 4.21 展示了这个过程。

  r来吸收输入。输出被作为累加器馈送到下一个核心函数的调用。最终输出加上一个随机值s以成为认证标签。

  r可以看作是方案的认证密钥,就像 GMAC 的认证密钥H一样。而s通过加密结果使得 MAC 对多次使用具有安全性,因此它必须对每次使用都是唯一的。

  Poly1305 核心函数将密钥与累加器(初始设置为 0)和要认证的消息混合在一起。操作是简单的乘法,对一个常数P取模。

  r和s。然后,计数器递增,并使用 ChaCha20 加密明文。之后,相关数据和密文(以及它们各自的长度)被传递给 Poly1305 以创建认证标签。

  在正式介绍线性反馈移位寄存器(LFSR)之前,先来看一个小故事,相传在遥远的古代,住着4个奇怪的人。

  阿里云服务器ECS提供三种付费类型:包年包月、按量付费和抢占式实例。包年包月适合长期稳定使用,价格优惠;按量付费灵活方便,按小时结算,适用于短期或突发需求;抢占式实例价格最低(可省90%),但可能被系统释放,适合无状态应用如大数据分析、科学计算等。选择时根据业务场景决定:稳定需求选包年包月,动态需求选按量付费,低成本无状态应用选抢占式实例。

  C语言的关键字是编程中的核心元素,包括 `int`、`if`、`else` 等,不能用作变量名或函数名。C语言对大小写敏感,关键字有特定的语法规则,如 `if` 后需跟条件表达式。

  LBA-ECO ND-02 农业和次生林土壤微量气体通量,Para: 2001-2004

  一条AI指令,解决发朋友圈不知道写啥的千古难题

  [NMP v2] NeteaseMiniPlayer v2 搭建个人网站网易云迷你播放器