Шифрование 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. Это работает для моего конкретного сценария, поскольку дополнительное пространство в данных не влияет на получение данных на другой стороне, но я сомневаюсь, что это сработает для чей-либо сценарий.
Надеюсь, кто-то умнее может направить нас в правильном направлении к реальному решению.