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 解码步骤。
我正在开发一款游戏,该游戏将出于各种目的与 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 解码步骤。