目前我已经为 Android 和 PHP 构建了一个应用程序,它使用 chacha20-poly1305 加密一些数据。这些工作正常,因为我使用 libsodium 作为它们的主干。
但是,现在我为 Arduino 创建了相同的东西。但是,我为此使用了不同的库。我正在使用以下输入:
Plaintext: 0000000000000001
Nonce: 0000000000000001
Key: b78b94bdf407e2fb0c4cb01e74fee7db743d4d5ab636fe4c181511137dedfc46
在 libsodium 上,它使用 mac 生成以下密文:
78260b2aca088071 3c8eea6f05b671ed72f1bc61fee7cc22
但是在 Arduino 上:
78260b2aca088071 4d888c3b8fe1a4ab8a28d5e593fe7a25
所以我的问题是:两台 Mac 都有效吗?他们不工作,反之亦然,那么Arduino变体的问题是什么?
最佳答案
ChaCha20-Poly1305 有两种变体,原始版本和 IETF 版本。 IETF 版本需要 12 字节的随机数,而原始版本需要 8 字节。
据我了解,IETF 版本的变化是使使用随机 nonces 更安全,因为重用的机会更少。
您的 Android/PHP 版本使用的是旧版本,而您的 Arduino 版本使用的是较新的 IETF 版本。
Libsodium implements both variants ,(以及第三个,XChaCha20)。因此,最简单的解决方案可能是您更改现有代码以使用 IETF 版本。或者,您可以使用原始变体更改 Arduino 版本,如果您使用的库可能的话。
关于encryption - ChaCha20-Poly1305计算错误的mac,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57312178/