2012-05-22 3 views
1

Я использую следующий код для дешифрования файла, зашифрованного, файл был зашифрован с использованием приложения JAVA.AES Расшифровка с использованием ObjectiveC

Cipher.h файл

#import <Foundation/Foundation.h> 
#import <CommonCrypto/CommonCryptor.h> 
#import <CommonCrypto/CommonDigest.h> 

@interface Cipher : NSObject { 
    NSString *cipherKey; 
} 

@property (retain) NSString *cipherKey; 

- (Cipher *) initWithKey:(NSString *) key; 

- (NSData *) encrypt:(NSData *) plainText; 
- (NSData *) decrypt:(NSData *) cipherText; 

- (NSData *) transform:(CCOperation) encryptOrDecrypt data:(NSData *) inputData; 

+ (NSData *) md5:(NSString *) stringToHash; 

@end 

Cipher.m файл

#import "Cipher.h" 

@implementation Cipher 

@synthesize cipherKey; 

- (Cipher *) initWithKey:(NSString *) key { 
    self = [super init]; 
    if (self) { 
     [self setCipherKey:key]; 
    } 
    return self; 
} 

- (NSData *) encrypt:(NSData *) plainText { 
    return [self transform:kCCEncrypt data:plainText]; 
} 

- (NSData *) decrypt:(NSData *) cipherText { 
    NSData *returnData = [[NSData alloc] init]; 
    returnData = [self transform:kCCDecrypt data:cipherText]; 

    return returnData; 
} 

- (NSData *) transform:(CCOperation) encryptOrDecrypt data:(NSData *) inputData { 

    // kCCKeySizeAES128 = 16 bytes 
    // CC_MD5_DIGEST_LENGTH = 16 bytes 
    NSData* secretKey = [Cipher md5:cipherKey]; 

    CCCryptorRef cryptor = NULL; 
    CCCryptorStatus status = kCCSuccess; 

    uint8_t iv[kCCBlockSizeAES128]; 
    memset((void *) iv, 0x0, (size_t) sizeof(iv)); 

    status = CCCryptorCreate(encryptOrDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, 
          [secretKey bytes], kCCKeySizeAES128, iv, &cryptor); 

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

    size_t bufsize = CCCryptorGetOutputLength(cryptor, (size_t)[inputData length], true); 

    void * buf = malloc(bufsize * sizeof(uint8_t)); 
    memset(buf, 0x0, bufsize); 

    size_t bufused = 0; 
    size_t bytesTotal = 0; 

    status = CCCryptorUpdate(cryptor, [inputData bytes], (size_t)[inputData length], 
          buf, bufsize, &bufused); 

    if (status != kCCSuccess) { 
     free(buf); 
     CCCryptorRelease(cryptor); 
     return nil; 
    } 

    bytesTotal += bufused; 

    status = CCCryptorFinal(cryptor, buf + bufused, bufsize - bufused, &bufused); 

    NSLog(@"Status-3: %d", status); 
    if (status != kCCSuccess) { 
     free(buf); 
     CCCryptorRelease(cryptor); 
     return nil; 
    } 
    bytesTotal += bufused; 

    CCCryptorRelease(cryptor); 

    return [NSData dataWithBytesNoCopy:buf length:bytesTotal]; 
} 

+ (NSData *) md5:(NSString *) stringToHash { 

    const char *src = [stringToHash UTF8String]; 

    unsigned char result[CC_MD5_DIGEST_LENGTH]; 

    CC_MD5(src, strlen(src), result); 

    return [NSData dataWithBytes:result length:CC_MD5_DIGEST_LENGTH]; 
} 

@end 

Это, как я декодировать зашифрованные данные:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory1 = [paths objectAtIndex:0]; 
    NSString *getImagePath = [documentsDirectory1 stringByAppendingPathComponent:@"Blue.jpg"]; 
    NSData *objNSData1 = [NSData dataWithContentsOfFile:getImagePath]; 

    Cipher *objCipher= [[Cipher alloc] initWithKey:@"1234567891234567"]; 

    NSData *decryptedData = [[NSData alloc] init]; 

    decryptedData = [objCipher decrypt:objNSData1]; 

    NSLog(@"%@", decryptedData); 

    myImage.image = [UIImage imageWithData:decryptedData]; 

} 

дешифрование не работает успешно и возврат 4304 ошибка.

+0

Попробуйте [ это] (http://tharindufit.wordpress.com/2011/12/15/aes128-encryption-in-ios-and-decryption-in-php/), или [это] (http: //blog.objectgraph. com/index.php/2010/04/20/encrypting-decrypting-base64-encode-decode-in-iphone-objective-c /) [я использовал это] (http://iphonedevelopment.blogspot.in/2009/ 02/сильного шифрования для какао-какао-touch.html) – Ronak

ответ

2

Я знаю, что это было создано кодом Java. Если у вас есть какой-либо контроль над этим кодом, вы должны понимать, что используемый протокол очень небезопасен. Он неправильно генерирует ключ (MD5 не является хорошим PBKDF) и неправильно генерирует IV. В сочетании с отсутствием HMAC, он подвергается нескольким видам нападения. См. Properly encrypting with AES with CommonCrypto для получения полной информации о том, как их правильно установить, и RNCryptor enter link description here для примера реализации.

К вашей конкретной проблеме возникают проблемы с расшифровкой данных, которые зашифрованы, или у вас возникли проблемы с расшифровкой данных, которые зашифрованы Java? Возможно, у вас есть несоответствие с Java.

Вы должны проверить, идет ли ошибка на этапе обновления или завершения. Если на этапе обновления вы настроили что-то неправильно. Если на последнем этапе вы должны начать с проверки правильности заполнения. Конец документа должен быть дополнением PKCS # 7. Это означает, что оно должно заканчиваться одним из следующих последовательностей (если расшифрованный размер не точно делится на 16):

01 
02 02 
03 03 03 
04 04 04 04 
... 

Конечный размер всего зашифрованных данных должна быть кратна 16.

Смежные вопросы