2016-12-16 2 views
0

제가 일하고있는 지불 게이트웨이가 있으며 그들은 자바 데모가 작동하지만 나는 이것을 PHP에서 대신 구현하고 싶습니다.자바 RSA에서 PHP로 phpseclib RSA

지불 게이트웨이는 무작위로 생성 된 키가있는 3DES를 사용하여 페이로드를 암호화합니다. 그 키는 지불 게이트웨이의 PUBLIC 키를 사용하여 RSA로 암호화되었습니다.

문제는 PHP 스크립트를 사용하여 해당 키에서 RSA 암호화를 수행 할 때 지불 게이트웨이가 키를 올바르게 추출 할 수 없으며 PHP의 RSA 암호화가 올바르게 작동하지 않는 것입니다 ...

use phpseclib\Crypt\RSA as RSA; 




$PUB_KEY = '-----BEGIN PUBLIC KEY----- 
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJ1fKGMV/yOUnY1ysFCk0yPP4bfOolC/nTAyHmoser+1yzeLtyYsfitYonFIsXBKoAYwSAhNE+ZSdXZs4A5zt4EKoU+T3IoByCoKgvpCuOx8rgIAqC3O/95pGb9n6rKHR2sz5EPT0aBUUDAB2FJYjA9Sy+kURxa52EOtRKolSmEwIDAQAB 
-----END PUBLIC KEY-----'; 

$PAYLOAD = 'b78850d2f35108b4bc4e7a41'; 

function encrypt($key,$payload){ 
    $rsa = new RSA(); 
    $rsa->loadKey($key); // public key 

    $rsa->setEncryptionMode(2); 
    $ciphertext = $rsa->encrypt($payload); 

    return base64_encode($ciphertext); 
} 

Java 버전이

을 사용했다 : 나는 PHP 스크립트에서 나왔다 무엇 여기

public static byte[] encrypt(byte[] data, String pubKey64) { 

    try { 
     byte[] key = Toolkit.base64Decode(pubKey64); 
     KeyFactory rsaKeyFac = KeyFactory.getInstance("RSA"); 
     X509EncodedKeySpec keySpec = new X509EncodedKeySpec(key); 
     RSAPublicKey pbk = (RSAPublicKey) rsaKeyFac.generatePublic(keySpec); 
     System.out.println("MODE:"+Cipher.ENCRYPT_MODE); 
     Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING"); 
     cipher.init(Cipher.ENCRYPT_MODE, pbk); 

     byte[] encDate = cipher.doFinal(data); 
     return encDate; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

그리고 :

여기 RSA 암호화의 자바 버전입니다 PKCSPADDING 그래서 phpseclib 모드를 PKCSPADDING 인 2로 설정했지만 여전히 작동하지 않습니다. 내가 놓친 게 있니? 누구든지 나를 위해 그것을 지적하시기 바랍니다 수 있습니까?

업데이트 :이 그것을 일으키는 이유가 있지만, 나는 "----- BEGIN PUBLIC KEY -----"와 "----- END의 PUBLIC을 제거한 경우

확실하지 않음 KEY ---- "부분과 그것이 작동했습니다.

모두에게 감사드립니다.

+2

이 당신이 지불 게이트웨이를 사용하여 재고 할 수 있습니다 매우 잘못된 소리에 대한 거의 모든 것을. – pvg

+0

나는 pvg와 함께있다. 그 줄을 제거해서는 안된다. 나는 당신이 그것을 게시하고'echo $ rsa'를하고 당신이 올린 열쇠와 같은 열쇠를 가지고있을 때 당신의 열쇠를 적재하려고 시도했다. 나는 또한 당신이 구술 한 선을 지우려고했는데, 그렇게했을 때도 같은 열쇠를 얻었습니다. 그래서 그 줄을 제거하는 것이 열쇠를 바꾸는 것 같지 않습니다. PKCS1 패딩은 랜덤 화되어있어 지불 게이트웨이가 무작위로 선택할 수있는 모든 가능한 바이트를 정확하게 수용 할 수없는 것 같아요. – neubert

+0

게이트웨이에 가장 적합한 기술을 사용하고 있지는 않습니다. 하지만 우리는 실제로 시작할 선택의 여지가 없습니다. 그러나 무엇을 상관없이 도움과 피드백에 정말로 감사드립니다! –

답변

1

암호화 프로세스를 시작하기 전에 define('CRYPT_RSA_PKCS15_COMPAT', true);을 시도해보십시오. 2.0의 RSA.php phpseclib 인용

:

/** 
* RSAES-PKCS1-V1_5-DECRYPT 
* 
* See {@link http://tools.ietf.org/html/rfc3447#section-7.2.2 RFC3447#section-7.2.2}. 
* 
* For compatibility purposes, this function departs slightly from the description given in RFC3447. 
* The reason being that RFC2313#section-8.1 (PKCS#1 v1.5) states that ciphertext's encrypted by the 
* private key should have the second byte set to either 0 or 1 and that ciphertext's encrypted by the 
* public key should have the second byte set to 2. In RFC3447 (PKCS#1 v2.1), the second byte is supposed 
* to be 2 regardless of which key is used. For compatibility purposes, we'll just check to make sure the 
* second byte is 2 or less. If it is, we'll accept the decrypted string as valid. 
* 
* As a consequence of this, a private key encrypted ciphertext produced with \phpseclib\Crypt\RSA may not decrypt 
* with a strictly PKCS#1 v1.5 compliant RSA implementation. Public key encrypted ciphertext's should but 
* not private key encrypted ciphertext's. 
* 
* @access private 
* @param string $c 
* @return string 
*/ 
+0

답변을 다른 사람에게 도움을 줄 수도 있습니다. –