JavaScript SubtleCrypto генерира 176-битови AES ключове вместо 128-битови?

Работя върху игра, която ще комуникира с 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, спирайки целия проект, докато това не бъде разрешено.


person IceMetalPunk    schedule 04.11.2020    source източник


Отговори (1)


Ключът във вашия JWK е кодиран с base64 (всъщност, base64url с пропусната подложка).

Ако декодирате тази J3SQ0IjwlJnJwu0EadenLg стойност, получавате следните байтове:

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

Това са 16 байта, така че 128 бита. Дължината на ключа е правилна, просто трябва да добавите допълнителна стъпка за декодиране на base64, преди да използвате ключа.

person Robby Cornelissen    schedule 04.11.2020
comment
хаха Подозирах това, но когато направих декодиране на base64, получавах 7-байтови изходи... може би това се дължи на разликата между base64 и base64url? Ще видя какво мога да направя за декодирането на това и ще публикувам, когато науча нещо (или успея). Благодаря. - person IceMetalPunk; 04.11.2020
comment
А-ха! Оказва се, че методът за декодиране base64, който използвах (вграден в езика), предполага, че декодирате низове с нулев край, така че когато ключът се декодира, за да включва нулев байт, той се повреди. Замених го с друга реализация на base64 и сега работи! Благодаря ти за помощта! - person IceMetalPunk; 04.11.2020