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;
}
Спасибо за любой совет!