Usando CommonCrypto com um IV, mas sempre retornando nulo

Estou usando o CommonCrypto CCCryptorCreate para descriptografar uma mensagem. Estou usando uma senha e um IV, mas ele sempre retorna nulo.

Se eu usar o CCCryptorCreate para descriptografar, mas não usar um IV durante a criptografia no lado do RUBY e não usar o IV no lado do decodificador obj-c, a descriptografia funcionará perfeitamente e eu posso ver a mensagem.

Mas se eu usar um IV no RUBY e IV no lado do objeto, a descriptografia termina com um objeto de mensagem nula.

Eu estou usando issoCriptografar em Objective-C / Descriptografar em Ruby usando qualquer coisa

Método OBJ-C:

    - (NSData *) decryptedDataUsingAlgorithm: (CCAlgorithm) algorithm
                                         key: (id) key      // data or string
                        initializationVector: (id) iv       // data or string
                                     options: (CCOptions) options
                                       error: (CCCryptorStatus *) error
    {
        CCCryptorRef cryptor = NULL;
        CCCryptorStatus status = kCCSuccess;

        NSParameterAssert([key isKindOfClass: [NSData class]] || [key isKindOfClass: [NSString class]]);
        NSParameterAssert(iv == nil || [iv isKindOfClass: [NSData class]] || [iv isKindOfClass: [NSString class]]);

        NSMutableData * keyData, * ivData;
        if ( [key isKindOfClass: [NSData class]] )
            keyData = (NSMutableData *) [key mutableCopy];
        else
            keyData = [[key dataUsingEncoding: NSUTF8StringEncoding] mutableCopy];

        if ( [iv isKindOfClass: [NSString class]] )
            ivData = [[iv dataUsingEncoding: NSUTF8StringEncoding] mutableCopy];
        else
            ivData = (NSMutableData *) [iv mutableCopy];    // data or nil

        #if !__has_feature(objc_arc)
            [keyData autorelease];
            [ivData autorelease];
        #endif

        // ensure correct lengths for key and iv data, based on algorithms
        FixKeyLengths( algorithm, keyData, ivData );

        status = CCCryptorCreate( kCCDecrypt, algorithm, options,
                               [keyData bytes], [keyData length], [ivData bytes],
                               &cryptor );

        if ( status != kCCSuccess )
        {
            if ( error != NULL )
                *error = status;
            return ( nil );
        }

        NSData * result = [self _runCryptor: cryptor result: &status];
        if ( (result == nil) && (error != NULL) )
            *error = status;

        CCCryptorRelease( cryptor );

        return ( result );
    }




=== DOES NOT WORK ====
NSData * result = [self decryptedDataUsingAlgorithm: kCCAlgorithmAES128
                                                key: [[password dataUsingEncoding:NSUTF8StringEncoding] SHA256Hash]
                               initializationVector: [anIV dataUsingEncoding:NSUTF8StringEncoding]
                                            options: kCCOptionPKCS7Padding
                                              error: &status];


=== DOES WORK ===
NSData * result = [self decryptedDataUsingAlgorithm: kCCAlgorithmAES128
                                                key: [[password dataUsingEncoding:NSUTF8StringEncoding] SHA256Hash]
                               initializationVector: nil
                                            options: kCCOptionPKCS7Padding
                                              error: &status];

questionAnswers(1)

yourAnswerToTheQuestion