Обновление шифра Java против обновления IOS CommonCrypto

Я разрабатываю приложение для Android и IOS

Для Android я использую шифр AES/CBC/NoPadding, а для IOS использую CommonCrypto с тем же алгоритмом/режимом/заполнением, что и Android

Я инициализирую шифры с помощью общего ключа, чтобы получить одинаковый результат на обеих платформах

В Android я использую cipher.update(inpBuf, inpOffset, inpLen, outBuf, outOffset) для целей шифрования/дешифрования, так же, как я хочу сделать это в IOS.

Я пробовал CCCryptorUpdate в IOS, но массив результатов был [0,0,0......0]

Пожалуйста, направьте меня, где я ошибся?


person Hitesh    schedule 18.06.2016    source источник
comment
Если ваши данные для шифрования всегда не кратны размеру блока (16 байт для AES), вам необходимо добавить заполнение. Это можно сделать вручную (не рекомендуется) или с помощью прилагаемой опции заполнения, такой как PKCS#7 (урожденная PKCS#5).   -  person zaph    schedule 18.06.2016


Ответы (1)


AES — это блочный шифр, который шифрует данные порциями по 16 байт. При вызове update() все блоки по 16 байт будут зашифрованы, а любые лишние байты будут ждать до следующего вызова update(). Когда данные больше не нуждаются в шифровании, вы завершаете шифрование с помощью doFinal(), который сбрасывает последний блок + и применяет все необходимые дополнения. Почему вы используете NoPadding? Вы сами гарантируете, что ваши данные соответствуют размеру блока AES?

При расшифровке в IOS вы используете соответствующие CCCryptorUpdate() и CCCryptorFinal(). Только после CCCryptorFinal() у вас будет полное расшифрованное сообщение. CCCryptorUpdate() может возвращать или не возвращать данные, в зависимости от того, сколько данных застряло в буфере и т. д.

person Ebbe M. Pedersen    schedule 18.06.2016
comment
Существует также одноразовая функция CCCrypt, которую можно использовать вместо вызовов CCCryptorCreate, CCCryptorUpdate(), CCCryptorFinal() и CCCryptorRelease. - person zaph; 18.06.2016