2012-02-04 20 views
1

ので、数日PHPでJavaからRSAサインを確認します署名(モード:ALG_RSA_MD5_PKCS1)。 今私はPHPで署名を検証する必要があります。私のJavaCardからは私が自分で解決できない問題を持っている

私は16進数で指数、モジュラスおよび署名を取得:Javaで

$mod = '951ADDA04637190B6202BB52787D3C19160A383C80C2E7242D0A7850FDD80C1CD1CCCF1395F8CA0B20270E3BC6C86F78232D65D148258BEFD0884563C60AB2C327506FB4FA0095CF0B1C527D942155731451F790EC0A227D38613C9EBFB2E04A657B3BA5456B35F71E92E14B7E1CB38DB6572559BFCA3B0AD8AA061D48F68931'; 
    $exp = '010001'; 
    $sign ='75867D42BDE6DF1066D4AF69418FCDD4B0F19173141128DFEBC64AF6C014CB92D38F4824E52BB064A610E07C7783AE57AE993A792F15208FB199CB1F45B64623AACB7FBA07AD89513C8DBA893C9FA6939857AA2CA53AAD99D9A9C1C32DF4E2769FCACB72E2C2C495727D368D953A911D32E79E230751202714DD15C0B6A34782'; 
    $plaintext = '01020304'; 

A検証は問題ありません。しかし、私はPHPで署名を確認する必要があることを知っている(私はphpseclibを取る)。 PHPで

私はCRYPT_RSA_PUBLIC_FORMAT_RAWと私のPUB​​LIC_KEYを生成:

$rsa = new Crypt_RSA(); 
    $pk = array(
     'e' => new Math_BigInteger($exp, 16), 
     'n' => new Math_BigInteger($mod, 16) 
    ); 
    $rsa->loadKey($pk, CRYPT_RSA_PUBLIC_FORMAT_RAW); 

    $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1); 
    echo $rsa->verify($plaintext, $sign) ? 'verified' : 'unverified'; 

問題は、検証機能で正しい値を設定することです知っています。 私はちょうど進数で私の署名を設定した場合、私は予告を得る:

Invalid signature: length = 256, k = 128 in C:\xampp\php\PEAR\Crypt\RSA.php on line 2175 

は、だから私は、私の署名の長さをカスタマイズする必要があります。

$sign_bigInteger = new Math_BigInteger($sign, 16); 
    $sign_bytes = $sign_bigInteger->toBytes(); 

    echo $rsa->verify($plaintext, $sign_bytes) ? 'verified' : 'unverified'; 

をしかし、検証はfalseです。

//sign 
    "ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0 0*†H†÷ ÖÀZ!Q*y¡ßë*&/" 
    //plaintext 
    "ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0!0 +•q£îê“O•äQ».åüÓSœÝ[" 

クラスRSA.phpで起こっていただきました!私は本当に理解していない:

は私が平文が署名と比較されRSA.php(_rsassa_pkcs1_v1_5_verify)での検証関数の出力を取得します。 誰かが私を助け、私が間違っていることを言うことができますか?

EDIT:

は、今私は私のhexStringを変換しようとしました。

$plaintext_bin = pack("H*", $plaintext); 
    $sign_bin = pack("H*", $sign); 

私は私の公開鍵が生成され、正しいですので、私はちょうど私の検証の入力を変更することを考える:

$rsa->verify($plaintext_bin, $sign_bin) ? 'verified' : 'unverified'; 

は出力:

em: string(128) "ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0 0*†H†÷ ÖÀZ!Q*y¡ßë*&/" 
    em2: string(128) "ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0!0 +ÚÚÿMG‡­ã31G ,;D>7o" 

それはまだ同じではありません。

EDIT:

私は私の問題を修正しました。私はハッシュを設定するのを忘れた:

$rsa1->setHash('md5'); 

今それは動作します!

ありがとう、グレッグ。

答えて

1

すべての値は16進数の文字列です。 hex2bin()またはpack("H*", $hex_string);

を使用して変換してください
関連する問題