当加密算法收到不支持的密钥大小时会发生什么?

What happens when the encryption algorithm receives an unsupported key size?

我尝试构建一个加密程序,我使用 realisation I took from GitHub there is an exception if the key is not of these sizes. But I want to use the key as a password, in KeePass 的 AES (256/192/128)(他们也使用此算法加密)我们可以创建不同大小的密码。我应该怎么办?我必须添加一些填充字节吗?或者我必须使用哈希算法来创建相同大小的密码?

当使用带有对称加密算法的密码时,处理此问题的常用方法是对密码进行哈希处理,然后使用哈希中的足够字节来构建加密密钥。这样做的好处是可以接受任何大小的密码而不必填充它(如果太长则 trim 它)。

例如,如果您的密码是“password”,则它的 SHA256 哈希值是(打印为十六进制)5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8。然后您可以使用此散列作为 AES256 的密钥。对于 AES128,使用哈希的前 16 个字节(即 5e884898da28047151d0e56f8dc62927)。

已接受的答案不正确、具有误导性且不安全!

基于密码的密钥派生 (PBKDF),一个小介绍

一般情况下,AES的密钥必须统一随机生成。人类很难记住随机密钥,因此我们使用密码并从中导出密钥。将密码转换为密钥的正确方法是使用 PBKDF,例如 PBKDF2,scrypt, or better using Argon2.

这些密钥推导函数带有一些参数,如info, salt, iteration count, memory size, thread amount等。这些参数将来自很长的密码破解方法反制。

  • 盐是用来防止彩虹的table.
  • 迭代计数用于减少攻击者的密码搜索时间。为 PBKDF2 设置大约 1M 将使攻击者减慢 1M 倍。
  • 内存大小用于使密码哈希算法难以记忆,使攻击者无法使用大量GPU/ASIC进行攻击。
  • 即使在并行 CPU 中,线程数量也用于消除并行化。

可以根据您的目标安全性调整这些和类似参数(使用前请查看文档)。

使用 PBKDF 获取所需的密钥大小

这些 PBKDF 中的每一个都可以输出所需数量的密钥大小,128,256 或更多。甚至可以通过使用不同的 infosalt 参数来 derive multiple keys from a single password

  • 简单地用SHA256哈希是完全错误的,已经有彩虹table了,甚至在hashcat中也可以用于在 GPU 上进行大规模并行以典当您的密码。从不使用,

    在你的情况下,由于 AES 密钥不是随机的,攻击者不会去暴力破解 AES,他们会寻找你的 密码800K pawned list,可能还有基于知识的搜索。

选择一个好的密码

一个好的密码真的很重要,即使你使用非常强大的 PBKDF,比如最近的比赛冠军 Argon2。

一个人应该用dicewire or similarly Bip39 type password. xkc936很好地说明了这个想法。

有了好的密码,你甚至可以在设计糟糕的密码哈希登录机制中幸存下来,但是,你不能在 Facebook's openly stored password mechanism 上做得很好,他们真可耻!