我正在开发一个游戏,它将与NodeJS服务器进行各种用途的通信,目前我正试图在请求的有效负载上实现一些AES加密。在服务器和用JS制作的测试工具之间进行测试时,一切工作正常,但是当我尝试将客户端代码移植到另一种没有Web 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位,就会抛出错误,整个项目将陷入停顿,直到这个问题得到解决。
发布于 2020-11-04 11:08:19
JWK中的键是base64编码的(实际上是省略填充的base64url )。
如果对J3SQ0IjwlJnJwu0EadenLg值进行解码,则会得到以下字节:
27 74 90 D0 88 F0 94 99 C9 C2 ED 04 69 D7 A7 2E 那是16个字节,所以是128位。密钥长度是正确的,在使用密钥之前,只需要添加一个base64解码步骤即可。
https://stackoverflow.com/questions/64673699
复制相似问题