1

iOSとPHPの間で暗号化された通信を行うときに問題が発生します。文字列を暗号化し、それを復号化するPHPサーバーに送信するアプリがあります。その部分はうまく機能します。ここで、PHPサーバーは暗号化された応答をアプリに送り返す必要があります。これにより、もう少し白髪が発生しているようです。

問題は、PHPで文字列を暗号化すると、iOSや.NETで暗号化された同じ文字列とは異なって見えることです。明らかに、すべての場所で同じアルゴリズム、キー、およびIVが使用されています。

私はRijndael128をCBCモードで使用し、IVは空のバイトで構成されています(これまでのところ)。

PHP暗号化は次のようになります。

$encrypted = mcrypt_encrypt( MCRYPT_RIJNDAEL_128, $this->secret_key, $str, MCRYPT_MODE_CBC, $this->iv );
$encrypted = base64_encode( $encrypted );

iOS暗号化はこのファイルに添付されています:

StringEncryption.m: http: //pastie.org/1365766

誰かが私が何かを見逃している場所や値のいくつかの異なるパラメーターを持っている場所を見つけるのを手伝ってくれることを願っています。私はこれを数時間見てきましたが、他に試すものが見つかりません。

4

2 に答える 2

1

パディングの問題である可能性があります...詳細については、ここまたはここを参照してください。

OPコメントの後に編集:

NULLPHPには、 -padding以外のパディングモードのサポートが組み込まれていません。少なくとも.NetではNULLパディングを指定できます(私は思います)。他のオプションは、PHPでPKCS#7パディングを実装することです。これはそれほど難しくありません。

入力に1〜8バイトのパディング文字列をパディングして、全長を8バイトの正確な倍数にします。パディング文字列の各バイトの値は、追加されたバイト数に設定されます。つまり、値0x08の8バイト、値0x07の7バイト、...、0x02の2バイト、または値0x01の1バイトです。

$blockSize = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$padding   = $blockSize - (strlen($data) % $blockSize);
$data      .= str_repeat(chr($padding), $padding);
于 2010-12-10T17:45:34.840 に答える
0

長いテストの後、この暗号化方式はテストに適していると思います。

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で暗号化すると、次のようになります 。UUfn34iyNlSK40VaehloaQ ==

間違いなく短い(または他の長い)...エラーを再度検索します。

于 2012-10-09T12:13:18.383 に答える