128-битное шифрование AES возвращает null в Objective-C

Я пытаюсь зашифровать строку, используя 128-битное шифрование AES, но преобразованные зашифрованные данные при преобразовании в строку всегда возвращают значение null.

NSString *iv = @"fedcba9876543210";
NSString *key = @"0123456789abcdef";
- (NSData *)AES128EncryptWithKey
{
char keyPtr[kCCKeySizeAES128 + 1];
bzero( keyPtr, sizeof( keyPtr ) );

[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, kCCOptionECBMode | kCCOptionPKCS7Padding,
                                      keyPtr, kCCKeySizeAES128,
                                      NULL ,
                                      [self bytes], dataLength,
                                      buffer, bufferSize,
                                      &numBytesEncrypted );
if( cryptStatus == kCCSuccess )
{
    return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
}

Это моя функция шифрования.

NSData *data = [@"String to encrypt" dataUsingEncoding:NSUTF8StringEncoding];

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

encryptedData = [data AES128EncryptWithKey];

NSLog(@"Encrypted Data Length %d", [encryptedData length]);

if (encryptedData != nil)
{
    NSString* myString;
    myString = [[NSString alloc] initWithData:encryptedData encoding:NSUTF8StringEncoding];
    NSString* newStr = [NSString stringWithUTF8String:[encryptedData bytes]];
}

После шифрования длина данных шифрования сообщается как 16, но после преобразования в NSString возвращается нуль. Если я использую stringWithUTF16String для его преобразования, он возвращается как «軽ﶁែ뼐끨驂퐇». В чем проблема?


person itdeeps    schedule 24.08.2013    source источник
comment
Не углубляясь в код, вы не можете кодировать NSData как NSString таким образом без потери данных (UTF-8 не допускает определенных комбинаций байтов и просто не будет декодировать то же самое). Результат двоичный, а не буквенно-цифровой, поэтому ваш результат UTF16 выглядит вполне разумным. Вы можете захотеть перебрать NSData, добавляя шестнадцатеричную версию каждого байта к строке для каждой итерации, если вам это нужно в читаемом формате.   -  person Joachim Isaksson    schedule 24.08.2013
comment
Спасибо за ваш ответ. вы имеете в виду вот так: unichar* hexChars = (unichar*)malloc(sizeof(unichar) * (data.length*2)); unsigned char* bytes = (unsigned char*)data.bytes; for (NSUInteger i = 0; i ‹ data.length; i++) { unichar c = bytes[i] / 16; если (c ‹ 10) c += '0'; иначе с += 'а' - 10; шестнадцатеричные символы[i*2] = с; с = байты[i]% 16; если (c ‹ 10) c += '0'; иначе с += 'а' - 10; шестнадцатеричные символы[i*2+1] = с; } NSString* retVal = [[NSString alloc] initWithCharactersNoCopy:hexChars length:data.length*2 freeWhenDone:YES];   -  person itdeeps    schedule 24.08.2013


Ответы (1)


Наконец-то я понял. Как предложил Иоахим, я использовал следующий метод, и он сработал.

unichar* hexChars = (unichar*)malloc(sizeof(unichar) * (data.length*2));
unsigned char* bytes = (unsigned char*)data.bytes;
for (NSUInteger i = 0; i < data.length; i++) {
    unichar c = bytes[i] / 16;
    if (c < 10) c += '0';
    else c += 'a' - 10;
    hexChars[i*2] = c;
    c = bytes[i] % 16;
    if (c < 10) c += '0';
    else c += 'a' - 10;
    hexChars[i*2+1] = c;
}
NSString* retVal = [[NSString alloc] initWithCharactersNoCopy:hexChars
                                                       length:data.length*2
                                                 freeWhenDone:YES];
person itdeeps    schedule 24.08.2013