Как заставить CCCrypt вычислять AES в другом режиме?

Сигнатура одноразового криптографического метода CCCrypt такова (из CommonCryptor.h):

CCCryptorStatus CCCrypt(
    CCOperation op,         /* kCCEncrypt, etc. */
    CCAlgorithm alg,        /* kCCAlgorithmAES128, etc. */
    CCOptions options,      /* kCCOptionPKCS7Padding, etc. */
    const void *key,
    size_t keyLength,
    const void *iv,         /* optional initialization vector */
    const void *dataIn,     /* optional per op and alg */
    size_t dataInLength,
    void *dataOut,          /* data RETURNED here */
    size_t dataOutAvailable,
    size_t *dataOutMoved)

Кажется, ни один из параметров не принимает значение CCMode (может быть, незаметно, поскольку все перечисления являются целыми числами?). Я пробовал комбинировать его с параметром CCOptions, но безрезультатно; два перечисления не являются вариантами и не сочетаются однозначно.

Там это явно не задокументировано, но из того, что я нахожу в Интернете, я предполагаю, что режим, используемый с kCCAlgorithmAES, - это CBC.

Как я могу изменить режим AES, который использует CCCrypt?


person Raphael    schedule 12.07.2017    source источник
comment
Реализовать другие режимы довольно просто, если у вас есть доступ к ECB или CBC. Единственная проблема состоит в том, чтобы правильно реализовать счетчик, который зашифрован для каждого блока.   -  person Artjom B.    schedule 12.07.2017
comment
@ArtjomB. Да, нет, я не буду заниматься криптографическими методами самостоятельно. Так лежат только гибель и безумие.   -  person Raphael    schedule 12.07.2017
comment
@zaph - я ожидал, что ты ответишь на этот вопрос. У вас нет криптобиблиотеки на основе Apple Common Crypto?   -  person jww    schedule 14.07.2017


Ответы (1)


В документации говорится:

CCCrypt Однократная операция шифрования или дешифрования без сохранения состояния. Это в основном выполняет последовательность CCCrytorCreate() [sic], CCCryptorUpdate(), CCCryptorFinal() и CCCryptorRelease().

Теперь CCCryptorCreate, похоже, тоже не принимает параметр режима; на самом деле мы см. что CBC действительно жестко запрограммирован (кроме того, несколько произвольного, который позволяет нам использовать ECB):

/* Determine mode from options - old call only supported ECB and CBC 
   we treat RC4 as a "mode" in that it's the only streaming cipher
   currently supported 
*/
if(alg == kCCAlgorithmRC4) mode = kCCModeRC4;
else if(options & kCCOptionECBMode) mode = kCCModeECB;
else mode = kCCModeCBC;

Если мы хотим использовать другой режим, мы должны использовать CCCryptorCreateWithMode. Так что, к сожалению, изменить режим CCCrypt не представляется возможным.

person Raphael    schedule 12.07.2017