Шифрование RSA: Java для PHP - PullRequest
7 голосов
/ 02 ноября 2009

Я пытаюсь реализовать шифрование RSA как на Java, так и на PHP, но я не могу заставить PHP распознавать мои открытые / закрытые ключи Java. Вот код Java для кодирования / декодирования открытых и закрытых ключей:

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

Сначала я попробовал использовать функции PEAR Crypt_RSA, но он не поддерживает X.509 или PKCS8 (просто base64 кодирует сериализованный модуль, экспоненту и тип ключа). Затем я попробовал функцию OpenSSL "openssl_get_publickey", но она также не распознает формат.

Любая помощь будет принята с благодарностью o.O

Ответы [ 4 ]

11 голосов
/ 02 ноября 2009

Вам необходимо преобразовать двоичный формат (DER) из Java в PEM для OpenSSL (и привязки PHP). Вы можете протестировать файлы ключей Java с помощью командной строки OpenSSL, указав параметр -inform DER в командной строке.

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

Для получения дополнительной информации об использовании ключей OpenSSL в Java, перейдите по этой ссылке .

5 голосов
/ 02 ноября 2009

Для функций PHP требуются ключи в кодировке PEM. Преобразовать ключи в кодировке DER в PEM тривиально.

Вот мой код для преобразования закрытого ключа PKCS # 8 в 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;
}

Для открытого ключа в X509 замените PRIVATE на PUBLIC в маркерах.

1 голос
/ 16 февраля 2012

Вы также можете попробовать использовать CastleCrypt, который позволяет легко использовать RSA-шифрование в JAVA И PHP: https://github.com/wessnerj/CastleCrypt

Для генерации ключа вы можете попробовать его с 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

Эта команда предоставляет вам закрытый и открытый ключ как в формате DER, так и в формате PEM. Для JAVA вы должны использовать ключи .der, а для PHP - ключи .pem.

1 голос
/ 28 октября 2010

http://code.google.com/p/simplersalibrary/ - это простой инструмент, если вы хотите зашифровать что-то в Java и расшифровать в PHP или зашифровать в java и расшифровать в PHP, simplersa также может сгенерировать файлы pem для PHP.

...