Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RSA公钥生成问题(PHP/Java集成)_Java_Security_Rsa_Bouncycastle_Java Security - Fatal编程技术网

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

RSA公钥生成问题(PHP/Java集成),java,security,rsa,bouncycastle,java-security,Java,Security,Rsa,Bouncycastle,Java Security,我有一台服务器和一台客户端。 客户端可能使用不同的技术,如java、php。 服务器代码是用java编写的。 我在服务器上做的是,获取客户机公钥的指数和模数字节,并生成客户机的公钥。 要生成客户端公钥,我使用以下代码: RSAPublicKeySpec spec = new RSAPublicKeySpec(modulusBigInt,exponentBigInt); keyFactory = KeyFactory.getInstance("RSA", "BC"); RSAPublicKey c

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

RSAPublicKeySpec spec = new RSAPublicKeySpec(modulusBigInt,exponentBigInt);
keyFactory = KeyFactory.getInstance("RSA", "BC");
RSAPublicKey clientPublicKey = (RSAPublicKey) keyFactory.generatePublic(spec);
要使用客户端公钥加密数据,我使用以下代码:

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制作的,那个么就可以通过客户机公钥的指数和模数成功地生成公钥。 我正在使用下面的代码生成客户端RSA密钥的密钥对

keyPairGene = KeyPairGenerator.getInstance("RSA");
keyPairGene.initialize(1024);
KeyPair keyPair = keyPairGene.genKeyPair();
RSAPublicKey clientPublickey = (RSAPublicKey) keyPair.getPublic();
客户端-2(php)
现在的问题是客户端是否在php中。。但当我当时尝试使用该公钥加密时,当我在服务器中使用默认提供程序时,会出现错误的填充异常。 我正在使用下面的代码生成客户端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中时,当我试图从指数和模数生成公钥时,我不知道发生了什么问题。。。 如果客户机是java的,那么它就没有问题了。。。。而且效果很好

欢迎任何类型的帮助

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

仍然无法确切了解问题所在
但是我已经为它实现了变通…

我一直在使用指数和模数生成客户端的公钥。
所以现在我使用了一种公钥证书的标准格式——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字符串重新生成公钥

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

编辑您的问题并添加相关的代码部分。@Robert谢谢。。。编辑…似乎您的问题是关于PHP代码,所以include itI指的是抛出
datalengtheexception
的代码。RSA密钥生成代码不感兴趣(标准代码)。RSA模数大小正常。1024是最大值,但你需要两个素数…我也面临同样的例外。。org.bouncycastle.crypto.DataLength异常:输入对RSA密码来说太大。。。。但在使用客户端(php)公钥加密时。。。