2016-12-16 15 views
0

私が取り組んでいる支払いゲートウェイがありますが、Javaデモが動作していますが、代わりにこれをPHPで実装したいと思います。Java RSAからPHP phpseclib RSA

支払いゲートウェイは、ランダムに生成されたキーで3DESを使用してペイロードを暗号化します。 そのキーは、支払いゲートウェイのPUBLICキーを使用してRSAで暗号化されています。

問題は、私がそのキーでRSA暗号化を行うためにphpスクリプトを使用すると、支払いゲートウェイが鍵を正しく抽出できず、明らかにPHP上のRSA暗号化が正しく機能していませんでした...

ここでRSA暗号のJavaバージョンです:Javaバージョンを使用していた

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); 
} 

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; 
    } 
} 

そして、ここでは、私はPHPスクリプトでで出てきた何PKCSPADDINGので、phpseclibのモードをPKCSPADDINGの2に設定しましたが、それでも動作しません。私は何か不足していますか?誰でも私のためにそれを指摘できますか?

UPDATE:これはそれを引き起こしている理由があるが、私は "----- BEGIN PUBLIC KEY -----" と「----- ENDのPUBLICを削除した場合

わかりませんKEY ---- "の部分が働いていました。

皆様のご協力ありがとうございます。

+2

これについてのほとんどすべては、あなたがその支払いゲートウェイを使用して再考したい場合がありますので、間違って聞こえます。 – pvg

+0

私はpvgです。これらの行を削除しても違いはありません。あなたが投稿し、 'echo $ rsa'を実行して、あなたが投稿したのと同じ鍵を持っているときにあなたの鍵を読み込もうとしました。私はまたあなたがあなたが言った線を取り除こうとしたが、私はそれをやったときに同じ鍵を持っていた。だから、それらの行を削除するようなことは、キーを変更しているようには思えません。 PKCS1のパディングはランダム化されているため、支払いゲートウェイは、ランダムに選択できる可能性のあるすべてのバイトを正しく収容できないようです。 – neubert

+0

ゲートウェイには最高の技術が使用されていませんしかし、私たちは本当に始めることを選択する必要はありません。しかし、何に関係なく、本当に助けとフィードバックに感謝! –

答えて

1

暗号化プロセスを開始する前にdefine('CRYPT_RSA_PKCS15_COMPAT', true);を試してみてください。 phpseclib 2.0のRSA.phpを引用

/** 
* 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

私はこれを試していませんでしたが、他の人に役立つかもしれないのであなたの答えをupvoting。 –