Pregunta

Estoy tratando de poner en práctica cifrado RSA en Java y PHP, pero me parece que no puede obtener PHP para reconocer mis claves públicas / privadas Java. Aquí está el código Java para envío / recepción del público y las claves privadas:

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

I primero intentado utilizar las funciones PEAR Crypt_RSA, pero no es compatible con X.509 o PKCS8 (que simplemente base64 codifica el módulo en serie, exponente y tipo de clave). Luego trató de la función OpenSSL "openssl_get_publickey" pero no parece reconocer el formato tampoco.

Cualquier ayuda sería muy apreciada O.o

¿Fue útil?

Solución

Es necesario para convertir el formato binario (DER) de Java a PEM de OpenSSL (y los enlaces de PHP). Usted puede probar sus archivos de claves de Java utilizando la línea de comandos OpenSSL especificando la opción -inform DER en la línea de comandos.

<?
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"));
?>

Para obtener más información sobre el uso de las teclas de OpenSSL en Java, echa un vistazo a este enlace .

Otros consejos

Las funciones PHP requieren llaves codificadas PEM. Es trivial para convertir llaves codificadas DER en PEM.

Aquí está mi código para convertir PKCS # 8 clave privada a 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;
}

Para obtener la clave pública en X509, reemplace privado con PÚBLICO en los marcadores.

http://code.google.com/p/simplersalibrary/ es un simple herramienta, si quieres algo cifrar y descifrar en Java en PHP o cifrar y descifrar en java en PHP, simplersa puede también generar los archivos PEM para PHP.

También puede tratar de utilizar CastleCrypt, lo que permite un fácil utilizar el cifrado RSA en Java y PHP: https: / /github.com/wessnerj/CastleCrypt

Para la generación de claves es posible que desee probar 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

Este comando le da la clave privada y pública, tanto en formato DER y PEM. Para JAVA que tiene que utilizar las teclas y para PHP .der las teclas .pem.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top