2009-11-02 10 views
7

Hem Java hem de PHP'de RSA Şifrelemeyi uygulamaya çalışıyorum ama PHP'nin genel/özel anahtarlarımı tanıması için PHP'yi göremiyorum. İşte genel ve özel Keys/kodlayın Decode için java kodu:RSA Şifreleme: PHP to 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); 
} 

Ben ilk ARMUT Crypt_RSA işlevleri kullanarak çalıştı, ama X.509 veya PKCS8 (sadece basitçe base64 tefrika kodlar desteklemiyor modül, üs ve anahtar tipi). Daha sonra OpenSSL "openssl_get_publickey" işlevini denedim ancak biçimi de algılamıyor gibi görünüyor.

Herhangi bir yardım büyük o.o

cevap

10

Sen OpenSSL (ve PHP bağlamaları) için PEM Java dan ikili biçimi (DER) dönüştürmek gerekir mutluluk duyacağız. Java anahtar dosyalarınızı, komut satırında -inform DER seçeneğini belirterek OpenSSL komut satırını kullanarak test edebilirsiniz. Java, check out this link yılında OpenSSL tuşlarını kullanma hakkında daha fazla bilgi için

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

.

+0

ASN.1 kodlamasını PHP'deki PEM formatına dönüştürmeyi nasıl başarabilirim? – user201117

+0

Yukarıdaki bağlantıyı bulduktan sonra cevabımı güncelledi ... – jheddings

+0

Bu işe yaradı! Teşekkürler =) – user201117

5

PHP işlevleri PEM kodlu anahtarlar gerektirir. DER kodlanmış anahtarları PEM'e dönüştürmek önemsizdir.

İşte X509 kamu anahtarı için

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

PEM PKCS 8. özel anahtarı dönüştürmek için benim kodu belirteçlerindeki KAMU ile ÖZEL değiştirin.

+0

Bu, kabul edilen yanıtla aynıdır, ancak sonra gelir. – user201117

1

http://code.google.com/p/simplersalibrary/, basit bir araçtır Java şey şifrelemek ve çözmek PHP veya Java şifrelemek ve çözmek PHP istiyorsanız, simplersa da PHP pem dosyaları oluşturabilir.

Ayrıca kolay RSA JAVA Encryption VE PHP kullanmasına izin verir CastleCrypt, kullanmayı deneyebilirsiniz
1

:

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 

: Eğer openssl ile denemek isteyebilirsiniz anahtar nesil için https://github.com/wessnerj/CastleCrypt

Bu komut size hem DER hem de PEM Formatında özel ve açık anahtar verir. JAVA için .der tuşlarını ve PHP için .pem tuşlarını kullanmalısınız.