2016-07-26 118 views
1

我有一个服务器和一个客户端。
客户端可能使用java,php等不同的技术。
服务器代码是用java编写的。
我在服务器端做的是获取客户端公钥的指数和模数字节,并生成客户端的公钥。 要生成客户端的公钥我使用下面的代码:
RSA公钥生成问题(PHP/Java集成)

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

服务器信息
我:

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

要我使用下面的代码使用客户端的公钥加密数据使用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

+0

编辑您的问题并且添加相关的代码部分。 – Robert

+0

@Robert谢谢...编辑... –

+0

似乎你的问题是关于PHP代码,所以包括它 – pedrofb

回答

1

还没有得到确切的问题是什么?
但我已经为它围绕实现工作...

我被困在使用前端生成客户端的公钥时分量和模数。
所以现在我已经使用了一种标准格式的公钥证书 - 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)的生成DER或PEM从PHP侧。
而在服务器端,我已经开发了波纹管代码来从POM字符串重新生成公钥。

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