2015-08-26 3 views
1

Я пытаюсь зашифровать строку в Xcode для PHP с помощью метода AES128, используя следующий код:шифрования AES не работает (Xcode)

Xcode

- (NSData*)AES256EncryptWithKey:(NSString*)key { 
    char keyPtr[kCCKeySizeAES256]; 

    [key cStringUsingEncoding:NSASCIIStringEncoding]; 

    NSString *iv = @"fdsfds85435nfdfs"; 
    char ivPtr[kCCKeySizeAES128]; 

    [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSASCIIStringEncoding]; 

    NSUInteger dataLength = [self length]; 

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

    size_t numBytesEncrypted = 0; 
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, NULL, 
              keyPtr, kCCKeySizeAES256, 
              ivPtr, 
              [self bytes], dataLength, 
              buffer, bufferSize, 
              &numBytesEncrypted); 

    if (cryptStatus == kCCSuccess) 
    { 
     return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; 
    } 

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

Но когда я запускаю выше кодирования, после результат не то, что я ожидал, что:

NSString *key = @"89432hjfsd891787"; 

NSData *plaintext = [[@"aaa0000000000000" dataUsingEncoding:NSASCIIStringEncoding] AES256EncryptWithKey: key]; 

NSString *mystring = [[NSString alloc] initWithData:plaintext encoding:NSASCIIStringEncoding]; 
NSLog(@"mystring %@", mystring); 

ВЫВОД является

uçó) â½S/èR

Что я хочу, чтобы это было так.

m9FNGM9IiwibWFjIjoiNmJkYzNmZTA5

+0

BTW, Xcode - просто причудливый редактор/компилятор/отладчик. Код в этом случае - Objective-C. – zaph

ответ

0

Примечание: из-за ошибки кодирования keyPtr является не установлен к значению key, становится значением неинициализированного памяти.

Вы получаете «uçó» âЅS/èRÅ », потому что вы пытаетесь создать строку из данных, и есть несколько причин, по которым это не сработает.

  1. Многие байты данных не отображаются на печатные символы ASCII или на любой символ юникода.
  2. Байт данных может быть 0 (1 из 256 байтов в среднем будет 0x00), и это терминатор для строки «C», поэтому строка будет коротка.

Существуют два основных соглашения для кодирования данных в строковое представление:

  1. шестигранных-ASCII, где каждый байт данных кодируется в два символа 0-9a-F.
  2. Base64, где каждый 3 байта данных данных кодируются в 4 символа ASCII.

Вы, вероятно, ищет для кодирования Base64:

NSString *mystring = [plaintext base64EncodedStringWithOptions:0]; 

Другие ошибки в коде:

  1. [key cStringUsingEncoding:NSASCIIStringEncoding]; Строка не может быть ASCII, лучше использовать NSUTF8StringEncoding. Обратите внимание, что вывод не записывается.
  2. keyPtr никогда не устанавливается на значение ключа, см. Выше.
  3. Идентификатор размера ключа, указанный как 256-битные (32 байта), но ключ имеет 16 символов, используйте размер ключа, который соответствует ключу.
  4. char ivPtr[kCCKeySizeAES128], размер iv размер блока не размер ключа: kCCBlockSizeAES128.
+0

Хорошее объяснение, спасибо. – ppshein

+0

Кстати, могу ли помочь мне написать полную кодировку здесь? – ppshein

+0

Подумав об этом, я откажусь. Это связано с тем, что есть много проблем, которые необходимо решить, и для них потребуется много вопросов/ответов. Вы хотите, чтобы безопасная реализация получила эксперта в области безопасности (да, они захотят получить оплату, а не меня). Это вы просто хотите чувствовать себя в безопасности, это обычный уровень безопасности. Шифрование - это компонент безопасности, безопасность - это не просто шифрование. – zaph

0

Похоже, вы хотите кодировкой Base64 строку.

NSString *mystring = [plaintext base64EncodedStringWithOptions:0]; 
+0

Но когда я меняю строку на «this is testing», возврат возвращается к null. – ppshein

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