Использование CommonCrypto с IV, но всегда возвращает ноль
Я использую CommonCrypto CCCryptorCreate для расшифровки сообщения. Я использую пароль и IV, но он всегда возвращает ноль.
Если я использую CCCryptorCreate для расшифровки, но не использую IV во время шифрования на стороне RUBY и не использую IV на стороне расшифровки obj-c, тогда дешифрование работает отлично, и я вижу сообщение.
Но если я использую IV на RUBY и IV на стороне obj-c, расшифровка заканчивается нулевым объектом сообщения.
Я использую этоЗашифруйте в Objective-C / Расшифруйте в Ruby, используя что-либо
Метод 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];