2016-12-16 3 views
0

Существует платежный шлюз, над которым я работаю, и у них есть демонстрация Java, которая работает, но я хочу реализовать это вместо php.Java RSA to PHP phpseclib RSA

Платежный шлюз шифрует полезную нагрузку, используя 3DES со случайным сгенерированным ключом. Этот ключ был зашифрован с помощью RSA с помощью PUBLIC-ключа платежного шлюза.

Проблема заключается в том, что я использую php-скрипт для шифрования RSA на этом ключе, платежный шлюз не может извлечь ключ правильно, и, по-видимому, шифрование RSA на PHP не работает правильно ...

Вот версия Java зашифрованного RSA:

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 скрипт:

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 использует PKCSPADDING, поэтому я устанавливаю режим на phpseclib равным 2, который является PKCSPADDING, но все равно он не будет работать. Я что-то пропустил? Может ли кто-нибудь указать мне на это?

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

, чтобы поддержать ваш ответ, поскольку он может помочь другим, хотя я не пробовал это. –

Смежные вопросы