我努力通過網絡傳輸長的加密字符串,並讓它們在服務器上正確出來。例如,我在客戶端上此加密字符串:NSCharacterSet URLHostAllowedCharacterSet不會替換'+'符號嗎?
wcWSERZCh8Xm1hpbNo1kSD1LvFmpuUr4wmq9hQUWeK0vYcLeFPGwFR/sBTES1A4rPV6eyp9nzEEU9uKkiFSTdP + SPOSqUf6evjf3WRHrXMRe81lIrHuRyk0iRwoNe5uIk + VlpR41kETmznXa4 + gELmf53r7oayRkkffnIPDmpO + WbgE0VL3PQeOsXB01tWJyDiBIsz5WJiiEIm3ZoJW/SW ==
正如你所看到的,它有幾個字符如果沒有一些URL編碼(+
和/
,最值得注意)將不會通過網絡傳輸。我不完全確定在其他情況下是否會出現其他角色,所以我想確保我的解決方案「普遍」正確。我正在使用這一行:
NSString *escapedString = [cipherString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]];
我發現在一個高度評論answer。
不過,我仍然有問題在服務器端解密這一點,所以我打印出來的客戶端上的結果立即發送之前,我看到:
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;
}
感謝您的任何意見!
我沒有檢查的實況,但如果如果沒有逃脫'+'(這從我的POV將是確定的),你可以啓動你的自己的字符串替換更改爲等效的符號符號。 –
也許你應該試試'URLFragmentAllowedCharacterSet'? –
'URLFragmentAllowedCharacterSet'創建了其他問題。我可以很容易地做我自己的字符串替換,但是我擔心只要撲滅火災,那麼我就不能完全相信我已經看到了所有可能存在問題的字符。我假設之前已經處理過很多次了,並且希望有一種內置的方法可以可靠地處理它。不過,現在,我可能不得不按照你的建議來處理它。謝謝! – Alex