如果我没看错crypto_stream_xor和crypto_secretbox的文档,这两个函数都使用XSalsa20。前者没有任何身份验证,而后者有。因此,我希望crypto_secretbox的前几个字节与crypto_stream_xor的前几个字节相同,但遗憾的是,它们不是。例如:
<?php
$a = sodium_crypto_secretbox('zzz', str_repeat('z', 24), str_repeat('z', 32));
echo bin2hex($a) . "\n";
$a = sodium_crypto_stream_xor('zzz', str_repeat('z', 24), str_repeat('z', 32));
echo bin2hex($a);输出如下:
f575a1681d3ee38b0667690c2141f8af6c894d
4c832dcrypto_secretbox (我假设)附加了额外的16字节(128位),这是Poly1305标签的长度。但如果它们都使用XSalsa20,我希望前三个字节至少是相同的,但事实并非如此。
有什么想法吗?
发布于 2019-05-16 18:43:18
crypto_secretbox()包含的身份验证标记存储在前16个字节中。
此外,使用crypto_secretbox()时,流密码的前32个字节不会添加到密文中。它们用作poly1305密钥。
发布于 2019-05-16 12:23:34
试一试
$a = sodium_crypto_secretbox('zzz', str_repeat('z', 24), str_repeat('z', 32));
echo bin2hex($a) . "\n";
$a = sodium_crypto_stream_xor('00000000000000000000000000000000zzz', str_repeat('z', 24), str_repeat('z', 32));
echo bin2hex($a) . "\n";而不是。
crypto_secretbox使用XSalsa20生成的pad的前32个字节作为Poly1305验证器密钥。NaCl validation document中给出了详细信息。这也是为什么NaCl C应用编程接口具有每个人都讨厌的奇怪的零填充业务:调用方需要在密文缓冲区中为32字节的Poly1305身份验证器密钥提供临时存储。
https://stackoverflow.com/questions/56179400
复制相似问题