【问题标题】:How to use scrypt to produce a 256-bit key?如何使用 scrypt 生成 256 位密钥?
【发布时间】:2015-04-28 09:21:02
【问题描述】:

我正在使用 scrypt 生成密钥派生,但问题是输出大于 256 位,我想在 AES-GCM 中使用 256 位密钥。那么我该怎么做呢?我想在Android上制作一个应用程序。

编辑: 我很抱歉没有给你更多的信息 好的..我正在使用的库是这个 https://github.com/wg/scrypt

这是我得到的输出

"$s0$e0801$eX8cPtmLjKSrZBJszHIuZA==$vapd0u4tYVdOXOlcIkFmrOEIr1Ml2Ue1l2+FVOJgbcI="

这已经超出了 AES 引擎的处理能力,所以我该如何使用它

【问题讨论】:

  • 请向我们展示您执行 scrypt 推导的代码部分。
  • AFAIK scrypt 通过其基于 PBKDF2 的最后一步支持任意长度的输出。
  • 除了 Duncan 的评论外,还请在问题中编辑您正在使用的 scrypt 库。投票否决,直到为我们提供足够的信息来回答问题。
  • @CodesInChaos Right:“dkLen:派生密钥的八位字节的预期输出长度;小于或等于 (2^32 - 1) * hLen 的正整数,其中 hLen 为 32。”来自source,这似乎是 IETF 的一个相对较新的草案(有趣的是,他们在那段时间之后迈出了这一步)。那么问题就变成了:为什么输出大于256位...
  • 好的,我添加了更多细节......对不起

标签: android encryption hash cryptography scrypt


【解决方案1】:

Scrypt 是一种密钥派生算法。这意味着您可以使用它来生成任意数量的伪随机字节。

在wg库中,方法是调用Scrypt.scrypt function

byte[] key = Scrypt.scrypt(password, salt, N, r, p, 32);

这将为您提供所需的 32 字节的密钥材料。

密钥派生与密码存储

您的困惑可以理解。 wg/scrypt 的文档没有提到真正使用 scrypt。他们只记录了它使用密码存储算法。

这就是您错误地调用 ScryptUtil.scrypt(而不是 Scrypt.scrypt)的原因:

string hash = ScryptUtil.scrypt(password, N, r, p);

该方法返回一个字符串,该字符串适合作为 AES(或任何其他类型)加密的密钥。

【讨论】:

    猜你喜欢
    • 2013-06-16
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多