簡體   English   中英

RSA加密:Java到PHP

[英]RSA Encryption: Java to PHP

我正在嘗試在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”函數,但它似乎也沒有識別格式。

任何幫助將非常感謝oO

您需要將二進制格式(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密鑰的更多信息, 請查看此鏈接

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。

http://code.google.com/p/simplersalibrary/是一個簡單的工具,如果你想用Java加密東西並用PHP解密或用java加密並用PHP解密,simplersa也可以為PHP生成pem文件。

您還可以嘗試使用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鍵。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM