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, что приводит к остановке всего проекта, пока проблема не будет решена.

1 ответ

Решение

Ключ в вашем JWK закодирован в кодировке base64 (фактически, base64url с опущенным заполнением).

Если вы расшифруете это J3SQ0IjwlJnJwu0EadenLg значение, вы получите следующие байты:

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

Это 16 байт, значит, 128 бит. Длина ключа правильная, вам просто нужно добавить дополнительный шаг декодирования base64 перед использованием ключа.

Другие вопросы по тегам