JavaScript SubtleCrypto 生成 176 位 AES 密钥而不是 128 位?

JavaScript SubtleCrypto generating 176-bit AES keys instead of 128-bit?

我正在开发一款游戏,该游戏将出于各种目的与 NodeJS 服务器进行通信,目前我正在尝试对请求有效负载实施一些 AES 加密。在服务器和用 JS 制作的测试工具之间进行测试时一切正常,但是当我尝试将客户端代码移植到另一种没有 Web Crypto / Subtle Crypto 实现的语言时,我开始收到有关 AES 密钥的错误长度。

查看后,我发现生成的 AES 密钥(通过 window.crypto.subtle.generateKey)的长度为 176 位,即使我指定的 AES 密钥长度为 128。我正在以 JWK 格式导出密钥,奇怪的是算法列为A128CBC,提示应该是128位。

因为无论如何我都会生成一个新密钥,所以我毫不犹豫地在此处发布有问题的导出 JWK:

{
  "alg": "A128CBC",
  "ext": true,
  "k": "J3SQ0IjwlJnJwu0EadenLg",
  "key_ops": [
    "encrypt",
    "decrypt"
  ],
  "kty": "oct"
}

谁能解释这额外的 6 个字节是从哪里来的?移植客户端上的 AES 实现需要 128 位密钥,如果不是 128 位密钥,则会抛出错误,使整个项目陷入停顿,直到问题得到解决。

您的 JWK 中的密钥是 base64 编码的(实际上,base64url 省略了填充)。

如果您对该 J3SQ0IjwlJnJwu0EadenLg 值进行解码,您将获得以下字节:

 27 74 90 D0 88 F0 94 99 C9 C2 ED 04 69 D7 A7 2E 

那是 16 个字节,所以是 128 位。密钥长度正确,您只需在使用密钥之前添加额外的 base64 解码步骤。