Как работает кроссплатформенное шифрование AES? - PullRequest
5 голосов
/ 30 декабря 2011

Мне удалось успешно зашифровать и расшифровать AES-256 как в php, так и в объективном коде c. Я не буду публиковать здесь код, так как я пробовал много вариантов, и ни один не работает. Я понятия не имею, как работают эти функции шифрования ... AES - это стандартизированный алгоритм, поэтому, почему он не работает, я думаю, сводится к

а) iv
б) некоторая ошибка кодирования
или
c) различия в заполнении (не должны иметь значения для расшифровки).

Если у кого-то есть функции AES, которые работают как в php, так и в target-c, это было бы замечательно, но если нет, то любая помощь в понимании того, что вызывает эти различные результаты, была бы признательна.

Если вам нужен более узкий вопрос, он касается кодировок, iv и размера блока этого шифра AES.

1) Имеет ли значение какая кодировка используется в терминах ключа и открытого текста / зашифрованного текста? По сути, я предполагаю, что это не проблема с простым текстом, поскольку все символы, которые я бы использовал (по крайней мере, во время тестирования), являются стандартными символами ASCII. Но допустим, что строки php являются ASCII, и я использую UTF8 в target-c ... Я не знаю достаточно, чтобы сказать, использует ли php ASCII или байты, т.е. ключ будет отличаться между ними.

2) Насколько мне известно, в режиме ECB не используется iv (исправить, если не так). Режим CBC использует iv. В этом случае iv должен быть записан вместе с текстом шифра. Теперь этот ключ имеет длину 16 или 32 символа в php (в зависимости от размера блока 128 против 256). Это значит 16 или 32 байта? И будет ли строка 1234567890123456789012 одинаковой в ASCII и UTF8 при преобразовании в байты?

3) В чем разница между размером блока и размером ключа в терминах алогрифа? (снова поправьте, если ошиблись) В основном это все один и тот же алгоритм, просто разные параметры? И использование 256-битного ключа против 128-битного ключа - это вопрос только того, какой ключ передан

(Также обратите внимание, что я использовал кодировку base64 для передачи строк между приложениями для тестирования)

Спасибо, Илия

Ответы [ 2 ]

6 голосов
/ 30 декабря 2011

Чтобы расшифровка работала правильно, все должно быть точно таким же. Тот же ключ, тот же IV, тот же режим. В частности ключ должен быть одинаковым. Байт за байтом один и тот же. Бит за бит то же самое. AES не может правильно расшифровывать, если хотя бы один бит ключа неверен.

Читая ваш вопрос, я подозреваю, что ваша проблема связана с ключом. Ваш настоящий ключ не символы, это байты. Существует несколько различных способов перевода символов и байтов, что может привести к сбою расшифровки. Вы должны быть уверены, что две клавиши соответствуют байту для байта, а не символу для символа. По крайней мере, вам необходимо четко указать, какое отображение используется. Не полагайтесь на системные значения по умолчанию, поскольку они могут различаться в разных системах.

Глядя на ваши три вопроса:

1) Для кодирования открытого текста вы получите именно то, что вставили: вход UTF-8, выход UTF-8. Если вы хотите конвертировать в другую кодировку, вам придется делать это после расшифровки.

2) Вы правы в том, что ECB не нужен IV, но в режиме ECB происходит утечка информации, и его следует избегать. Вместо этого используйте режим CBC или CTR, один и тот же режим на обоих концах. IV привязан к размеру блока, поэтому для AES IV всегда составляет 16 байтов или 128 бит. Вы не можете гарантировать, что ASCII и UTF-8 будут одинаковыми. У UTF может быть спецификация в начале. ASCII может иметь нулевой байт в стиле C в конце. Не думайте с точки зрения символов, думайте с точки зрения байтов. Все должно совпадать на уровне байтов. В режиме CBC неисправный IV выскочит первый блок, но расшифрует последующие блоки ОК.

3) Размер блока фиксирован на 128 бит для AES и не может быть изменен. Размеры ключей менее ограничены и могут составлять 128, 192 или 256 бит. На практике большинство людей используют 128 или 256 бит. Блок - это удобный процессор, который встроен в шифр на очень низком уровне. Ключ определяет, что делается с блоком в процессе обработки. Это позволяет больше гибкости для ключа. Ключ, который вы вводите, используется для построения некоторых внутренних структур, «круглых ключей». Этот процесс называется расширением ключа. Это круглые ключи, которые взаимодействуют с обрабатываемым блоком. Поскольку ключ используется косвенно, он может быть более гибким в отношении его размера.

0 голосов
/ 02 мая 2016

Что касается кодирования ключа, IV, открытого текста и зашифрованного текста, шифрование AES не использует кодирование. AES-шифрование использует двоичные данные - последовательность 8-битных байтов.

Вам нужен тот же двоичный ключ, двоичный IV и двоичный зашифрованный текст на платформе дешифрования, чтобы создать исходный двоичный открытый текст.

Когда вы конвертируете между кодировками символов и двоичными, вам не всегда гарантируется двустороннее преобразование. То есть не все последовательности байтов могут быть преобразованы в строки символов UTF-8.

Однако, если вы обрабатываете открытый текст UTF-8 как двоичные данные и шифруете его, а затем переносите зашифрованный текст как двоичный файл , например, кодируя его как base64, чтобы сохранить двоичное представление данных затем, когда вы base64-декодируете для воссоздания двоичного зашифрованного текста на платформе дешифрования и расшифровываете, получающийся двоичный открытый текст будет исходными символьными данными UTF-8.

Всегда рассматривайте ключ, IV, открытый текст и зашифрованный текст как двоичные данные с точки зрения шифрования и дешифрования. Открытый текст - это двоичные данные, которые могут быть UTF-8, или каким-то вариантом ASCII, или UTF-16BE и т. Д. Зашифрованный текст, вероятно, не будет ни одним из них, или случайно окажется одним из них.

...