7

JavaとPHPの両方でRSA暗号化を実装しようとしていますが、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);
}

最初にPEARCrypt_RSA関数を使用してみましたが、X.509またはPKCS8をサポートしていません(シリアル化されたモジュラス、指数、およびキータイプをbase64でエンコードするだけです)。次に、OpenSSLの「openssl_get_publickey」関数を試しましたが、形式も認識されないようです。

どんな助けでも大歓迎ですoO

4

4 に答える 4

12

OpenSSL (および PHP バインディング) のために、バイナリ形式 (DER) を Java から PEM に変換する必要があります。-inform DERコマンド ラインでオプションを指定することにより、OpenSSL コマンド ラインを使用して Java キー ファイルをテストできます。

<?
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 キーを使用する方法の詳細については、このリンクを確認してください

于 2009-11-02T18:35:57.387 に答える
5

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 に置き換えます。

于 2009-11-02T19:27:54.147 に答える
1

http://code.google.com/p/simplersalibrary/は単純なツールです。Java で暗号化して PHP で復号化する場合、または Java で暗号化して PHP で復号化する場合、simplersa は PHP 用の pem ファイルを生成することもできます。

于 2010-10-28T02:53:34.590 に答える
1

JAVA と PHP で簡単に使用できる RSA 暗号化を可能にする CastleCrypt を使用することもできます: 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 キーを使用する必要があります。

于 2012-02-16T15:24:54.233 に答える