Obj-C: В CommonCrypto, если CCCrypt() не использует опцию kCCOptionPKCS7Padding, буфер результатов пуст.

Если я удалю kCCOptionPKCS7Padding, следующая функция вернет мне правильный размер буфера с пустыми данными шифрования ‹>. Я не могу использовать параметр kCCDecrypt для расшифровки пустого зашифрованного текста обратно в обычный текст.

    char keyPtr[kCCKeySizeAES128 + 1];
    memset(keyPtr, 0, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    char ivPtr[kCCBlockSizeAES128 + 1];
    memset(ivPtr, 0, sizeof(ivPtr));

    [iv getCString:ivPtr
         maxLength:sizeof(ivPtr)
          encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [self length];
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);

    size_t numBytesCrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                          kCCAlgorithmAES128,
                                          kCCOptionECBMode|kCCOptionPKCS7Padding,
                                          keyPtr,
                                          kCCBlockSizeAES128,
                                          ivPtr,
                                          [self bytes],
                                          dataLength,
                                          buffer,
                                          bufferSize,
                                          &numBytesCrypted);
   return [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];

Если kCCOptionPKCS7Padding отсутствует, механизм шифрования не работает. Таким образом, это выглядит обязательным, а не опциональным.
Мой вопрос:
Кто заставит CCCrypt() работать без PKCS7 Padding?


person Yi Jiang    schedule 19.07.2013    source источник


Ответы (1)


Это связано с блочным выравниванием входных данных. Если длина входных данных не является целым числом, кратным размеру блока шифрования, то для завершения финального блока необходимо будет добавить заполнение. Это обсуждается в заголовочном файле для CCCryptorUpdate (CCCrypt на самом деле CCCryptorCreate, CCCryptorUpdate, CCCryptorFinal и CCCryptorRelease, вызываемые последовательно):

При выполнении симметричного шифрования с блочными шифрами и включении заполнения с помощью kCCOptionPKCS7Padding общее количество байтов, предоставляемых всеми вызовами этой функции при шифровании, может быть произвольным (т. е. общее количество байтов не обязательно должно быть выравниваться по блокам). Однако, если заполнение отключено или при расшифровке, общее количество байтов должно быть выровнено по размеру блока; в противном случае CCCryptFinal() вернет kCCAlignmentError.

person Tark    schedule 19.07.2013
comment
По иронии судьбы, используя этот конвейер вручную, кажется, что выравнивание не требуется; только ярлык CCCrypt не работает. - person Raphael; 12.07.2017