php 匹配 rn,HMAC不匹配錯誤使用PHP解密器的RNCryptor

我有一個加密的NSData變量已在Base64中編碼在Objective-C中,並通過POST傳遞給PHP腳本。我試圖解密這個字符串,但不斷收到一個HMAC不匹配錯誤。這是我的PHP代碼:HMAC不匹配錯誤使用PHP解密器的RNCryptor

// back to binary

$bin_data = mb_convert_encoding($username_encrypted, "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)

exit("Error HMAC mismatch");

// 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));

function pbkdf2($algorithm, $password, $salt, $count, $key_length, $raw_output = false)

{

$algorithm = strtolower($algorithm);

if(!in_array($algorithm, hash_algos(), true))

die('PBKDF2 ERROR: Invalid hash algorithm.');

if($count <= 0 || $key_length <= 0)

die('PBKDF2 ERROR: Invalid parameters.');

$hash_length = strlen(hash($algorithm, "", true));

$block_count = ceil($key_length/$hash_length);

$output = "";

for($i = 1; $i <= $block_count; $i++) {

// $i encoded as 4 bytes, big endian.

$last = $salt . pack("N", $i);

// first iteration

$last = $xorsum = hash_hmac($algorithm, $last, $password, true);

// perform the other $count - 1 iterations

for ($j = 1; $j < $count; $j++) {

$xorsum ^= ($last = hash_hmac($algorithm, $last, $password, true));

}

$output .= $xorsum;

}

if($raw_output)

return substr($output, 0, $key_length);

else

return bin2hex(substr($output, 0, $key_length));

}

,這是我的iOS代碼:

NSData *plain_data = [plain_string dataUsingEncoding:NSUTF8StringEncoding];

NSError *error_encryption = nil;

NSData *encrypted_data = [RNOpenSSLEncryptor encryptData:plain_data

withSettings:kRNCryptorAES256Settings

password:key

error:&error_encryption];

NSString *test_variable = [encrypted_data base64Encoding];

任何想法有什麼不好?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值