RSA Şifreleme: PHP Java

4 Cevap java

Java ve PHP hem de RSA şifreleme uygulamak çalışıyorum, ama benim Java kamu / özel anahtar tanıması için PHP almak gibi olamaz. İşte Kamu ve Özel Tuşlar Decode / Encode için java kodu:

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 PEAR Crypt_RSA fonksiyonlarını kullanarak çalıştı, ancak X.509 veya PKCS8 (sadece basitçe base64 tefrika modülü, üs ve anahtar türü kodlar) desteklemiyor. Sonra OpenSSL "openssl_get_publickey" fonksiyonunu denedim ama ya biçimini tanımak görünmüyor.

Herhangi bir yardım büyük mutluluk duyacağız ò.ó

4 Cevap

OpenSSL PEM Java ikili biçimi (DER) (ve PHP ciltleri) dönüştürmek gerekir. Siz komut satırında -inform DER seçeneğini belirterek OpenSSL komut satırını kullanarak Java anahtar dosyaları test edebilirsiniz.

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

Java OpenSSL tuşlarını kullanma hakkında daha fazla bilgi için, check out this link.

PHP fonksiyonları PEM kodlu tuşları gerektirir. Bu PEM içine DER kodlanmış anahtarlarını dönüştürmek için önemsiz bulunuyor.

İşte PEM pkcs 8. Özel anahtarı dönüştürmek için benim kod

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

X509 kamu anahtarı için, belirleyicilerinde KAMU ÖZEL ile değiştirin.

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

Ayrıca kolay Java ve PHP RSA şifreleme kullanmak için izin verir CastleCrypt, kullanmayı deneyebilirsiniz: https://github.com/wessnerj/CastleCrypt

Anahtar üretimi için, openssl ile denemek isteyebilirsiniz:

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

Bu komutları size DER ve PEM Format hem de kamu ve özel anahtar verir. JAVA için sen. Der tuşları ve PHP için. Pem tuşlarını kullanmak zorunda.