从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错误。