А, да, я пропустил этот момент. Рандомный сессионный ключ конечно нельзя использовать как AES-ключ. Правильная схема такая: AES-ключ вообще не трогаем (он всегда одинаковый), а рандомную строку используем для генерации chacha20-последовательности (точнее, двух - одну для C>S и вторую для S>C отправок) с которой делаем xor перед aes-шифрованием и после aes-дешифрования.
Ну или вместо chacha20 можно использовать другой криптографический рандом-генератор, но особого смысла не вижу. Раньше использовали rc4.
Сессионный ключ лучше генерить DH, потому что такой ключ не сможет воспроизвести третья сторона, даже если она раздобудет AES ключ.
Если тебе это не важно, то лучше взять готовый AES-CGM, там и иммитовставка, и IV.