无法在Ruby-s和Go-s实现之间创建相同的scrypt摘要

无法在Ruby-s和Go-s实现之间创建相同的scrypt摘要,ruby,go,libsodium,scrypt,nacl-cryptography,Ruby,Go,Libsodium,Scrypt,Nacl Cryptography,我在和之间计算相同的scrypt摘要时遇到问题 以下是我如何使用rbnacl生成密钥: opslimit = 2**20 memlimit = 2**24 digest_size = 32 digest = RbNaCl::PasswordHash.scrypt( password, salt, opslimit, memlimit, digest_size ) 已从中找到opslimit和memlimit参数值

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

以下是我如何使用rbnacl生成密钥:

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

digest = RbNaCl::PasswordHash.scrypt(
        password,
        salt,
        opslimit,
        memlimit,
        digest_size
)
已从中找到opslimit和memlimit参数值

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

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

secretKeyBytes, _ := scrypt.Key(password, salt, N, r, p, keyLength)
N、r、p和keyLength的值从中获取

密码和salt具有相同的值

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

通过查看LibNade的函数(crypto_pHash_scryptsalsa208sha256调用)来从opslimit和memlimit计算N、p和r,而Ruby在RbNaCl的scrypt实现又调用了它

以下是将opslimit和memlimit转换为适当的N、p和r以供其他scrypt实现使用的相关代码,这些实现为scrypt提供了较低级别的API(如果将来有人需要):

只需在main中更改opslimit和memlimit变量值,并用gcc编译它,然后运行它以获得N、r和p的值

总的来说,问题在于Go公开的API级别比RbNaCl低,尽管他们做的是相同的事情