1

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

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

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

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

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

4

1 回答 1

2

JWK 中的键是 base64 编码的(实际上是省略了填充的base64url )。

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

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

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

于 2020-11-04T03:08:19.460 回答