Domanda
Sto cercando di implementare crittografia RSA sia in Java e PHP, ma non riesco a ottenere PHP per riconoscere la mia Java chiavi pubbliche / private. Ecco il codice Java per codifica / decodifica il pubblico e le chiavi private:
public static byte[] EncodePublicKey(PublicKey _publickey) throws Exception
{
return _publickey.getEncoded();
}
public static PublicKey DecodePublicKey(byte[] _encodedkey) throws Exception
{
KeyFactory fac = KeyFactory.getInstance("RSA");
X509EncodedKeySpec encodedKey = new X509EncodedKeySpec(_encodedkey);
return fac.generatePublic(encodedKey);
}
public static byte[] EncodePrivateKey(PrivateKey _privatekey) throws Exception
{
return _privatekey.getEncoded();
}
public static PrivateKey DecodePrivateKey(byte[] _encodedkey) throws Exception
{
KeyFactory fac = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec encodedKey = new PKCS8EncodedKeySpec(_encodedkey);
return fac.generatePrivate(encodedKey);
}
ho provato ad utilizzare le funzioni PEAR Crypt_RSA, ma non supporta X.509 o PKCS8 (solo semplicemente base64 codifica il modulo serializzato, esponente e tipo di chiave). Allora ho provato la funzione OpenSSL "openssl_get_publickey", ma non sembra riconoscere il formato sia.
Qualsiasi aiuto sarebbe molto apprezzato ò.ò
Soluzione
È necessario convertire il formato binario (DER) da Java a PEM per OpenSSL (e le associazioni PHP). È possibile verificare i file chiave Java utilizzando la riga di comando OpenSSL specificando l'opzione -inform DER
sulla riga di comando.
<?
function pem2der($pem_data) {
$begin = "KEY-----";
$end = "-----END";
$pem_data = substr($pem_data, strpos($pem_data, $begin)+strlen($begin));
$pem_data = substr($pem_data, 0, strpos($pem_data, $end));
$der = base64_decode($pem_data);
return $der;
}
function der2pem($der_data) {
$pem = chunk_split(base64_encode($der_data), 64, "\n");
$pem = "-----BEGIN PUBLIC KEY-----\n".$pem."-----END PUBLIC KEY-----\n";
return $pem;
}
// load the public key from a DER-encoded file
$pubkey = der2pem(file_get_contents("pubkey"));
?>
Per ulteriori informazioni sull'utilizzo di chiavi di OpenSSL in Java, controlla questo link .
Altri suggerimenti
Le funzioni PHP richiedono chiavi PEM codificati. E 'banale per convertire le chiavi codificate DER in PEM.
Ecco il mio codice per convertire PKCS # 8 chiave privata per PEM,
function pkcs8_to_pem($der) {
static $BEGIN_MARKER = "-----BEGIN PRIVATE KEY-----";
static $END_MARKER = "-----END PRIVATE KEY-----";
$value = base64_encode($der);
$pem = $BEGIN_MARKER . "\n";
$pem .= chunk_split($value, 64, "\n");
$pem .= $END_MARKER . "\n";
return $pem;
}
Per la chiave pubblica in X509, sostituire PRIVATO CON PUBBLICO nei marcatori.
http://code.google.com/p/simplersalibrary/ è un semplice strumento, se si vuole crittografare qualcosa in Java e decifrare in PHP o cifrare e decifrare in java in PHP, simplersa può anche generare i file PEM per PHP.
Si può anche provare a utilizzare CastleCrypt, che permette un facile da usare crittografia RSA in Java e PHP: https: / /github.com/wessnerj/CastleCrypt
Per la generazione delle chiavi si consiglia di provare con OpenSSL:
openssl genrsa -out privateKey.pem 2048
openssl pkcs8 -topk8 -nocrypt -in privateKey.pem -outform der -out privateKey.der
openssl rsa -in privateKey.pem -pubout -outform PEM -out publicKey.pem
openssl rsa -in privateKey.pem -pubout -outform DER -out publicKey.der
Questo comando ti dà la chiave privata e pubblica sia DER e PEM Format. Per Java è necessario utilizzare i tasti .der e per PHP le chiavi .pem.