Существует платежный шлюз, над которым я работаю, и у них есть демонстрация 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 ---- ", и это сработало.
Спасибо за помощь всем.
Почти все об этом звучит так неправильно, то вы, возможно, захотите пересмотреть использование этого платежного шлюза. – pvg
Я с pvg. Удаление этих строк не должно было иметь никакого значения. Я попробовал загрузить ваш ключ, когда вы разместили его и выполнили «echo $ rsa» и получили тот же ключ, что и тот, который был опубликован. Я также попытался удалить строки, которые, как вы сказали, удалили, и получил тот же ключ, когда я это сделал. Поэтому не кажется, что удаление этих строк меняет ключ. Заполнение PKCS1 рандомизировано, поэтому почти похоже, что, возможно, платежный шлюз просто не может правильно разместить все возможные байты, которые могут быть выбраны случайным образом. – neubert
Возможно, я знаю, что шлюз не использует лучшую технику на своих но на самом деле у нас нет выбора. Но независимо от того, действительно ли ценят помощь и обратную связь! –