NSCharacterSet URLHostAllowedCharacterSet не заменяет знак «+»?

Я изо всех сил пытаюсь передать длинные зашифрованные строки по сети и заставить их правильно выходить на сервер. Например, у меня есть эта зашифрованная строка на клиенте:

wcWSERZCh8Xm1hpbNo1kSD1LvFmpuUr4wmq9hQUWeK0vYcLeFPGwFR / sBTES1A4rPV6eyp9nzEEU9uKkiFSTdP + SPOSqUf6evjf3WRHrXMRe81lIrHuRyk0iRwoNe5uIk + VlpR41kETmznXa4 + gELmf53r7oayRkkffnIPDmpO + WbgE0VL3PQeOsXB01tWJyDiBIsz5WJiiEIm3ZoJW / SW ==

Как видите, в нем есть несколько символов, которые не будут передаваться по сети без некоторой кодировки URL (+ а также/Наиболее заметно). Я не совсем уверен, могут ли быть другие символы, которые могут возникнуть в других ситуациях, поэтому я хочу убедиться, что мое решение «универсально» правильно. Я использую эту строку:

NSString *escapedString = [cipherString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]];

который я нашел в очень рецензируемомответ.

Однако у меня все еще есть проблемы с расшифровкой этого на стороне сервера, поэтому я распечатал результаты на клиенте непосредственно перед отправкой, и я вижу это:

wcWSERZCh8Xm1hpbNo1kSD1LvFmpuUr4wmq9hQUWeK0vYcLeFPGwFR% 2FsBTES1A4rPV6eyp9nzEEU9uKkiFSTdP + SPOSqUf6evjf3WRHrXMRe81lIrHuRyk0iRwoNe5uIk + VlpR41kETmznXa4 + gELmf53r7oayRkkffnIPDmpO + WbgE0VL3PQeOsXB01tWJyDiBIsz5WJiiEIm3ZoJW% 2Fsw ==

Почему знаки «+» все еще там? Я использую неправильный набор символов? Какой набор символов я должен использовать, чтобы гарантировать, что я правильно экранирую все проблемные символы?

Если это поможет, вот код, который я использую для шифрования простой текстовой строки. Когда это сделано, я base64 кодирую результаты перед отправкой по сети:

- (NSData *)phpEncryptCleartext : (NSData *)cleartext
{
    NSData *cleartextPadded = [self phpPadData:cleartext];

    CCCryptorStatus ccStatus        = kCCSuccess;
    size_t          cryptBytes      = 0;    // Number of bytes moved to buffer.
    NSMutableData  *cipherTextData  = [NSMutableData dataWithLength:cleartextPadded.length];

    ccStatus = CCCrypt(kCCEncrypt,
                       kCCAlgorithmAES128,
                       0,
                       _sessionKey.bytes,
                       kCCKeySizeAES128,
                       _iv.bytes,
                       cleartextPadded.bytes,
                       cleartextPadded.length,
                       cipherTextData.mutableBytes,
                       cipherTextData.length,
                       &cryptBytes);

    if (ccStatus == kCCSuccess) {
        cipherTextData.length = cryptBytes;
    }
    else {
        NSLog(@"kEncryptionError code: %d", ccStatus); // Add error handling
        cipherTextData = nil;
    }

    return cipherTextData;
}

Спасибо за любой совет!

Ответы на вопрос(1)

Ваш ответ на вопрос