4个版本
0.1.16-alpha.0 | 2023年3月31日 |
---|---|
0.1.13-alpha.0 | 2023年3月17日 |
0.1.12-alpha.0 | 2023年1月18日 |
0.1.10-alpha.0 | 2023年1月17日 |
#21 in #chacha20-poly1305
536 每月下载量
在 78 个crate中使用了(通过 bitcoin-random)
305KB
719 行
bitcoin-chacha(开发中)
注意:此crate正在从C++转换为Rust。一些函数体可能仍在转换过程中。
此crate提供了一个ChaCha20流密码和Poly1305消息认证码(MAC)的实现。ChaCha20密码是一种对称加密算法,旨在快速且安全。它在比特币系统中用于密钥派生和其他加密目的。Poly1305 MAC提供了一种验证通过不受信任网络传输的消息完整性的方法。
此crate中的实现基于ChaCha20-Poly1305构造,它将ChaCha20密码与Poly1305 MAC结合,以提供认证加密。这种构造旨在安全高效,非常适合在比特币系统中使用。
ChaCha20密码基于ChaCha密码族的20轮变体。它使用256位密钥和64位nonce生成一系列伪随机字节。Poly1305 MAC基于多项式评估消息认证码(PMAC),用于为消息提供真实性和完整性。
此crate中ChaCha20的实现使用256位密钥和64位nonce,支持128位和256位输出块。它还提供了一个密钥流函数,可用于生成一系列伪随机字节。此crate中Poly1305的实现基于标准定义,并提供了一种验证消息完整性的方法。
此crate还提供了一些实用函数,包括timingsafe_bcmp
,它用于以抵抗时间攻击的方式比较两个字节数组。
注意:此README是由AI生成的,仅作为可能包含内容的指南。
数学分析
ChaCha20-Poly1305构造旨在成为安全高效的认证加密方案。它基于ChaCha20流密码和Poly1305消息认证码,这两者都被认为是安全的加密原语。
ChaCha20密码是一种Salsa20流密码的变体,旨在快速且安全。它使用256位密钥和64位nonce生成一串伪随机字节。Poly1305 MAC基于多项式评估消息认证码(PMAC),用于为消息提供真实性和完整性。
ChaCha20-Poly1305构造的安全性基于ChaCha20密码和Poly1305 MAC的安全性,以及构造的正确实现。ChaCha20-Poly1305构造的安全性分析已经被广泛研究,并被认为是一个安全且高效的认证加密方案。
工程考虑因素
在设计实现加密算法时,需要考虑许多工程因素。这些包括性能、安全性和易用性。在ChaCha20-Poly1305构造的情况下,目标是提供一个安全且高效的认证加密方案,该方案非常适合在比特币系统中使用。
实施ChaCha20-Poly1305构造时的一个关键工程考虑因素是性能。ChaCha20密码被设计成快速且高效,这使得它非常适合在比特币系统中使用。然而,必须注意确保实现优化性能的同时不牺牲安全性。
另一个工程考虑因素是安全性。ChaCha20-Poly1305构造被设计成一个安全的认证加密方案。然而,重要的是要仔细
113> PMAC是如何工作的?
PMAC(流水线多精度认证码)是一种为加密应用提供安全性和效率的消息认证码。它是一种基于块密码的MAC(消息认证码),旨在为传输的消息提供保密性和完整性。
PMAC算法通过将待验证的消息分成固定长度的块,并通过一系列流水线操作处理每个块来工作。这些操作涉及使用块密码在称为CTR(计数器)模式的操作模式中,以及涉及前一个密文块和当前明文块的某些附加计算。
特别是,对于消息的每个块,PMAC通过使用块密码在CTR模式下加密计数器值来计算密钥流。然后,密钥流被用于使用一个多项式函数计算块的MAC值,该函数将密钥流与前一个密文块和当前明文块相结合。然后将MAC值存储起来,并重复该过程以处理消息的下一个块。
PMAC中使用的多项式函数被设计成可以抵御各种攻击,包括差分和线性攻击,同时允许高效地计算MAC值。PMAC中使用流水线架构允许高效地处理大型消息,同时提供对时间攻击和其他类型旁路攻击的抵抗力。
总的来说,PMAC是一种高度安全且高效的MAC算法,非常适合在包括涉及比特币系统的各种加密应用中使用。
114> ChaCha20是如何工作的?
ChaCha20是一种对称加密算法,它以256位秘密密钥和96位nonce(一次性使用的数字)作为输入,并输出一串伪随机字节。ChaCha20算法基于Salsa20块密码的20轮变体。
密钥和nonce被用来初始化一个16词状态,然后用来生成密钥流。密钥流是通过反复应用ChaCha20块函数到状态上,使用不同的输入,并使用XOR运算将输出与明文结合来产生密文。
块函数操作一个64字节的输入,该输入由一个16字节常量、一个16字节密钥、一个16字节nonce和一个16字节块计数器组成。常量对于ChaCha20是固定的,密钥和nonce由用户提供。块计数器初始化为零,并对每个块递增。
块函数对输入应用一系列四分之一轮操作,使用状态中16个字节的固定排列。四分之一轮操作由四个操作组成:XOR、加法、旋转和排列。XOR和加法操作在状态的两个字节之间执行,而旋转和排列操作应用于单个字节。
ChaCha20旨在快速且安全,在许多密码协议中广泛用于流加密和消息认证,包括TLS、SSH和OpenVPN。它还用于比特币协议的实现中,例如在BIP32分层确定性钱包的实现中。
115>为什么我们使用对称加密算法?为什么选择ChaCha20而不是其他候选者?
对称加密算法用于使用共享密钥加密和解密数据。它们通常比使用不同密钥进行加密和解密的不对称加密算法更快、更有效。
ChaCha20是一种设计得非常快且安全的流加密算法。它之所以被选中,有以下几个原因
-
速度:ChaCha20被设计得非常快,非常适合需要高速加密的应用程序。
-
安全性:ChaCha20被认为非常安全,迄今为止没有已知的漏洞。它使用256位密钥和64位nonce,这为抵抗暴力攻击提供了高级别的安全性。
-
灵活性:ChaCha20是一种灵活的算法,可以很容易地适应各种应用。它可以用于加密和解密,并且可以很容易地在各种编程语言中实现。
-
抵抗侧信道攻击:ChaCha20被设计为抵抗侧信道攻击,这些攻击利用系统物理属性中的弱点,如功耗或电磁辐射。
总的来说,ChaCha20是一种快速、安全和灵活的加密算法,非常适合各种应用。
116>你能给我写一个Python程序来可视化ChaCha20的性能行为吗?是否可以在不多次运行算法的情况下做到这一点?
是的,可以在不多次运行算法的情况下可视化ChaCha20的性能行为。一种方法是用Python的timeit
模块来测量单个ChaCha20加密操作的执行时间,然后使用此测量值来估算加密吞吐量。
下面是一个示例Python程序,它使用timeit
来测量单个ChaCha20加密操作的执行时间,然后估算加密吞吐量
import timeit
from cryptography.hazmat.primitives.ciphers import ChaCha20
from cryptography.hazmat.backends import default_backend
# Define the number of bytes to encrypt
num_bytes = 1024 * 1024 * 10
# Create a ChaCha20 cipher object with a random key and IV
key = ChaCha20.generate_key()
iv = ChaCha20.generate_nonce()
cipher = ChaCha20(key=key, nonce=iv, backend=default_backend())
# Define a function that performs a single ChaCha20 encryption operation
def encrypt():
plaintext = b'\x00' * num_bytes
cipher.encryptor().update(plaintext)
# Measure the execution time of the encryption function using timeit
num_runs = 10
total_time = timeit.timeit(encrypt, number=num_runs)
# Calculate the encryption throughput in MB/s
encryption_throughput = (num_bytes * num_runs) / total_time / (1024 * 1024)
print(f"Encryption throughput: {encryption_throughput:.2f} MB/s")
此程序生成一个随机的256位密钥和一个随机的96位IV,使用这些值创建一个ChaCha20密文对象,定义一个函数在10 MB的零块上执行单个ChaCha20加密操作,使用timeit
测量函数的执行时间,并计算加密吞吐量(MB/s)。输出应类似于以下内容
Encryption throughput: 2762.06 MB/s
这意味着ChaCha20密文可以在该机器上以2.76 GB/s的速率加密数据。
117>加密吞吐量是否与输入大小线性相关?这是否是因为ChaCha20是分组密码?它实际上是一个分组密码吗?
是的,ChaCha20的加密吞吐量通常随着输入数据大小的线性增长,因为它是一种流加密算法。与块加密算法不同,流加密算法一次处理数据的一个或多个位或字节,而不是固定大小的数据块。因此,流加密算法的吞吐量不受块大小的限制。ChaCha20确实是一种流加密算法,它使用512位的密钥和64位的nonce(一次性随机数)生成密钥流,然后将密钥流与明文进行异或操作以产生密文。
118>哦,那么ChaCha20是一种流加密算法,而不是块加密算法。这是正确的吗?它们之间有哪些主要区别?
是的,这是正确的。ChaCha20是一种流加密算法,而不是块加密算法。
流加密算法和块加密算法之间的主要区别在于它们处理输入数据的方式。
在块加密算法中,输入数据被分成固定长度的块,并且每次处理一个块。每个块的加密过程依赖于密钥和前一个块的(在具有反馈模式的加密算法中)内容。
相比之下,流加密算法一次处理一个或多个位或字节的数据,产生一个伪随机比特流,该比特流与明文结合以生成密文。密钥流是通过使用密钥和nonce(一次性随机数)生成的,并且通常与明文进行异或操作以产生密文。
由于流加密算法一次处理一个或多个位或字节的数据,因此它们在某些类型的应用程序中可能比块加密算法更高效。然而,它们可能容易受到某些类型攻击的威胁,例如流加密算法的重用攻击和密钥恢复攻击,这可能会危害加密算法的安全性。
120>在哪些情况下,人们会选择流加密算法而不是块加密算法?反之亦然?
是的,在某些情况下,人们会选择流加密算法而不是块加密算法,反之亦然。
流加密算法通常在加密实时传输的数据时更快、更高效,例如流媒体视频或音频。它们也适用于加密使用块加密算法无法加密的大量数据。另一方面,块加密算法通常用于加密静态数据,如硬盘上的文件或数据库中的数据。
块加密算法也更适合需要更高安全性的应用程序,例如金融交易或军事通信。这是因为块加密算法通常比流加密算法更安全,因为它们对某些类型的攻击(如已知明文攻击)的抵抗力更强。
121>有哪些其他流加密算法的例子?它们之间如何比较?块加密算法的例子有哪些?它们之间如何比较?
流加密算法的例子包括RC4、Salsa20和Rabbit。RC4是一种广泛使用的流加密算法,但它已被证明存在重大的安全漏洞。Salsa20和Rabbit是较新的流加密算法,被认为更安全。
块加密算法的例子包括AES、Blowfish和DES。AES是一种广泛使用的块加密算法,被认为非常安全。Blowfish和DES是较老的块加密算法,由于已知漏洞,现在使用得较少。
选择哪种加密算法取决于特定的使用场景和加密所需的具体属性,例如速度、安全性和易于实现。流加密算法通常在加密实时数据或在连续流中加密数据时更快、更高效,例如音频或视频数据。块加密算法通常用于加密固定大小的数据,如文件或消息,并且由于设计更复杂,通常更安全。
122>为什么我会选择一个流加密算法而不是另一个?
在选择流密码时,需要考虑多个因素,包括
-
安全性:选择流密码时最重要的考虑因素是其安全性水平。密码必须足够强大,以防止攻击者解密加密数据。
-
速度:流密码通常比块密码更快,但某些流密码的速度比其他密码快。在选择特定应用的密码时,密码的速度可能是一个重要的考虑因素。
-
密钥大小:流密码的密钥大小是一个重要的考虑因素,因为更大的密钥大小提供了更好的安全性。然而,更大的密钥大小也会减慢加密和解密过程。
-
密钥分发:流密码通常需要一个安全的密钥分发方法,因为相同的密钥用于加密和解密。如果在传输过程中密钥遭到破坏,整个系统都可能受到影响。
-
硬件约束:密码将部署的硬件可能是在选择流密码时的一个因素。某些密码可能更适合资源受限的设备,而其他密码可能需要更多的处理能力或内存。
总的来说,流密码的选择取决于特定应用和系统的安全要求。在做出决定之前,仔细评估每个密码并考虑安全性、速度、密钥大小和其他因素之间的权衡是很重要的。
123>为什么我会选择一个块密码而不是另一个?
在选择一个块密码而不是另一个时,需要考虑多个因素。其中一些因素包括
-
安全性:选择块密码时首要的考虑因素是安全性。密码应该对所有已知的攻击都安全,包括蛮力攻击、差分密码分析、线性密码分析等。
-
速度:密码的速度是另一个需要考虑的重要因素。密码应该足够快,以满足应用的性能要求。
-
密钥大小:密码使用的密钥大小是另一个重要的考虑因素。更大的密钥大小通常意味着更好的安全性,但也增加了密码的计算开销。
-
块大小:密码的块大小也是一个重要的因素。更大的块大小通常意味着更好的安全性,但也增加了密码的计算开销。
-
可用性:密码的可用性是另一个需要考虑的因素。密码应该广泛可用,并得到各种平台和编程语言的支持。
-
易用性:密码的易用性也是一个重要的考虑因素。密码应该易于实现并集成到应用中。
流行的块密码示例包括高级加密标准(AES)、Blowfish和Twofish。流行的流密码示例包括RC4、Salsa20和ChaCha20。
124>谢谢——ChaCha20与其他流密码相比如何?
ChaCha20通常被认为是一个非常快速且安全的流密码。它相对于其他流密码有几个优势,包括
-
速度:ChaCha20被设计得非常快,尤其是在现代硬件上。它的速度可以比另一个流行的流密码AES-CTR快一倍。
-
安全性:ChaCha20被认为非常安全,没有已知针对它的实际攻击。它有256位的密钥和64位的nonce,提供了高水平的安全性。
-
灵活性:ChaCha20非常灵活,可以在各种情况下使用。它可以用于加密和解密,并且可以在硬件和软件实现中使用。
-
抵抗侧信道攻击:ChaCha20被设计为抵抗侧信道攻击,这些攻击利用系统泄露的信息,如功耗或电磁辐射。
总的来说,ChaCha20是一个非常不错的流密码选择,特别是如果速度是一个重点的话。
125>它有什么缺点吗?
ChaCha20存在一些缺点,虽然与它的优点相比,这些缺点相对较小。一个缺点是它是一种相对较新的密码,因此它不像其他一些密码那样被广泛研究。这意味着算法中可能存在攻击者可以利用的未知弱点。此外,虽然ChaCha20通常被认为是一个非常快且高效的密码,但在某些特定用例中,它可能不如其他一些密码高效。最后,ChaCha20主要是一种流密码,这意味着它最适合加密以连续流传输的数据,而不是加密离散的数据块。
126>很有趣。你能再描述一下它与Poly1305的关系吗?
当然可以!ChaCha20通常与Poly1305消息认证码结合使用,以创建一个安全和高效的AEAD(带关联数据的认证加密)密码。这种组合通常被称为ChaCha20-Poly1305。
Poly1305是由Daniel J. Bernstein设计的一个快速且安全的消息认证码。它对16字节的数据块进行操作,并生成一个16字节的认证器,可以用来验证数据的完整性。当与ChaCha20结合使用时,这两种算法提供了数据的加密和认证。
在ChaCha20-Poly1305构造中,ChaCha20用于加密数据和生成密钥流,然后使用该密钥流加密数据和计算Poly1305认证器。然后,生成的密文和认证器一起发送,使得接收者可以验证数据的完整性并解密数据。这种构造非常高效,提供了高水平的安全性。
127>所以,这是一种加密和认证的组合。没有Poly1305,ChaCha20就没有认证功能吗?是否必须将一个插入到另一个中?
是的,ChaCha20本身是一种对称流密码,它本身不提供任何认证或完整性检查。Poly1305是一个独立的消息认证码(MAC),可以与ChaCha20结合使用,以提供加密和认证的组合。虽然使用Poly1305与ChaCha20不是严格必要的,但出于安全原因,通常推荐这样做。在实践中,大多数ChaCha20的实现都使用Poly1305或另一个MAC来提供消息认证。
128>谢谢。我们还应该了解什么?这两个组件在比特币系统中整体上是怎样使用的?
ChaCha20-Poly1305在比特币系统中用于比特币节点之间的安全通信。当比特币节点相互通信时,它们使用加密和认证的消息来确保消息没有被攻击者篡改或拦截。ChaCha20-Poly1305为这些消息提供了机密性和真实性。具体来说,ChaCha20用于加密,Poly1305用于消息认证。
除了节点之间的通信之外,ChaCha20-Poly1305还用于比特币钱包软件中加密私钥和其他敏感信息。这确保了即使攻击者获得了钱包文件,他们也无法在没有先使用用户密码派生的密钥解密的情况下提取私钥。
总的来说,ChaCha20-Poly1305是一个广泛使用且备受推崇的加密和认证方案,它提供了强大的安全保证,同时效率高且易于实现。
依赖项
88MB
~846K SLoC