rsa加密:java到php

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

我试图在java和php中实现rsa加密,但似乎无法让php识别我的java公钥/私钥。下面是对公钥和私钥进行编码/解码的java代码:

  1. public static byte[] EncodePublicKey(PublicKey _publickey) throws Exception
  2. {
  3. return _publickey.getEncoded();
  4. }
  5. public static PublicKey DecodePublicKey(byte[] _encodedkey) throws Exception
  6. {
  7. KeyFactory fac = KeyFactory.getInstance("RSA");
  8. X509EncodedKeySpec encodedKey = new X509EncodedKeySpec(_encodedkey);
  9. return fac.generatePublic(encodedKey);
  10. }
  11. public static byte[] EncodePrivateKey(PrivateKey _privatekey) throws Exception
  12. {
  13. return _privatekey.getEncoded();
  14. }
  15. public static PrivateKey DecodePrivateKey(byte[] _encodedkey) throws Exception
  16. {
  17. KeyFactory fac = KeyFactory.getInstance("RSA");
  18. PKCS8EncodedKeySpec encodedKey = new PKCS8EncodedKeySpec(_encodedkey);
  19. return fac.generatePrivate(encodedKey);
  20. }

我第一次尝试使用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进行尝试:

  1. openssl genrsa -out privateKey.pem 2048
  2. openssl pkcs8 -topk8 -nocrypt -in privateKey.pem -outform der -out privateKey.der
  3. openssl rsa -in privateKey.pem -pubout -outform PEM -out publicKey.pem
  4. 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的代码,

  1. function pkcs8_to_pem($der) {
  2. static $BEGIN_MARKER = "-----BEGIN PRIVATE KEY-----";
  3. static $END_MARKER = "-----END PRIVATE KEY-----";
  4. $value = base64_encode($der);
  5. $pem = $BEGIN_MARKER . "\n";
  6. $pem .= chunk_split($value, 64, "\n");
  7. $pem .= $END_MARKER . "\n";
  8. return $pem;
  9. }

对于x509中的公钥,在标记中将private替换为public。

展开查看全部
uidvcgyl

uidvcgyl4#

您需要将二进制格式(der)从java转换为openssl的pem(以及php绑定)。通过指定 -inform DER 命令行上的选项。

  1. <?
  2. function pem2der($pem_data) {
  3. $begin = "KEY-----";
  4. $end = "-----END";
  5. $pem_data = substr($pem_data, strpos($pem_data, $begin)+strlen($begin));
  6. $pem_data = substr($pem_data, 0, strpos($pem_data, $end));
  7. $der = base64_decode($pem_data);
  8. return $der;
  9. }
  10. function der2pem($der_data) {
  11. $pem = chunk_split(base64_encode($der_data), 64, "\n");
  12. $pem = "-----BEGIN PUBLIC KEY-----\n".$pem."-----END PUBLIC KEY-----\n";
  13. return $pem;
  14. }
  15. // load the public key from a DER-encoded file
  16. $pubkey = der2pem(file_get_contents("pubkey"));
  17. ?>

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

展开查看全部

相关问题