rsa加密:java到php

nwlqm0z1  于 2021-07-05  发布在  Java
关注(0)|答案(4)|浏览(474)

我试图在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\u rsa函数,但它不支持x.509或pkcs8(它只是对序列化的模、指数和密钥类型进行base64编码)。然后我尝试了openssl“openssl\u get\u publickey”函数,但它似乎也无法识别该格式。
任何帮助都将不胜感激

ggazkfy8

ggazkfy81#

您还可以尝试使用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键。

3zwjbxry

3zwjbxry2#

http://code.google.com/p/simplersalibrary/ 是一个简单的工具,如果你想用java加密,用php解密,或者用java加密,用php解密,simplersa还可以为php生成pem文件。

olhwl3o2

olhwl3o23#

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。

uidvcgyl

uidvcgyl4#

您需要将二进制格式(der)从java转换为openssl的pem(以及php绑定)。通过指定 -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"));
?>

有关在java中使用openssl密钥的更多信息,请查看此链接。

相关问题