-1

このスレッドから暗号化 PHP アルゴリズムを作成しようとしています:

dcpcrypt を使用して Delphi と php の間で暗号化を同期する方法(shunty の返信を参照)

これが私がこれまでに持っているものです:

function encrypt($str, $key)
{
    $keysize = mcrypt_get_key_size(MCRYPT_DES, MCRYPT_MODE_CBC);

    $ivbytes = array(72, 163, 99, 62, 219, 111, 163, 114);
    $iv = implode(array_map("chr", $ivbytes));

    $pad = ord($str[strlen($str) - 1]);
    $enc = substr($str, 0, strlen($str) - $pad);

    $enc = base64_encode($str);
    $k = mhash(MHASH_SHA1, $key);

    //return substr($dec, 0, strlen($dec) - $pad);
    $dec = mcrypt_encrypt(MCRYPT_DES, substr($k, 0, $keysize), $enc, MCRYPT_MODE_CBC, $iv);

    return $dec;
}

何が間違っているのかわかりませんが、これでテストします:

echo encrypt("this is a test", "test");

出力を与える: =ž«RCdrçb˜hý'¯á·OÊ

私が間違っている場所を説明するのを手伝ってくれる人はいますか?私が得ることができる助けを本当に感謝します.

編集:

function encrypt_SO($str, $key)
    {
        $keysize = mcrypt_get_key_size(MCRYPT_DES, MCRYPT_MODE_CBC);

        $ivbytes = array(72, 163, 99, 62, 219, 111, 163, 114);
        $iv = implode(array_map("chr", $ivbytes));

        $pad = ord($str[strlen($str) - 1]);
        $enc = substr($str, 0, strlen($str) - $pad);
        $k = mhash(MHASH_SHA1, $key);

        //return substr($dec, 0, strlen($dec) - $pad);
        $dec = mcrypt_encrypt(MCRYPT_DES, substr($k, 0, $keysize), $enc, MCRYPT_MODE_CBC, $iv);

        return base64_encode($dec);
    }

エンコーディングを最後に移動しました。

編集 2: みんなの役に立つ投稿のおかげで解決:

function encrypt_SO($str, $key)
{
    $keysize = mcrypt_get_key_size(MCRYPT_DES, MCRYPT_MODE_CBC);

    $ivbytes = array(72, 163, 99, 62, 219, 111, 163, 114);
    $iv = implode(array_map("chr", $ivbytes));

    $k = mhash(MHASH_SHA1, $key);

    $blocksize = mcrypt_get_block_size(MCRYPT_DES, MCRYPT_MODE_CBC);
    $padsize = $blocksize - (strlen($str) % $blocksize);
    $str .= str_repeat(chr($padsize), $padsize);

    return base64_encode(mcrypt_encrypt(MCRYPT_DES, substr($k, 0, $keysize), $str, MCRYPT_MODE_CBC, $iv));
}
4

1 に答える 1

1

上記のコメントに答えるには:

暗号化:

  • キーサイズとブロックサイズを取得する
  • IV を取得 - これは実際にはランダムで適切に生成されたものである必要がありますが、IV を手動で指定せずに DCPcrypt を使用するには、提供されているものを使用する必要があります。
  • キーをハッシュする
  • パディングを追加してください。これは少し間違っています。この例では、次のようなものが必要です。

    $blocksize = mcrypt_get_block_size(MCRYPT_DES, MCRYPT_MODE_CBC);
    $padsize = $blocksize - (strlen($str) % $blocksize);
    $str .= str_repeat(chr($padsize), $padsize);
    
  • 暗号化する

  • Base64 エンコード

復号化:

  • キーサイズを取得する
  • IV を取得 - 上記のとおり (暗号化に使用されたものと同じである必要がありますが、実際には適切に暗号化されている必要があります)。
  • キーをハッシュする
  • Base64 デコード
  • 復号化
  • パディングを取り除く
于 2013-05-17T14:46:00.513 に答える