0

PHP で暗号化されたデータをデコードしようとしていますが、戻り値が null として返され続けます。

復号化するデータは、データ引数として PHP ファイルに入ります。

$dataArg1 = $_REQUEST["data"];

// Retrieve $encryptedData from storage ...
//
// Load the private key and decrypt the encrypted data
$encryptedData = $dataArg1;
$privateKey = array ( array(123456,654321,123456), array(123456,1234),
                      array(1234567,4321)
                    );
    openssl_private_decrypt($encryptedData, $sensitiveData, $privateKey);

上記の関数は、スタック オーバーフローに関する別の投稿の 2 番目の応答からのものです: javascript でデータを暗号化し、php で復号化する方法は?

復号化された値が PHP 変数 $sensitiveData にあると仮定します。

それを画面にエコーすると、何も得られません。

echo("sensitiveData=[$sensitiveData]<br />");

考え?

更新: openssl_private_decrypt() からの戻り値は FALSE であり、戻り値は NULL です。

更新 2: 次の URL から公開/秘密キーを作成しました。 http://shop-js.sourceforge.net/crypto2.htm

一番下に、次の行があります: そして、プライベート スクリプトに次の行を追加します (おそらく、インターネット上ではなく、ローカルのハード ディスク上にあります。秘密鍵が見つかった場合、このすべては役に立ちません)。

<script>
function decrypt() {
 // key = [ [d], [p], [q] ];
 var key=[[123456789,123456789,123456789],[123456789,1234],[123456789,4321]];
 document.form.text.value=rsaDecode(key, document.form.text.value);
}
</script>
(actual values changed)

「var key=」行を PHP にコピーしてコピーしました (他の投稿による)。埋め込み配列を使用した上記の翻訳。次に、そのキーを復号化関数に渡します。

私の考えでは、PHP のドキュメントでは秘密鍵を「混合」と呼んでいます。秘密鍵に別の形式が必要かどうか疑問に思っています。

出力は次のとおりです。

dataArg1=[jmOdss9ktFc\"WO5eltUZXt0rpqS1NluNKa]

bResult=[]

sensitiveData=[]

var_dump=[NULL ]
4

1 に答える 1

1

$privateKey は特定の形式でなければなりません。ランダムなデータを投げ込むだけで、それをどう処理するかを魔法のように期待することはできません。

また、使用しているjsを見ると、RSAだけを行っているわけではありません。という名前の関数がありますbase64ToText。それを使用して暗号文をデコードし、最初のバイトを「暗号化されたセッション キー」の長さとして取得し、「暗号化されたセッション キー」を取得し、RSA でそれを復号化し、それを RC4 のキーとして使用して復号化します。しかし、それにも多くの問題があります。とりわけ、名前が示すように、base64ToTextPHP と同じではありません。base64_encode

とにかく、私はそれを機能させることができませんでした。個人的には、次のようなものをお勧めします (これは PHP / phpseclib の Crypt_RSAと相互運用可能です):

http://area51.phpbb.com/phpBB/viewtopic.php?p=208860

そうは言っても、私はいくつかのことを理解することができました。あなたの js lib は base-28 を使用しています。数値をその形式から 1 つの phpseclib が使用するものに変換するには、次の関数を使用する必要があります。

function conv_base($num)
{
    $result = pack('N', $num[count($num) - 1]);

    for ($i = count($num) - 2; $i >= 0; --$i) {
        _base256_lshift($result, 28);
        $result = $result | str_pad(pack('N', $num[$i]), strlen($result), chr(0), STR_PAD_LEFT);
    }

    return $result;
}

function _base256_lshift(&$x, $shift)
{
    if ($shift == 0) {
        return;
    }

    $num_bytes = $shift >> 3; // eg. floor($shift/8)
    $shift &= 7; // eg. $shift % 8

    $carry = 0;
    for ($i = strlen($x) - 1; $i >= 0; --$i) {
        $temp = ord($x[$i]) << $shift | $carry;
        $x[$i] = chr($temp);
        $carry = $temp >> 8;
    }
    $carry = ($carry != 0) ? chr($carry) : '';
    $x = $carry . $x . str_repeat(chr(0), $num_bytes);
}

これが正しいことを確認するために使用したスクリプトです。

<?php
include('Math/BigInteger.php'); 

$p = array(242843315,241756122,189); 
$q = array(177094647,33319298,129); 
$n = array(45173685,178043534,243390137,201366668,24520); 

$p = new Math_BigInteger(conv_base($p), 256); 
$q = new Math_BigInteger(conv_base($q), 256); 
$n = new Math_BigInteger(conv_base($n), 256); 

$test = $p->multiply($q); 
echo $test . "\r\n" . $n; 

すなわち。それらは一致します。

また、jsbase64ToTextを PHP に移植しました。

function decode($t)
{
    static $b64s = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_"';
    $r = '';
    $m = $a = 0;
    for ($n = 0; $n < strlen($t); $n++) {
        $c = strpos($b64s, $t[$n]);
        if ($c >= 0) {
            if ($m) {
                $r.= chr(($c << (8-$m))&255 | $a);
            }
            $a = $c >> $m;
            $m+=2;
            if ($m == 8) {
                $m = 0;
            }
        }
    }

    return $r;
}

私が遭遇した可能性のある他の潜在的な問題の中で... RC4の実装が正しいかどうか誰が知っていますか? 彼らのbase64実装はそうではないので、RC4実装も壊れる前例がないわけではありません.

于 2013-03-26T16:59:30.817 に答える