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

我首先尝试使用 PEAR Crypt_RSA 函数,但它不支持 X.509 或 PKCS8(它只是简单地 base64 编码序列化的模数、指数和密钥类型)。然后我尝试了 OpenSSL“openssl_get_publickey”函数,但它似乎也无法识别格式。

任何帮助将不胜感激

4

4 回答 4

12

您需要将二进制格式 (DER) 从 Java 转换为 PEM 以用于 OpenSSL(和 PHP 绑定)。-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中解密,simplesa也可以为PHP生成pem文件。

于 2010-10-28T02:53:34.590 回答
1

您也可以尝试使用 CastleCrypt,它允许在 JAVA 和 PHP 中轻松使用 RSA 加密: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 回答