RSA public 密钥生成问题(PHP/Java 集成)

RSA public key generation issue (PHP/Java integration)

我有一台服务器和一台客户端。
客户端可能采用不同的技术,例如 java 、 php.
服务器代码写在java.
我在服务器上做的是,获取客户端 public 密钥的指数和模数字节并生成客户端的 public 密钥。 要生成客户端 public 密钥,我使用以下代码:

RSAPublicKeySpec spec = new RSAPublicKeySpec(modulusBigInt,exponentBigInt);
keyFactory = KeyFactory.getInstance("RSA", "BC");
RSAPublicKey clientPublicKey = (RSAPublicKey) keyFactory.generatePublic(spec);

要使用客户端 public 密钥加密数据,我使用以下代码:

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, clientPublickey);
scrambled = cipher.doFinal(buffer);

服务器信息
我已经实现了 RSA-1024 来加密 AES 密钥。 我正在使用 RSA/ECB/PKCS1Padding 算法。而且我还确保所有客户也在他们的代码中考虑了 1 个填充。

客户 - 1 (Java)
如果客户端也在 java 中创建,则 public 密钥成功地从客户端 public 密钥的指数和模数生成。 我正在使用下面的代码生成客户端 RSA 密钥的密钥对。

keyPairGene = KeyPairGenerator.getInstance("RSA");
keyPairGene.initialize(1024);
KeyPair keyPair = keyPairGene.genKeyPair();
RSAPublicKey clientPublickey = (RSAPublicKey) keyPair.getPublic();

客户端-2 (php)
现在的问题是,如果客户端在 php .. 成功生成 public 密钥,但是当我尝试使用那个 public 密钥加密时,当我使用时出现错误的填充异常服务器中的默认提供程序。 我正在使用波纹管代码生成客户端 RSA 密钥的密钥对..

  $options = array('private_key_bits' => 1024,
                'private_key_type' => OPENSSL_KEYTYPE_RSA,
                'config' => realpath(__DIR__) . '/openssl.cnf');

#Generates New Private / Public Key Pair              
$pkGenerate = openssl_pkey_new($options);
#Get Client Private Key
openssl_pkey_export($pkGenerate, $PrivateKey, NULL, $options);
#Get Client Public Key      
$keyData = openssl_pkey_get_details($pkGenerate);


比我试过 BC 供应商 ...它给了我下面的例外:

org.bouncycastle.crypto.DataLengthException: input too large for RSA cipher.

当客户端处于 php 时,当我尝试从指数和模数生成 public 密钥时,我不知道发生了什么问题... 如果客户端在 java 中,则没有问题....并且工作完美..

欢迎任何类型的帮助...

注意: 我从调试代码中观察到的是, 客户端的 public 服务器端密钥模数字节的位长度在 1020 到 1023 之间变化...尽管我们将大小定义为 1024,但它永远不会达到 1024。

仍然不明白问题到底是什么...
但我已经解决了它...

我在使用指数和模数生成 public 客户端密钥时遇到了问题。
所以现在我使用了一种标准格式的 public 密钥证书 - DER 和 PEM。

我所做的是,使用波纹管代码从 PHP 端生成 DER 或 PEM,

$options = array('private_key_bits' => 1024,
            'private_key_type' => OPENSSL_KEYTYPE_RSA,
            'config' => realpath(__DIR__) . '/openssl.cnf');

        #Get Client Public Key  
        $keyData = openssl_pkey_get_details($pkGenerate);
        $clientPublicKey = $keyData['key'];
        $this->clientData['clientPublicKeyPEM'] = $keyData['key'];

然后将生成的 PEM 发送到服务器 (Java)。
在服务器端,我开发了下面的代码来从 POM 字符串中重新生成 Public 键。

     KeyFactory keyFactory=KeyFactory.getInstance("RSA");
     byte[] pubKeyBits = Base64.decodeBase64(clientPublickeyView.getModulusBytes());
     PublicKey pubKey=keyFactory.generatePublic(new X509EncodedKeySpec(pubKeyBits));