使用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