2013-03-14 49 views
0

我使用RNCryptor在iOS中加密消息,然後使用PHP解密。但是,解密字符串中的特殊字符消失。RNCryptor iOS/PHP和特殊字符

如何加密iOS中

-(NSData *)encryptThis:(NSString *)str 

{

NSString *key = @"mysuper32bitkey"; 
NSError *error = nil; 
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; 
NSData *encryptedData = [RNEncryptor encryptData:data 
            withSettings:kRNCryptorAES256Settings 
             password:key 
              error:&error]; 

return encryptedData; 

}

如何解密PHP

$b64_data = $message; 
$password = "mysuper32bitkey" 
// back to binary 
$bin_data = $message;// message already in binary. No need for -> mb_convert_encoding($b64_data, "UTF-8", "BASE64"); 
// 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); 
// 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', $data , $hmac_key, true); 
// check if HMAC hash matches HMAC 
if($hmac_hash != $hmac) 
    echo "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); 

echo trim(preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x80-\xFF]/u', '', $ret)); 

的事情是,如果我加密「Agresión 「在iOS中,PHP只返回s「Agresin」。爲什麼它不解密「ó」?我認爲dataUsingEncoding:NSUTF8StringEncoding將保留特殊字符...我應該使用另一種類型的編碼?

回答

0

你在這一行剝離O(U + 00F3):

echo trim(preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x80-\xFF]/u', '', $ret)); 

請注意,您刪除所有\ x80- \ XFF的。不要這樣做。

+0

所以它應該是:echo trim(preg_replace('/ [\ x00- \ x08 \ x0B \ x0C \ x0E- \ x1F/u','',$ ret)); ?刪除\ x80- \ xFF – GabCas 2013-03-14 21:32:58

+0

爲什麼你會在這裏刪除任何字符? – 2013-03-19 18:23:54

+0

這是一個沒有評論的例子。我意識到現在我正在刪除很多unicode字符。 – GabCas 2013-03-20 13:44:55