如何使用 Skein 的流密码?

信息安全 密码学 加密 哈希
2021-08-28 18:36:44

我了解 NIST 哈希函数竞赛候选者Skein带有一个内置的分组密码 Threefish,它通过使用Unique Block Iteration链接变成了流密码(对吗?)。

pyskein实现使这个特别容易使用

import os
import skein

data = b'Hello World!'
key = b'thisisasecret'
nonce = os.urandom(32)

c1 = skein.StreamCipher(key, nonce=nonce, hasher=skein.skein1024)
c2 = skein.StreamCipher(key, nonce=nonce, hasher=skein.skein1024)

print(c2.decrypt(c1.encrypt(data)))

但是,由于算法相对较新,我有一大堆问题最终导致“我如何正确使用它?”

  • 随机数应该多长?
  • 我还需要使用 PBKDF2 吗?(即这东西自己做任何关键的拉伸吗?)
  • 我还需要对消息进行身份验证吗?
  • 如果我不给它一个随机数会发生什么?
  • 如何使用所有可选参数?
  • 为什么我应该/不应该使用它?

我不是密码学家,关于 Skein 的 Threefish 部分似乎没有任何易于理解的文档。然而,这个算法看起来真的很不错。所以我希望你能帮助我。:-)

2个回答

您不应该部署基于 Skein 的软件。

在内部,Skein 是围绕可用作流密码或 MAC 的自定义分组密码 (Threefish) 构建的,但没有人真正关注 Threefish 的内在安全性,只是因为它提供了良好的哈希函数,甚至对于这种用法,尚未作出判决。需要多年的审查才能确定给定的算法“看起来相当安全”。一刀切的原语具有巨大的吸引力,特别是对于代码空间有限的嵌入式系统,但还需要几年时间才能正式认为 Threefish 是安全的。粗略地说,如果Skein 被选为 SHA-3(到 2012 年底),那么 Threefish 很可能会开始作为一种加密原语进行调查,在这种情况下,它可能会在 2016 年之前被宣布为“看起来不错”。你必须要有耐心。

您应该稍等片刻的另一个原因是 Skein 和/或 Threefish 可能仍需修改。可以定期对 SHA-3 候选者进行“调整”(根据先前的分析进行轻微修改)。Skein 在 SHA-3 比赛的第二轮进行了调整,然后在第三轮再次进行了调整。pyskein 中实现了哪个版本?这里有互操作性噩梦的空间。

至于你的其他问题:

  • Skein / Threefish 不包含任何自动键拉伸。
  • 作为流密码的 Skein 是流密码,而不是经过身份验证的流密码。它只做加密。Skein可用于计算身份验证(作为 MAC),但如果您想在两种用途中使用相同的密钥,则可能需要考虑一些问题(即不要这样做,除非您确定它是安全的,并且相当坦率地说,我不确定)。
  • “nonce”应该是一个任意字符串,长度并没有真正的限制。在一般的 Skein 描述中,nonce 和要散列的消息(在散列时)使用相同的输入机制。Skein 作为流密码“只是”一个带有密钥的散列函数,没有输入,但输出很长。

当然,pyskein 可能会添加任意限制,所以我建议您参考 pyskein 文档(如果它存在的话)。

我完全同意@Thomas。此时您不应该使用 Skein。

相反,我建议您在 encrypt-then-authenticate 模式下使用 AES-CBC 或 AES-CTR 加密以及 CMAC 消息身份验证代码。