encryption - AES-128 可以有一个 15 长 ASCII 字符的密钥吗?
问题描述
我正在尝试解密一个加密的 h264 I 帧,我得到了一个长度为 15 的密钥,这是否有效?
它的长度不应该是 16,所以二进制表示应该是 128 位?
解决方案
如果您有可以在键盘上键入的内容,那么无论长度如何,这都不是正确的 AES 密钥。AES 的强大之处在于其密钥实际上是随机的。您可以在键盘上键入的任何内容都不是等效长度的有效随机序列。您可以在拉丁风格的键盘上轻松输入大约 96 个字符。一个字节有 256 个值。96^16 是 256^16 的一小部分。
要将人类可以键入的“密码”转换为有效的随机 AES 密钥,您需要一个基于密码的密钥派生函数 (PBKDF)。最著名和最广泛使用的是PBKDF2。还有其他优秀的 PBKDF,包括scrypt和Argon2。所有这些都需要随机盐,并且所有(在密码学术语中)计算速度都非常慢。
也就是说,关于您的框架,无法猜测他们如何将此字符串转换为密钥。您必须查阅文档或实施。将字符串转换为键的方法有无数种(其中大多数都很糟糕,但仍有无限的选择可供选择)。正如 Michael Fehr 指出的那样,他们可能做了一些不安全的事情,比如用零填充。他们可能还使用了像 SHA-256 这样的简单散列函数,或者使用 256 位密钥,或者采用顶部或底部 128 位。或者……几乎是其他任何东西。这里没有常见的做法。每个加密系统都必须记录它是如何实现的。
(请注意,即使您看到“AES-128”,这也是模棱两可的。它可以表示“带有 128 位密钥的 AES”,也可以表示“带有 128 位块和 128、192 或256 位。”虽然前者的含义更常见,但后者经常出现,例如在 Apple 文档中,尽管是多余的(AES 总是有一个 128 位块)。所以即使是“密钥有多长”这样的问题需要深入研究文档或实现。不幸的是,密码学非常不标准化。)
推荐阅读
- php - 代码在邮递员中有效,但在脚本中无效 - 最多 47(20)个重定向
- reactjs - 使用导出默认值时反应导入错误
- jestjs - TypeORM 和 NestJS:在 e2e 测试开始时创建数据库表
- laravel - 密钥路径“file:///app/storage/oauth-private.key”不存在或不可读
- asp.net-core-mvc - MVC 向视图传递数据
- node.js - 如何从 NodeJS 中的函数返回 Post 请求的响应?
- charts - 用于记录 EVMS 图表的 Graphviz
- javascript - 为什么在我的 if 语句之后我的警报不起作用?
- html - Bootstrap 特色宽卡
- asp.net - 使用 Octokit 使用 Asp.net Core Razor 列出 Github 上所有 repos 中的所有提交