Вопрос по objective-c, encryption, iphone, ios – Расшифровка AES с использованием ObjectiveC

1

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

Файл 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 ошибка.

Пытатьсяthis , или жеthis i have used this Ronak

Ваш Ответ

1   ответ
2

что это было сгенерировано кодом Java. Если у вас есть какой-либо контроль над этим кодом, то вы должны понимать, что используемый им протокол крайне небезопасен. Он неправильно генерирует ключ (MD5 не является хорошим PBKDF) и неправильно генерирует IV. В сочетании с отсутствием HMAC, он подвержен нескольким видам атак. УвидетьПравильное шифрование с помощью AES с помощью CommonCrypto для получения полной информации о том, как правильно их установить, и RNCryptorвведите описание ссылки здесь для примера реализации.

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

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

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

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

Похожие вопросы