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 ò.ò

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top