首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libsodium: crypto_stream_xor vs crypto_secretbox

libsodium: crypto_stream_xor vs crypto_secretbox
EN

Stack Overflow用户
提问于 2019-05-16 11:40:35
回答 2查看 261关注 0票数 0

如果我没看错crypto_stream_xorcrypto_secretbox的文档,这两个函数都使用XSalsa20。前者没有任何身份验证,而后者有。因此,我希望crypto_secretbox的前几个字节与crypto_stream_xor的前几个字节相同,但遗憾的是,它们不是。例如:

代码语言:javascript
复制
<?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);

输出如下:

代码语言:javascript
复制
f575a1681d3ee38b0667690c2141f8af6c894d
4c832d

在线查看:https://3v4l.org/rqhvJ

crypto_secretbox (我假设)附加了额外的16字节(128位),这是Poly1305标签的长度。但如果它们都使用XSalsa20,我希望前三个字节至少是相同的,但事实并非如此。

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-16 18:43:18

crypto_secretbox()包含的身份验证标记存储在前16个字节中。

此外,使用crypto_secretbox()时,流密码的前32个字节不会添加到密文中。它们用作poly1305密钥。

票数 2
EN

Stack Overflow用户

发布于 2019-05-16 12:23:34

试一试

代码语言:javascript
复制
$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身份验证器密钥提供临时存储。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56179400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档