从iOS和.NET的PHPencryption差异
在iOS和PHP之间进行encryption通信时遇到问题。 我有一个应用程序,encryption一个string,并将其发送到解密它的PHP服务器。 那部分工作得很好。 现在,PHP服务器需要发送一个encryption的响应回应用程序,这似乎是更多的白发。
问题是,当我在PHP中encryption一个string时,它看起来与在iOS甚至.NET中encryption的string不同 – 显然,所有的地方都使用相同的algorithm,密钥和IV。
我使用CBC模式下的Rijndael 128,包含空字节的IV(到目前为止)。
PHPencryption看起来如此:
$encrypted = mcrypt_encrypt( MCRYPT_RIJNDAEL_128, $this->secret_key, $str, MCRYPT_MODE_CBC, $this->iv ); $encrypted = base64_encode( $encrypted );
iOSencryption附在这个文件中:
StringEncryption.m: http ://pastie.org/1365766
我希望有人能帮我找出我错过了什么东西或有一些不同的价值观。 我已经看了几个小时,找不到其他东西来尝试。
最有可能的是一个填充问题…请看这里或这里的更多信息。
OP评论后编辑 :
PHP没有其他填充模式的内置支持,而不是NULL
-padding。 至less.Net允许你指定NULL填充(我认为),另一种select是在PHP中实现PKCS#7填充,这并不难。
使用1到8个字节的填充string填充input,以使总长度为8个字节的精确倍数。 填充string的每个字节的值被设置为所添加的字节数,即,值0x08的8个字节,值0x07的7个字节,… 0x02的2个字节或值0x01的一个字节。
$blockSize = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); $padding = $blockSize - (strlen($data) % $blockSize); $data .= str_repeat(chr($padding), $padding);
经过长时间的testing,我认为这种encryption方法适合testing:
function mc_encrypt($str = "Affe", $key = "12345678901234567890123456789012") { $str = "Affe"; $block = mcrypt_get_block_size('rijndael-256', 'cbc'); $pad = $block - (strlen($str) % $block); $str .= str_repeat(chr($pad), $pad); $encoded = base64_encode(mcrypt_encrypt('rijndael-256', $key, $str, 'cbc',$key)); file_put_contents("test.txt",$encoded); return $encoded; }
我在iOS上得到了这个: v + cB4woDYANTozUbOgxJ4rWKb59EfLf6NkRE / Ee0kYY =但是,如果我尝试解密(见上文),我得到(null)
在其他,如果我在iOS上encryption,我得到这个: UUfn34iyNlSK40VaehloaQ ==
绝对要短(或其他要长)…再次search错误。