2016-07-26 119 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));