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

问题描述

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

调查发现,即使我指定的AES密钥长度为128,通过(window.crypto.subtle.generateKey生成的AES密钥也只有176位长。我以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解码步骤即可。