Encryption ChaCha20-Poly1305计算错误的mac

Encryption ChaCha20-Poly1305计算错误的mac,encryption,Encryption,目前,我已经为Android和PHP构建了一个应用程序,它使用chacha20-poly1305对一些数据进行加密。这些都很好用,因为我用锂钠作为他们的支柱 然而,现在我已经为Arduino创建了同样的东西。然而,我正在使用一个不同的库。我正在使用以下输入: Plaintext: 0000000000000001 Nonce: 0000000000000001 Key: b78b94bdf407e2fb0c4cb01e74fee7db743d4d5ab636fe4c181511137dedfc4

目前,我已经为Android和PHP构建了一个应用程序,它使用chacha20-poly1305对一些数据进行加密。这些都很好用,因为我用锂钠作为他们的支柱

然而,现在我已经为Arduino创建了同样的东西。然而,我正在使用一个不同的库。我正在使用以下输入:

Plaintext: 0000000000000001
Nonce: 0000000000000001
Key: b78b94bdf407e2fb0c4cb01e74fee7db743d4d5ab636fe4c181511137dedfc46
在LibNasdium上,它使用mac生成以下密文:

78260b2aca088071 3c8eea6f05b671ed72f1bc61fee7cc22
但是在Arduino上:

78260b2aca088071 4d888c3b8fe1a4ab8a28d5e593fe7a25

所以我的问题是:两个Mac都有效吗?反之亦然,那么Arduino变体会有什么问题呢?

ChaCha20-Poly1305有两种变体,原始版本和IETF版本。IETF版本采用12字节的nonce,而原始版本采用8字节

据我所知,IETF版本中的更改是使使用随机nonce更加安全,因为重用的机会更少

您的Android/PHP版本使用的是旧版本,而Arduino版本使用的是较新的IETF版本


,(还有第三个,XChaCha20)。因此,最简单的解决方案可能是更改现有代码以使用IETF版本。或者,您可以使用原始变体更改Arduino版本,如果您使用的库可能的话。

有效点,但困扰我的是两个LIB产生相同的密文但不同的标记。由于Poly1305密钥是由用于加密的相同密码生成的,所以密文和mac要么相同,要么不同,对吗?@t.m.adam我承认我不知道IETF版本如何不同的细节,但我认为部分原因在于它如何组合数据来运行mac。两者的加密部分相同。不管怎样,下面是我的(Ruby)代码,它再现了问题的结果:谢谢,我稍后会仔细看一看。让我困惑的是,假设前四个字节为零,8字节和12字节的nonce都应该产生相同的密钥流。这可能是一个实现细节。@t.m.adam,所以我对此感到好奇,并开始调查。事实证明,每个变量输入到验证器的只是数据的顺序和格式。我在我的要点中添加了一些代码(我希望)来解释差异。哇,干得好!因此,不同之处在于,传统版本不填充数据,还改变了数据馈送到Poly1305的顺序。这就解释了为什么相同的输入会产生不同的标签,但产生相同的密文。非常感谢你花时间进行研究,我欠你一个人情。