0

私は現在、PHP を使用して S/Mime 復号化を実現しています。私がこれまでに得たもの:

    $keys = array("public"=>$atm."/public-keys/".$usr.".smime",
        "private"=>$atm."/private-keys/".$usr.".smime");
    if(!file_exists($keys["public"])) die("Public Key not found");
    if(!file_exists($keys["private"])) die("Private Key not found");
    $public = file_get_contents($keys["public"]);
    $private = file_get_contents($keys["private"]);

    switch($_GET["debug"])
    {
        case "encrypt":
        {
            $outfile = realpath("demo-msg/out.txt");
            $outfile_signed = realpath("demo-msg/out.signed.txt");
            $infile = realpath("demo-msg/in.txt");

            file_put_contents($infile,$msg);
            $adddata = array("To" => "XXX", "From: Demo Name <XXX>", "Subject" => "Demo Subject");
            if (openssl_pkcs7_encrypt($infile, $outfile, $public, $adddata))
            {
                //$info = file_get_contents($outfile);
                echo "winenc & transfer<br>\n";
                file_put_contents($infile, file_get_contents($outfile));
                //if(openssl_pkcs7_sign($outfile,$outfile_signed,$public,$private,$adddata, PKCS7_BINARY)) echo "winsign";
                //else echo "failsign";
            } 
            else echo "Failed Encryption";
            exit;
        }
        default:
        {
            $outfile2 = realpath("demo-msg/out2.txt");
            $outfile = realpath("demo-msg/out.txt");
            $infile = realpath("demo-msg/smime.p7m");
            //$infile = realpath("demo-msg/in.txt");

            if(openssl_pkcs7_verify($infile)) echo "verified<br>\n"; //tried: openssl_pkcs7_verify($infile,$PKCS7_DETACHED, tmpfile(), array(), array(), $outfile)
            else die("invalid sig");

            if(openssl_pkcs7_decrypt($infile, $outfile2, $public, $private)) //tried: openssl_pkcs7_decrypt($outfile, $outfile2, $public, $private)
            {
                echo "dec win:".file_get_contents($outfile2);
            }
            else echo "Oh oh! Decryption failed!";
            exit;
        }
    }

このスニペットですでにできること:

  • メッセージを暗号化する
  • 暗号化されたメッセージを復号化する (自分で作成した)
  • 署名されていない限り、暗号化されたメッセージを復号化する (Office 2010)

ここで、署名されたメッセージも解読したいと思います (通常は 1 つのステップであるため)。問題:

  • 最初に復号化を試みると、暗号化されたメッセージが異なるヘッダーで返されます。複数の復号化は同じ結果につながります。
  • 私の考えでは、検証の $content - パラメータ - コマンド (openssl_pkcs7_verify) を使用していました。コードコメントで私の試みを見ることができます。

それにもかかわらず、2回目の試行で何が問題になるかについての手がかりはありません。任意の助けをいただければ幸いです!

4

1 に答える 1

1

独り言。

スクリプトで犯したエラー:

  • 検証は -1 (エラー) を返しますが、true (成功) として処理します。検証は機能しませんでした。
  • 検証は明らかに間違っています。DETACHED は定数であり、変数ではありません。「extracert」パラメーターは、有効な署名を含む文字列として有効なファイルを想定しています。しかし、私が持っていたアイデアは正しかったです(「コンテンツ」パラメータを使用した設計)。
  • 署名と復号化の順序

私が誤解していたのは、署名が処理される (そして検証が行われる) 方法でした。メッセージが暗号化されてから署名されると想定しました。そのようにすることもできますが、Office2010 を含む多くのツールは、最初にメッセージに署名してから暗号化します。そうすれば、復号化する前に署名を確認できず、復号化に設計する必要があります。

以下で機能する私のデバッグコードを見ることができます。これは、このスレッドに出くわしたときに復号化の問題を解決するのに役立ちます.

            $test = openssl_pkcs7_verify($infile, PKCS7_DETACHED ); //just to see that it doesn't work
            echo "signature is ".$test."\n<br>".openssl_error_string(); 

            $dec = openssl_pkcs7_decrypt($infile, $outfile, $public, $private);
            echo "<br><br>\n\ndec is ".$dec."\n<br>".openssl_error_string()."\n<br>".file_get_contents($outfile); 

            $test = openssl_pkcs7_verify($outfile, PKCS7_DETACHED, $tmp, array(), $tmp, $outfile2 );
            echo "<br><br>\n\nsignature2 is ".$test."\n<br>".openssl_error_string()."\n<br>".file_get_contents($outfile2); 
于 2014-09-04T19:17:27.780 に答える