Как работает кроссплатформенное шифрование AES?


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

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

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

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

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

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

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

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

Спасибо, Элайджа

Author: user1122069, 2011-12-30

2 answers

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

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

Рассматривая ваши три вопроса:

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

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

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

 6
Author: rossum, 2011-12-30 12:41:38

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

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

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

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

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

 0
Author: Jim Flood, 2016-05-02 19:03:05