2009-11-02 7 views
7

J'essaie d'implémenter RSA Encryption à la fois en Java et en PHP, mais je n'arrive pas à faire en sorte que PHP reconnaisse mes clés publiques/privées Java. Voici le code java pour encoder/décoder les clés publiques et privées:Chiffrement RSA: Java vers PHP

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

J'ai d'abord essayé d'utiliser les fonctions PEAR Crypt_RSA, mais il ne supporte pas X.509 ou PKCS8 (il tout simplement base64 code sérialisé la module, exposant et type de clé). J'ai ensuite essayé la fonction OpenSSL "openssl_get_publickey" mais il ne semble pas non plus reconnaître le format.

Toute aide serait grandement appréciée o.o

Répondre

10

Vous devez convertir le format binaire (DER) de Java à PEM pour OpenSSL (et les liaisons PHP). Vous pouvez tester vos fichiers de clés Java à l'aide de la ligne de commande OpenSSL en spécifiant l'option -inform DER sur la ligne de commande.

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

Pour plus d'informations sur l'utilisation des clés OpenSSL dans Java, check out this link.

+0

Comment puis-je convertir l'encodage ASN.1 au format PEM en PHP? – user201117

+0

Mis à jour ma réponse après avoir trouvé le lien ci-dessus ... – jheddings

+0

Cela a fonctionné! Merci =) – user201117

5

Les fonctions PHP nécessitent des clés codées PEM. Il est trivial de convertir les clés codées DER en PEM.

Voici mon code pour convertir PKCS # 8 clé privée à 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; 
} 

Pour clé publique X509, avec le public PRIVÉ remplacer des marqueurs.

+0

Cela fait la même chose que la réponse acceptée, mais est venu après. – user201117

1

http://code.google.com/p/simplersalibrary/ est un outil simple, si vous voulez crypter quelque chose en Java et décrypter en PHP ou crypter en Java et décrypter en PHP, simplersa peut également générer les fichiers pem pour PHP.

1

Vous pouvez aussi utiliser CastleCrypt, ce qui permet un facile d'utiliser le cryptage RSA en Java et PHP: https://github.com/wessnerj/CastleCrypt

Pour la génération de clés que vous pouvez essayer avec 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 

Cette commande vous donne la clé publique et privée dans les formats DER et PEM. Pour JAVA vous devez utiliser les clés .der et pour PHP les clés .pem.