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 перед использованием ключа.