2012-02-04 3 views
1

이후 며칠 PHP에서 자바에서 RSA 기호를 확인 서명 (모드 : ALG_RSA_MD5_PKCS1). 이제 PHP에서 서명을 확인해야합니다. 내 자바 카드에서내가 내 자신에 해결할 수없는 문제가 생겼어요

나는 16 진수 지수, 계수 및 서명을 얻을 : 자바에서

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

검증은 문제가되지 않습니다. 하지만 필자는 PHP에서 서명을 확인해야한다는 것을 알고 있습니다 (필자는 phpseclib을 사용합니다). PHP에서

나는 CRYPT_RSA_PUBLIC_FORMAT_RAW 내 PUBLIC_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 

그래서 내가 서명의 길이를 사용자 정의 할 수 있습니다 : 그냥 16 진수로 내 서명을 설정하면 나는 통지를받을

$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)의 확인 함수의 출력을 얻을. 누구든지 나를 도울 수 있고 내가 뭘 잘못했다고 말할 수 있습니까?

편집 :

지금 내 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" 

그것은 여전히 ​​같은 아니에요.

편집 :

나는 내 문제를 해결했습니다. 해시를 잊어 버렸습니다.

$rsa1->setHash('md5'); 

이제 작동합니다.

감사합니다. GregS.

답변

1

모든 값은 16 진수 문자열입니다. hex2bin() 또는 pack("H*", $hex_string);

을 사용하여 변환하십시오.
관련 문제