8

$publicKey = "../ssh/public/pub"; $plaintext = "要加密的字符串";

$pubKey = openssl_pkey_get_public($publicKey);

openssl_public_encrypt($plaintext, $encrypted, $pubKey);

echo $encrypted;   //encrypted string

上面的代码生成以下错误

openssl_public_encrypt() [http://php.net/function.openssl-public-encrypt]:密钥参数不是有效的公钥 [APP/controllers/supportservice_controller.php,第 144 行]

我使用 openssl 创建了密钥:

生成一个 1024 位 rsa 私钥,要求输入密码对其进行加密并保存到文件 openssl genrsa -des3 -out /path/to/privatekey 1024

生成私钥的公钥并保存到文件

openssl rsa -in /path/to/privatekey -pubout -out /path/to/publickey

4

4 回答 4

4

就我而言,我将公钥拆分为多行,解决了这个问题。

PHP 版本 7.1.17

    $publicKey = "-----BEGIN PUBLIC KEY-----\n" . wordwrap($publicKey, 64, "\n", true) . "\n-----END PUBLIC KEY-----";

    $str = "str to be encrypted";

    $opensslPublicEncrypt = openssl_public_encrypt($str, $encrypted, $publicKey);
于 2019-07-25T01:55:52.437 回答
3

在 PHP 7.x 和新版本的phpseclib纯 PHP RSA 实现)中,并使用 composer 安装phpseclib,您可以这样做:

    # Install the phpseclib from console
    composer require phpseclib/phpseclib:~2.0
    // In your php script:

    use phpseclib\Crypt\RSA;

    $rsa = new RSA();
    $rsa->loadKey($publicKey); # $publicKey is an string like "QEFAAOCAQ8AMIIBCgKCAQEAoHcbG....."
    $plaintext = '...';
    $ciphertext = $rsa->encrypt($plaintext);

    var_dump($ciphertext);

    #to decrypt:
    $rsa->loadKey('...'); // private key
    echo $rsa->decrypt($ciphertext);```



于 2019-01-26T19:00:31.093 回答
2

像这样,您可以添加密钥并加密文本

  $data = json_decode(file_get_contents('php://input'), true);
  $enctext = $data['enctext'];

  $pubkey = '-----BEGIN PUBLIC KEY-----
             PUBLIC  KEY PLACED HERE
             -----END PUBLIC KEY-----';

  openssl_public_encrypt($enctext, $crypted, $pubkey);
  $data['enctext'] =  $enctext;
  $data['Encryption_text'] = base64_encode($crypted);
  echo json_encode($data);
  exit;

或者,您也可以调用公钥的 .cert 文件来代替这个

  $fp=fopen("publickey.crt","r"); 
  $pub_key_string=fread($fp,8192); 
  fclose($fp); 
  $key_resource = openssl_get_publickey($pub_key_string); 

  openssl_public_encrypt($enctext, $crypted, $key_resource );
  $data['enctext'] =  $enctext;
  $data['Encryption_text'] = base64_encode($crypted);
  echo json_encode($data);
  exit;
于 2018-04-10T12:26:15.857 回答
0

在 PHP 中使用 OpenSSL 的函数时,公钥必须封装在 X.509 证书中。您可以使用 CSR 创建它。或者您可以使用phpseclib,一个纯 PHP RSA 实现,并直接使用原始公钥。例如。

<?php
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();
$rsa->loadKey('...'); // public key

$plaintext = '...';

//$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
$ciphertext = $rsa->encrypt($plaintext);
于 2013-09-18T18:52:23.390 回答