Шифрование 16 байтов UTF8 с помощью разрывов SecKeyWrapper (ccStatus == -4304)

Я использую Apple SecKeyWrapper Класс из примера кода CryptoExercise в документации Apple, чтобы сделать некоторое симметричное шифрование с AES128. Почему-то, когда я шифрую 1-15 символов или 17 символов, он шифрует и дешифрует правильно. С 16 символами я могу зашифровать, но при расшифровке выдает исключение после CCCryptorFinal позвонить с ccStatus == -4304, что указывает на ошибку декодирования. (Пойди разберись.)

Я понимаю, что AES128 использует 16 байтов на зашифрованный блок, поэтому создается впечатление, что ошибка связана с длиной открытого текста, попадающей на границу блока. Кто-нибудь сталкивался с этой проблемой, используя CommonCryptor или же SecKeyWrapper?

2 ответа

Решение

Следующие строки...

// We don't want to toss padding on if we don't need to
if (*pkcs7 != kCCOptionECBMode) {
  if ((plainTextBufferSize % kChosenCipherBlockSize) == 0) {
*pkcs7 = 0x0000;
  } else {
    *pkcs7 = kCCOptionPKCS7Padding;
  }
}

... виновники моей проблемы. Чтобы решить это, я просто должен был закомментировать их.

Насколько я могу судить, процесс шифрования не был заполнен на стороне шифрования, но тогда все еще ожидал заполнение на стороне дешифрования, что привело к сбою процесса дешифрования (что обычно и происходило).

Всегда использую kCCOptionPKCS7Padding шифрование / дешифрование работает для меня до сих пор, для строк, которые удовлетворяют length % 16 == 0 и те, которые этого не делают. И, опять же, это модификация SecKeyWrapper класс CryptoExercise пример кода. Не уверен, как это влияет на тех из вас, кто использует CommonCrypto с домашними обертками.

Я тоже столкнулся с этой проблемой, используя класс CommonCrypto, но для ЛЮБОЙ строки длиной, кратной 16.

Мое решение - полный взлом, так как я еще не нашел реального решения проблемы.

Я дополняю свою строку пробелом в конце, если он кратен 16. Это работает для моего конкретного сценария, поскольку дополнительное пространство в данных не влияет на получение данных на другой стороне, но я сомневаюсь, что это сработает для чей-либо сценарий.

Надеюсь, кто-то умнее может направить нас в правильном направлении к реальному решению.

Другие вопросы по тегам