Итак, должно ли быть нормально, если я использую SHA256, генерирую 256-битный ключ, а затем разделяю шестнадцатеричную строку ключа поровну на 2 части и использую первую часть в качестве IV в 256-битном шифровании AES?
Нет, есть способы лучше.
Прежде всего, когда вы создаете ключ, вам нужен криптографически безопасный генератор случайных чисел. если ты вывести ключ из главного секрета — иногда называемый начальным числом — вам нужна функция деривации ключа или KDF. В последнем случае вы могли бы, например. используйте HKDF с хорошим хэшем, например SHA-256. В принципе, вы можете создать, например. 384-битный вывод с использованием HKDF - даже при использовании SHA-256, но я не думаю, что это хорошая идея из-за следующей части ответа.
Во-вторых, повторное использование комбинации клавиш / IV не является хорошей идеей; в зависимости от режима и сообщения может произойти утечка только некоторых данных или всего сообщения.
В общем, вы можете просто использовать нулевой IV, если ключ генерируется случайным образом для каждого сообщения. Это было бы лучше, чем повторное использование части ключа. Как указано, IV обычно не считается секретным, поэтому, если вы используете ключевые данные в качестве реализации IV, вполне может произойти их утечка».
Если вам нужно зашифровать несколько сообщений одним и тем же ключом, вы можете использовать синтетический IV или SIV. Таким образом, вы могли бы утечь данные только в том случае, если сообщения полностью идентичны, за счет некоторой производительности, поскольку режимы SIV являются многопроходными (сообщения должны обрабатываться дважды).
В общем, вы должны просто использовать рандомизированный IV и отправить его с зашифрованным текстом. Из вопроса не ясно, было ли это учтено; это был бы самый распространенный способ обращения с IV поколением.
Наконец, клавиши не буквенно-цифровые; они состоят из битов. Каждый раз, когда ключ переводится в текст, вы открываете проблему безопасности. Так что не делайте этого: сохраняйте ключи бинарными.Я бы предпочел использовать AES-128 с полностью случайным ключом и использовать остальные 128 бит для IV, чем вернуться к использованию шестнадцатеричных чисел.
Шестнадцатеричные числа полезны только для потребления человеком, например. во время тестирования или отладки, когда речь идет о секретных ключах.