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

时间:2016-07-26 07:54:49

标签: java security rsa bouncycastle java-security

我有一台服务器和一台客户端 客户端可能使用不同的技术,如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.

1 个答案:

答案 0 :(得分:1)

仍然没有得到究竟问题是什么...
但我已经为它实施了工作......

我在使用指数和模数生成客户公钥时陷入困境 所以现在我使用了一种标准格式的公钥证书 - 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));