Результат нулевой при преобразовании nsstring в nsdictionary

У меня есть зашифрованная строка с сервера следующим образом:

4gtFiu1DVK2MKGHcFtbuR4spdrhAixptPH0wz2n2VlawBWKlDE/I9m1K4GsBdBH8MJuzhiVHvQy0PYvvcCWuQv6dE1OHzflW3mN3jbEVLrodXvZVnafyo8Lmn6i2x4gGh3XB+ij59FvOOklM+D3E5mhwIFO0cZxGE0eAx2Gn9tj1euoMIChLhnD/FtvuKoucQBCKTTBfihu7dVdZ+gLxqsmusZqUeHnIYYrg3kpH2gu0wQ2GiKm/UMoogYR0JRoYac5ui/aVeDWS14bLoqAc4vJVWVt+vJhJG+a8rC5B68raUDaxhhCJM0b6lpOqAJ/5iVZKLufYMLv2FMNoc5LFkP5QNAYneYCkhfWfNzcDgYC0biYQsT1uIfSgN2q86Qdghe9OBMBFfisfaEsg8+qI7JxhNh+eA6tU5W/yJTIckhvk=

Это мой код для расшифровки этой зашифрованной строки:

- (NSString *)decryptAES:(NSString *)text {
NSDictionary *keyDict = [self chooseKey:text];
NSString *key = [keyDict objectForKey:@"key"];
NSData *keyHash = [[key dataUsingEncoding:NSUTF8StringEncoding] SHA256Hash];

NSString *newText = [text stringByReplacingCharactersInRange:NSMakeRange(1, 1) withString:@""];
NSData *encryptData = [NSData base64DataFromString:newText];
NSData *plainData = [encryptData AES256Decrypt:keyHash];
NSString *plain = [[NSString alloc] initWithData:plainData encoding:NSUTF8StringEncoding];

return plain;
}

Я успешно расшифровал эту зашифрованную строку в NSString, и результат таков:

{
    "promo": [{
        "status": 1,
        "link": "https://www.s6pay.com/asset_template/img/promo/sspquizpromo.jpg",
        "description": "SSP mengadakan quiz yang berhadiah tiket kereta api dengan menjawab kuis.",
        "promoMessage": "Success",
        "promoTitle": "SSP Promo Quiz! Bagi-bagi Tiket Kereta Api"
    }],
    "count": 1
}

Я хочу преобразовать эту строку расшифровки в NSDictionary/json, мой код выглядит следующим образом:

NSMutableString *plainTemp = [NSMutableString stringWithString:[[NSData alloc] decryptAES:jsonMutableString]]
NSLog(@"Decrypt %@",plainTemp);
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:[plainTemp dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil];
NSLog(@"JSON %@",json);

Я пытаюсь изменить параметры с помощью NSJSONReadingMutableLeaves, NSJSONReadingAllowFragments или NSJSONReadingMutableContainers, но все равно получаю результат JSON (null).

Я пытаюсь проверить эту расшифрованную строку, используя http://json.parser.online.fr (результат зашифрованной строки), и этот результат является действительным JSON.

Что не так с моим кодом? Не могли бы вы мне помочь? Спасибо..


person gregkyt    schedule 21.07.2016    source источник
comment
Сначала проверьте, получаете ли вы данные или нет в [NSMutableString stringWithString:[[NSData alloc] decryptAES:jsonMutableString]]   -  person Gagan_iOS    schedule 21.07.2016
comment
Я проверил, что NSMutableString *plainTemp использует NSLog, и результат: {promo: [{статус: 1, ссылка: s6pay.com/asset_template/img/promo/sspquizpromo.jpg, описание: SSP mengadakan викторина yang berhadiah tiket kereta api dengan menjawab kuis., promoMessage: Success, promoTitle: SSP Promo Quiz! Баги-баги тикет кэрэта апи}], счет: 1}   -  person gregkyt    schedule 21.07.2016
comment
О, извините, я вставил не ту строку в предыдущем комментарии. Пожалуйста, проверьте данные в [plainTemp dataUsingEncoding: NSUTF8StringEncoding]. Вы можете получить данные или нет. Если вы получаете данные, создайте объект NSError (скажем, ошибка) и передайте ссылку в [NSJSONSerialization JSONObjectWithData: [plainTemp dataUsingEncoding: NSUTF8StringEncoding] options: 0 error: & error]; NSLog (Ошибка: % @, error.localizationString); В большинстве случаев мы должны изменить формат кодирования   -  person Gagan_iOS    schedule 21.07.2016
comment
Я получаю данные, когда конвертирую plainTemp в NSData, используя [plainTemp dataUsingEncoding: NSUTF8Encoding]. Я создал переменную *err и передал ошибку, используя [NSJSONSerialization JSONObjectWithData:[plainTemp dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&err], но все равно null, ошибка не отображается   -  person gregkyt    schedule 21.07.2016
comment
Используйте параметр error; вот для чего это нужно.   -  person Droppy    schedule 21.07.2016
comment
ошибка результата с использованием NSLog this Error Domain=NSCocoaErrorDomain Code=3840 Мусор в конце. UserInfo={NSDebugDescription=Мусор в конце.}   -  person gregkyt    schedule 21.07.2016
comment
Итак, у вас есть ответ. Шифрование/дешифрование нарушено.   -  person Droppy    schedule 21.07.2016
comment
сломанный? если это расшифрование нарушено, почему я могу получить расшифрованную строку из зашифрованной строки?   -  person gregkyt    schedule 21.07.2016
comment
Вот в чем дело; вы думаете, что у вас есть целая строка, потому что вы не видите мусора в конце строки. Вам нужно более внимательно изучить строку в отладчике. Парсер JSON уже говорит вам об этом.   -  person Droppy    schedule 21.07.2016
comment
Хорошо, но что я могу сделать, чтобы решить эту проблему? когда я конвертирую расшифрованную строку в NSData, я получаю 0000 0000 0000 в конце данных, я должен удалить это? но когда я проверяю расшифрованную строку с помощью jsonlint.com, она показывает действительный JSON.   -  person gregkyt    schedule 21.07.2016
comment
В чем смысл шифрования, когда вы публикуете закрытые ключи на общедоступном веб-сайте?   -  person Nikolai Ruhe    schedule 21.07.2016
comment
извините, я просто дам его, если кто-то попытается расшифровать эту зашифрованную строку   -  person gregkyt    schedule 21.07.2016
comment
Если есть реальная проблема безопасности, пожалуйста, поймите, что редактирование вашего сообщения не удаляет закрытые ключи с этого веб-сайта. Вы всегда можете увидеть это в истории редактирования. Единственный способ вернуть (некоторую) безопасность — сменить ключи.   -  person Nikolai Ruhe    schedule 21.07.2016
comment
Просто зайдите в Google и найдите «NSCocoaErrorDomain Code=3840 ios». Вы получите свое решение /   -  person Gagan_iOS    schedule 21.07.2016


Ответы (2)


Я успешно расшифровал эту зашифрованную строку в NSString, и результат таков:

Верен ли NSString объект? Почему так красиво оформлено? Если это правда NSString, у вас не должно возникнуть проблем с преобразованием, просто используйте:

NSError *jsonError;
NSData *objectData = [sourceString dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:objectData options:NSJSONReadingMutableContainers error:&jsonError];

В противном случае вы должны опубликовать более подробную информацию о том, как вы расшифровываете свою строку.

person Alexander Yakovlev    schedule 21.07.2016
comment
я дам вам полный код для расшифровки этой зашифрованной строки, но этого столбца комментариев недостаточно, поэтому я отредактирую свой вопрос - person gregkyt; 21.07.2016
comment
Это комментарий, а не ответ. - person Droppy; 21.07.2016
comment
Это ответ, а не комментарий - person tom redfern; 21.07.2016

Привет всем, у меня есть ответ на мой вопрос, я использую это

NSString* string = [[[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] stringByReplacingOccurrencesOfString:@"\t" withString:@""] stringByReplacingOccurrencesOfString:@"\0" withString:@""];
data = [string dataUsingEncoding:NSUTF8StringEncoding];

из https://stackoverflow.com/a/23321435/5742519, чтобы получить ответ на мой вопрос. Большое спасибо за то, что вы ответили на мой вопрос.

person gregkyt    schedule 22.07.2016