2016-07-26 7 views
1

Ich habe einen Server und einen Client.
Client könnte in verschiedenen Technologien wie Java, PHP sein.
Server-Code ist in Java geschrieben.
Was ich in Server tun, ist, erhalten Sie Exponent und Modul Bytes des öffentlichen Client-Schlüssels und generieren öffentlichen Schlüssel des Clients. Um Client öffentlichen Schlüssel zu erzeugen ich den Code unten bin mit:
RSA Public Key Generation Problem (PHP/Java-Integration)

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

Daten zu verschlüsseln öffentlichen Schlüssel Client ich unten Code verwende:

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

Server Information
Ich habe implementiert RSA-1024, um den AES-Schlüssel zu verschlüsseln. Ich verwende RSA/ECB/PKCS1Padding Algorithmus. und ich habe auch sichergestellt, dass alle Clients auch 1 Padding in ihrem Code berücksichtigen.

-Client - 1 (Java)
Wenn Client auch in Java als öffentlichem Schlüssel wird erfolgreich von Exponenten und Modul von Client öffentlichen Schlüsseln erzeugt. ich den Code unten bin mit Schlüsselpaar von Client-RSA-Schlüssel zu generieren ..

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

-Client -2 (php)
Jetzt ist das Problem, wenn der Client in PHP ist .. als öffentlicher Schlüssel erfolgreich ist generiert, aber wenn ich versuche, mit diesem öffentlichen Schlüssel zu dieser Zeit zu verschlüsseln Bad Padding Ausnahme tritt auf, wenn ich Standardanbieter im Server verwendet habe. ich unten Code bin mit Schlüsselpaar von Client-RSA-Schlüssel ..

$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); 


als ich BC Anbieter versucht habe, zu generieren ... Es gibt mir die folgende Ausnahme:

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

I bekomme nicht, was ist das Problem tritt auf, wenn ich versuche, öffentlichen Schlüssel aus Exponent und Modul zu generieren, wenn Client in PHP ist ... wenn Client in Java als seine keine Probleme ist .... und funktioniert perfekt ..

Jede Art von Hilfe ist willkommen ...

Hinweis: Was ich von Debug-Code beobachtet haben, ist, auf Server-Seite Client den öffentlichen Schlüssel Bit-Länge-Modul Byte variiert bis 1023 zwischen 1020 ... es nie bei 1024 erreicht, obwohl wir Größe als 1024.

+0

Bearbeiten Sie Ihre Frage und fügen Sie die relevanten Codeile hinzu. – Robert

+0

@Robert Danke ... Bearbeitet ... –

+0

Scheint Ihr Problem ist über PHP-Code, so dass es – pedrofb

Antwort

1

noch nicht bekommen, was definieren genau das Problem ist ...
aber ich habe Arbeit um für sie umgesetzt ...

ich klemmte beim Erzeugen des öffentlichen Schlüssels des Clients unter Verwendung von ex Bauteil und Modul.
So jetzt habe ich ein Standardformat des öffentlichen Schlüsselzertifikats verwendet - DER & PEM.

Was ich getan habe ist, erzielte DER oder PEM von PHP Seite unten Code,

$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']; 

Und dann senden, die PEM Server (Java) generiert.
Und auf der Serverseite habe ich den folgenden Code entwickelt, um den öffentlichen Schlüssel aus der POM-Zeichenfolge zu regenerieren.

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