내 앱과 서버 사이에 통신 문제가 있습니다. RNCryptor를 사용하여 메시지를 암호화 한 다음 요청을 통해 base64로 인코딩하여 서버로 전송합니다. 이 작업은 DATA 헤더와 http 본문에서 모두 게시물 데이터로 수행됩니다. 내가 어떻게 & POST를 통해 base64로 인코딩 된 메시지를 변환 오전 실수하고있어 생각합니다.NSMutableURLRequest POST 메시지의 Base64 문제가 발생 했습니까?
헤더를 통해 암호화 된 메시지를 받으면 매번 완벽하게 해독합니다. 그러나 POST 데이터를 통해 메시지를 가져 오는 경우 다양한 결과가 나타납니다. 대부분의 경우, 실패합니다. 그렇지 않으면 부분적으로 암호를 해독합니다 (처음 몇 글자).
목적-C 코드는 다음과 같습니다
- (NSString *)sendEncryptedTestMessage:(NSString *)address{
NSString* messageContent = @"Hello my name is Bob.";
NSError * error = nil;
NSString* responseString2 = nil;
NSData* postData = [RNEncryptor encryptData:[messageContent dataUsingEncoding:NSUTF8StringEncoding]
withSettings:kRNCryptorAES256Settings
password:@"123456"
error:&error];
NSString* messageServer = [NSString base64forData:postData];
NSString* postMessage = [@"message=" stringByAppendingString:messageServer];
postData = [postMessage dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; // problem here I think
NSString* postLength = [NSString stringWithFormat:@"%ld",(unsigned long)[postData length]];
NSURL* URLToRequest = [NSURL URLWithString:address];
NSMutableURLRequest* semisystem = [[[NSMutableURLRequest alloc] initWithURL:URLToRequest] autorelease];
[semisystem setHTTPMethod:@"POST"];
[semisystem setHTTPBody:postData];
[semisystem setValue:postLength forHTTPHeaderField:@"Content-Length"];
[semisystem setValue:self.activationURL forHTTPHeaderField:@"EncryptionKey"];
[semisystem setValue:messageServer forHTTPHeaderField:@"data"];
NSURLResponse* response;
NSData* data = [NSURLConnection sendSynchronousRequest:semisystem
returningResponse:&response
error:&error];
responseString2 = [NSString stringWithFormat:@"%.*s", (int)[data length], [data bytes]];
return responseString2;
}
PHP 코드 : 사전에
function decrypt2($b64_data,$password)
{
// back to binary
//$bin_data = mb_convert_encoding($b64_data, "UTF-8", "BASE64");
$bin_data = base64_decode($b64_data);
// extract salt
$salt = substr($bin_data, 2, 8);
// extract HMAC salt
$hmac_salt = substr($bin_data, 10, 8);
// extract IV
$iv = substr($bin_data, 18, 16);
// extract data
$data = substr($bin_data, 34, strlen($bin_data) - 34 - 32);
$dataWithoutHMAC = chr(2).chr(1).$salt.$hmac_salt.$iv.$data;
// extract HMAC
$hmac = substr($bin_data, strlen($bin_data) - 32);
// make HMAC key
$hmac_key = pbkdf2('SHA1', $password, $hmac_salt, 10000, 32, true);
// make HMAC hash
$hmac_hash = hash_hmac('sha256', $dataWithoutHMAC , $hmac_key, true);
// check if HMAC hash matches HMAC
if($hmac_hash != $hmac) {
echo "HMAC mismatch".$nl.$nl.$nl;
// return false;
}
// make data key
$key = pbkdf2('SHA1', $password, $salt, 10000, 32, true);
// decrypt
$ret = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);
return $ret;
}
$passkey = "123456";
$messageBase64 = $_POST['message'];// THIS barely works
$messageBase64 = $_SERVER['HTTP_DATA'];// THIS WORKS
$message = decrypt2($messageBase64,$passkey);
많은 감사합니다!