使用PHP 5.4(mcrypt的),RNCryptor 2的iOS 6.PHP AES256加密=> RNCryptor RNDecryptor返回空白/ HMAC不匹配
PHP函數創建與從https://github.com/rnapier/RNCryptor/wiki/Data-Format引用的所有報頭的base64。
PHP解密函數,它可以解密來自RNEncryptor和PHP Encrypt函數的base64字符串,並按照預期返回數據。
從下面的PHP Encrypt函數中使用帶有base64的RNDecryptor時,沒有數據返回,如下面的XCode輸出所示。
PHP函數:
function encrypt($data, $key)
{
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$salt = '12345678';
$_key = $this->pbkdf2('SHA1', $key, $salt, 10000, 32, true);
$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $_key, $data, MCRYPT_MODE_CBC, $iv);
$hmac = $this->pbkdf2('SHA1', $key, $salt, 10000, 32, true);
$data = mb_convert_encoding(chr(1).chr(0).$salt.$salt.$iv.$ciphertext.$hmac, "BASE64", "UTF-8");
return $data;
}
PHP函數調用:
encrypt('My Data', 'mykey');
的iOS:
NSError * error;
NSData *decryptedData = [RNDecryptor decryptData:[NSString base64DataFromString:@"AQBpcGhvbmU2MmlwaG9uZTYyrYk2rJnaoywktnx6TZ4X3YKgYuEHCL1EHv+/MqIvQMq5BmZOyMJr QSRs9P4uxShsOJOg67VYniUGhHbFNTSl1Q=="]
withPassword:@"mykey"
error:&error];
NSLog(@"data = %@, %@", decryptedData, error);
的XCode輸出:
數據= <>,(空)
這樣做是當我註釋掉HMAC驗證在RNDecryptor - 完成,一旦這些部分未被註釋我接收HMAC不匹配錯誤
數據=(空),錯誤域= net.robnapier.RNCryptManager代碼= 1 「HMAC不匹配」 的UserInfo = 0x1e564280 {NSLocalizedDescription = HMAC不匹配}
if (self.hasHMAC) {
NSMutableData *HMACData = [NSMutableData dataWithLength:self.HMACLength];
CCHmacFinal(&_HMACContext, [HMACData mutableBytes]);
if (![HMACData isEqualToData:self.inData]) {
[self cleanupAndNotifyWithError:[NSError errorWithDomain:kRNCryptorErrorDomain
code:kRNCryptorHMACMismatch
userInfo:[NSDictionary dictionaryWithObject:@"HMAC Mismatch"
forKey:NSLocalizedDescriptionKey]]];
return;
}
}
AFAIK:mb_convert_encoding用於不同字符集之間的轉換。 BASE64不是一個字符集。它是一種傳輸編碼。你知道base64_decode()嗎?試試它而不是mb_convert_encoding。 – hek2mgl
在PHP端更改爲base64_encode(),並且仍然從RNDecryptor iOS端獲得HMAC不匹配。 –
'var_dump($ salt,$ iv,$ ciphertext,$ hmac);'說什麼? – hek2mgl