2012-04-05 3 views
1

Я использую CCCrypt для строковых значений шифрования/дешифрования. Кажется, что это нормально, потому что дешифрованное значение равно первому, но проблема в том, что я не могу извлечь из NSTtring объект из дешифрованных данных.CCCrypt проблема с выдачей шифрования

@implementation NSData (AES256) 

- (NSData *)AES256EncryptWithKey:(NSString *)key 
{ 
    char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused) 
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) 

    // fetch key data 
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; 

    NSUInteger dataLength = [self length]; 

    size_t bufferSize = dataLength + kCCBlockSizeAES128; 
    void *buffer = malloc(bufferSize); 

    size_t numBytesEncrypted = 0; 
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, 
             keyPtr, kCCKeySizeAES256, 
             NULL /* initialization vector (optional) */, 
             [self bytes], dataLength, /* input */ 
             buffer, bufferSize, /* output */ 
             &numBytesEncrypted); 
    if (cryptStatus == kCCSuccess) { 
     return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; 
    } 

    free(buffer); //free the buffer; 
    return nil; 
} 

- (NSData *)AES256DecryptWithKey:(NSString *)key { 
    char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused) 
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) 

    // fetch key data 
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; 

    NSUInteger dataLength = [self length]; 

    size_t bufferSize = dataLength + kCCBlockSizeAES128; 
    void *buffer = malloc(bufferSize); 

    size_t numBytesDecrypted = 0; 
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, 
             keyPtr, kCCKeySizeAES256, 
             NULL /* initialization vector (optional) */, 
             [self bytes], dataLength, /* input */ 
             buffer, bufferSize, /* output */ 
             &numBytesDecrypted); 

    if (cryptStatus == kCCSuccess) { 
     //the returned NSData takes ownership of the buffer and will free it on deallocation 
     return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted]; 
    } 

    free(buffer); //free the buffer; 
    return nil; 
} 

Я не могу получить то, что сделано неправильно, поэтому, если кто-то может помочь, я очень признателен этому.

И вторая часть вопроса - как установить режим CBC для метода шифрования AES. В документации говорится, что этот режим используется по умолчанию, но что я должен передать в качестве третьего аргумента в методе CCCrypt?

ответ

1

Обращаясь вопрос, который вы комментировали в предыдущем ответе, функция initWithData:encoding: вернет nil, потому что зашифрованные данные очень маловероятно, чтобы совпасть с NSUTF8StringEncoding, учитывая тот факт, что он зашифрован.

Тот же вопрос с тщательным ответом: Why does my initWithData return nil indicating an error after converting NSData to NSString returning from encrypting via CommonCrypto?, хотя в качестве базы в стороне base64 не делает ваши зашифрованные данные видимой строкой, а изменяет ее дальше, чтобы сделать отображаемую строку ASCII. Эта строка не должна считаться такой же, как зашифрованные данные, и не такой, как шифрование данных, но для использования в виде строки, например, в цепочке ключей, она работает нормально.

+0

Спасибо, что доказали мои предложения! :) – Solomiya

0

Чтобы получить точную строку после дешифрования, вы должны декодировать base64 Decrypted Data, а затем создать NSString с использованием NSUTF8StringEncoding.

NSString decryptedString = [[NSString alloc]initWithData:decryptedData]; 

    NSData *data = [NSData dataByBase64DecodingString:decryptedString]; 

    decryptedString = [data dataUsingEncoding:NSUTF8StrinEncoding]; 

decryptedString удерживайте строку как то же самое перед шифрованием.

Для декодирования base64 см. this пост.

+0

Расшифрованная строка точно такая же, как и должно быть. Проблема в том, что я не могу видеть зашифрованные данные, как строку, - когда я делаю 'NSString * encryptedString = [[NSString alloc] initWithData: encryptedData encoding: NSUTF8StringEncoding];' и печатать эти 'encryptedString' Я получаю' (null) '' , Или это не способ, которым я не должен заглядывать в зашифрованные данные или что-то в этом роде? – Solomiya

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