3

我在计算RbNaClGo 的 implementation之间相同的 scrypt 摘要时遇到问题。

这是我使用 rbnacl 生成密钥的方式:

opslimit = 2**20
memlimit = 2**24
digest_size = 32

digest = RbNaCl::PasswordHash.scrypt(
        password,
        salt,
        opslimit,
        memlimit,
        digest_size
)

opslimitmemlimit参数值已从文档中找到。

这是我用 Go 复制相同结果的尝试:

N := 32768
r := 8
p := 1
keyLength := 32

secretKeyBytes, _ := scrypt.Key(password, salt, N, r, p, keyLength)

文档中获取NrpkeyLength的值。

密码具有相同的值。

我不是密码学家,但据我所知,应该有相同的成本因子值来获得相同的摘要?这里的问题是,由于两种实现都采用不同数量的参数,我也很难找到正确的组合。任何想法如何使这两种实现之间的成本因素匹配,以便我可以在两种编程语言之间计算相同的 scrypt 哈希?

4

1 回答 1

5

通过查看 libsodium 的函数pickparams ,设法从opslimitmemlimit计算Npr,该函数由crypto_pwhash_scryptsalsa208sha256调用,而该函数又由 Ruby 在 RbNaCl 的 scrypt 实现调用。

这是将opslimitmemlimit转换为适当的Npr以供其他 scrypt 实现使用的相关代码,如果将来其他人需要它,它们会为 scrypt 提供较低级别的 API: https ://gist.github.com/ jarmo/22f871076ff70e39b54e69c6305c020f

只需更改main中的opslimitmemlimit变量值,然后使用 gcc 编译并运行它以获取Nrp的值。

总而言之,问题在于 Go 公开了比 RbNaCl 更低级别的 API,即使它们正在做同样的事情。

于 2017-10-22T19:37:29.170 回答