代码之家  ›  专栏  ›  技术社区  ›  azoundria

在没有Composer的情况下安装PHPSecLib

  •  0
  • azoundria  · 技术社区  · 3 年前

    我正在尝试使用PHPSecLib进行RSA加密,并进行手动安装(即不使用Composer)。

    我遵循我在这里找到的这些手动安装说明: https://davescripts.com/manual-installation-of-phpseclib

    试着做这个我在这里找到的例子: How to Decrypt RSA OAEP with SHA256 using openssl on PHP

    到目前为止,我已经采取了以下步骤:

    1. 访问了GitHub存储库: https://github.com/phpseclib/phpseclib/tree/3.0

    2. 在“代码”下选择“下载ZIP”。

    3. 在本地解压缩文件,并将整个“phpseclib”目录上传到服务器。

    4. 创建了一个测试脚本,并解决了使其工作所需的多层包含和使用问题。

    5. 然而,目前,我遇到了一个新的错误——“类名必须是有效的对象或字符串”,我不理解,似乎无法解决这个错误。

    我的测试脚本现在如下:

    <?php
    
      ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL);
      header("Content-Type: text/plain");
      $sIncludePath = get_include_path() . PATH_SEPARATOR . '../inc/phpseclib';
      echo $sIncludePath."\n";
      set_include_path($sIncludePath);
    
      include('Crypt/Common/AsymmetricKey.php');
      include('Math/BigInteger.php');
      include('Crypt/EC.php');
      include('Crypt/PublicKeyLoader.php');
      include('Crypt/RSA.php');
    
      use phpseclib3\Crypt\RSA;
      use phpseclib3\Crypt\PublicKeyLoader;
    
      function rsaEncryptionOaepSha256 ($publicKey, $plaintext) {
        $rsa = PublicKeyLoader::load($publicKey)
            ->withHash('sha256')
            ->withMGFHash('sha256');
        return $rsa->encrypt($plaintext);
      }
    
      function rsaDecryptionOaepSha256 ($privateKey, $ciphertext) {
        $rsa = PublicKeyLoader::load($privateKey)
            ->withHash('sha256')
            ->withMGFHash('sha256');
        return $rsa->decrypt($ciphertext);
      }
      
      function loadRsaPrivateKeyPem() {
        // this is a sample key - don't worry !
        return '
    -----BEGIN PRIVATE KEY-----
    MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDwSZYlRn86zPi9
    e1RTZL7QzgE/36zjbeCMyOhf6o/WIKeVxFwVbG2FAY3YJZIxnBH+9j1XS6f+ewjG
    FlJY4f2IrOpS1kPiO3fmOo5N4nc8JKvjwmKtUM0t63uFFPfs69+7mKJ4w3tk2mSN
    4gb8J9P9BCXtH6Q78SdOYvdCMspA1X8eERsdLb/jjHs8+gepKqQ6+XwZbSq0vf2B
    MtaAB7zTX/Dk+ZxDfwIobShPaB0mYmojE2YAQeRq1gYdwwO1dEGk6E5J2toWPpKY
    /IcSYsGKyFqrsmbw0880r1BwRDer4RFrkzp4zvY+kX3eDanlyMqDLPN+ghXT1lv8
    snZpbaBDAgMBAAECggEBAIVxmHzjBc11/73bPB2EGaSEg5UhdzZm0wncmZCLB453
    XBqEjk8nhDsVfdzIIMSEVEowHijYz1c4pMq9osXR26eHwCp47AI73H5zjowadPVl
    uEAot/xgn1IdMN/boURmSj44qiI/DcwYrTdOi2qGA+jD4PwrUl4nsxiJRZ/x7PjL
    hMzRbvDxQ4/Q4ThYXwoEGiIBBK/iB3Z5eR7lFa8E5yAaxM2QP9PENBr/OqkGXLWV
    qA/YTxs3gAvkUjMhlScOi7PMwRX9HsrAeLKbLuC1KJv1p2THUtZbOHqrAF/uwHaj
    ygUblFaa/BTckTN7PKSVIhp7OihbD04bSRrh+nOilcECgYEA/8atV5DmNxFrxF1P
    ODDjdJPNb9pzNrDF03TiFBZWS4Q+2JazyLGjZzhg5Vv9RJ7VcIjPAbMy2Cy5BUff
    EFE+8ryKVWfdpPxpPYOwHCJSw4Bqqdj0Pmp/xw928ebrnUoCzdkUqYYpRWx0T7YV
    RoA9RiBfQiVHhuJBSDPYJPoP34kCgYEA8H9wLE5L8raUn4NYYRuUVMa+1k4Q1N3X
    Bixm5cccc/Ja4LVvrnWqmFOmfFgpVd8BcTGaPSsqfA4j/oEQp7tmjZqggVFqiM2m
    J2YEv18cY/5kiDUVYR7VWSkpqVOkgiX3lK3UkIngnVMGGFnoIBlfBFF9uo02rZpC
    5o5zebaDImsCgYAE9d5wv0+nq7/STBj4NwKCRUeLrsnjOqRriG3GA/TifAsX+jw8
    XS2VF+PRLuqHhSkQiKazGr2Wsa9Y6d7qmxjEbmGkbGJBC+AioEYvFX9TaU8oQhvi
    hgA6ZRNid58EKuZJBbe/3ek4/nR3A0oAVwZZMNGIH972P7cSZmb/uJXMOQKBgQCs
    FaQAL+4sN/TUxrkAkylqF+QJmEZ26l2nrzHZjMWROYNJcsn8/XkaEhD4vGSnazCu
    /B0vU6nMppmezF9Mhc112YSrw8QFK5GOc3NGNBoueqMYy1MG8Xcbm1aSMKVv8xba
    rh+BZQbxy6x61CpCfaT9hAoA6HaNdeoU6y05lBz1DQKBgAbYiIk56QZHeoZKiZxy
    4eicQS0sVKKRb24ZUd+04cNSTfeIuuXZrYJ48Jbr0fzjIM3EfHvLgh9rAZ+aHe/L
    84Ig17KiExe+qyYHjut/SC0wODDtzM/jtrpqyYa5JoEpPIaUSgPuTH/WhO3cDsx6
    3PIW4/CddNs8mCSBOqTnoaxh
    -----END PRIVATE KEY-----
    ';
      }
    
      function loadRsaPublicKeyPem() {
        // this is a sample key - don't worry !
        return '
    -----BEGIN PUBLIC KEY-----
    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8EmWJUZ/Osz4vXtUU2S+
    0M4BP9+s423gjMjoX+qP1iCnlcRcFWxthQGN2CWSMZwR/vY9V0un/nsIxhZSWOH9
    iKzqUtZD4jt35jqOTeJ3PCSr48JirVDNLet7hRT37Ovfu5iieMN7ZNpkjeIG/CfT
    /QQl7R+kO/EnTmL3QjLKQNV/HhEbHS2/44x7PPoHqSqkOvl8GW0qtL39gTLWgAe8
    01/w5PmcQ38CKG0oT2gdJmJqIxNmAEHkatYGHcMDtXRBpOhOSdraFj6SmPyHEmLB
    ishaq7Jm8NPPNK9QcEQ3q+ERa5M6eM72PpF93g2p5cjKgyzzfoIV09Zb/LJ2aW2g
    QwIDAQAB
    -----END PUBLIC KEY-----
    ';
      }
    
      function base64Encoding ($input) {
        return base64_encode($input);
      }
      function base64Decoding ($input) {
        return base64_decode($input);
      }
    
      echo 'RSA 2048 encryption OAEP SHA-256 string' . PHP_EOL;
      $sDataToEncrypt = "The quick brown fox jumps over the lazy dog";
      echo 'plaintext: ' . $sDataToEncrypt . PHP_EOL;
    
      // encryption
      echo PHP_EOL . '* * * encrypt the plaintext with the RSA public key * * *' .PHP_EOL;
      $ciphertextBase64 = base64Encoding(rsaEncryptionOaepSha256(loadRsaPublicKeyPem(), $sDataToEncrypt));
      echo 'ciphertextBase64: ' . $ciphertextBase64 . PHP_EOL;
    
      // transport the encrypted data to recipient
    
      // receiving the encrypted data, decryption
      echo PHP_EOL . '* * * decrypt the ciphertext with the RSA private key * * *' .PHP_EOL;
      $ciphertextReceivedBase64 = $ciphertextBase64;
      echo 'ciphertextReceivedBase64: ' . $ciphertextReceivedBase64 . PHP_EOL;
      $decryptedtext = rsaDecryptionOaepSha256(loadRsaPrivateKeyPem(), base64Decoding($ciphertextReceivedBase64));
      echo 'decryptedtext: ' . $decryptedtext . PHP_EOL;
    
    ?>
    

    然而,当我尝试运行这个PHP代码时,我收到了以下输出,这让我陷入了困境:

    .:/opt/alt/php70/usr/share/pear:../inc/phpseclib
    RSA 2048 encryption OAEP SHA-256 string
    plaintext: The quick brown fox jumps over the lazy dog
    
    * * * encrypt the plaintext with the RSA public key * * *
    <br />
    <b>Fatal error</b>:  Uncaught Error: Class name must be a valid object or a string in /home/.../inc/phpseclib/Math/BigInteger.php:182
    Stack trace:
    #0 /home/.../inc/phpseclib/Crypt/Common/AsymmetricKey.php(143): phpseclib3\Math\BigInteger-&gt;__construct(0)
    #1 /home/.../inc/phpseclib/Crypt/Common/AsymmetricKey.php(162): phpseclib3\Crypt\Common\AsymmetricKey::initialize_static_variables()
    #2 /home/.../inc/phpseclib/Crypt/PublicKeyLoader.php(45): phpseclib3\Crypt\Common\AsymmetricKey::load('\r\n-----BEGIN PU...', false)
    #3 /home/.../main/phpseclibtest.php(19): phpseclib3\Crypt\PublicKeyLoader::load('\r\n-----BEGIN PU...')
    #4 /home/.../main/phpseclibtest.php(94): rsaEncryptionOaepSha256('\r\n-----BEGIN PU...', 'The quick brown...')
    #5 {main}
      thrown in <b>/home/.../inc/phpseclib/Math/BigInteger.php</b> on line <b>182</b><br />
    

    如果有帮助,请注意测试脚本位于一个单独的目录中,如下所示:

    inc
    -> phpseclib (the PHPSecLib library with all subdirectories)
    main
    -> phpseclibtest.php (my test script)
    

    PHP版本是7.0.33,如果这有什么不同的话。

    我真的很想知道如何让PHPSecLib发挥作用。如果有人能帮我弄清楚发生了什么,那将是太棒了。

    0 回复  |  直到 3 年前
        1
  •  1
  •   azoundria    3 年前

    您正试图使用phpseclibv2的说明安装phpseclibv3。有两种选择:

    选项1:将PHPSecLib V3与Composer一起使用

    此选项要求对服务器进行SSH访问。

    要安装phpseclibv3,您需要 Composer 。一旦你安装好了,你就可以 composer init 然后 composer require phpseclib/phpseclib:~3.0 .

    通过这样做,您可以替换此:

      ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL);
      header("Content-Type: text/plain");
      $sIncludePath = get_include_path() . PATH_SEPARATOR . '../inc/phpseclib';
      echo $sIncludePath."\n";
      set_include_path($sIncludePath);
    
      include('Crypt/Common/AsymmetricKey.php');
      include('Math/BigInteger.php');
      include('Crypt/EC.php');
      include('Crypt/PublicKeyLoader.php');
      include('Crypt/RSA.php');
    

    有了这个:

    require __DIR__ . '/vendor/autoload.php'; 
    

    一旦您完成了这项工作,phpseclibv3应该可以顺利工作。您遇到的问题是由于phpseclibv3试图自动加载引擎,但由于没有自动加载程序,所以无法自动加载。

    请注意,SSH不需要在运行后使用生成的代码。要让PHPSecLib v3为没有SSH的人工作,您可以在本地执行composer init,然后composer需要PHPSecLib/PHPSecLib:3.0,然后获取您的供应商目录以及composer.json和composer.lock文件,并将其放入您想要的任何项目中。即,最终用户不会运行composer,而是运行compose器。你会下载依赖项,而他们只会使用你下载的依赖项!

    选项2:手动使用PHPSecLib2

    此选项不需要SSH。PHPSecLib2的功能比PHPSecLib3少,但它仍然得到了积极维护。(甚至PHPSecLib1也会定期更新。)

    PHPSecLib2没有PublicKeyLoader类,因此您将使用RSA类,如下所示:

    <?php
    
      ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL);
      header("Content-Type: text/plain");
      $sIncludePath = get_include_path() . PATH_SEPARATOR . '../s/phpseclib';
      echo $sIncludePath."\n";
      set_include_path($sIncludePath);
    
      include('Math/BigInteger.php');
      include('Crypt/RSA.php');
      include('Crypt/Hash.php');
      include('Crypt/Random.php');
    
      use phpseclib\Crypt\RSA;
      use phpseclib\Crypt\Hash;
      use phpseclib\Crypt\Random;
    
      function rsaEncryptionOaepSha256 ($publicKey, $plaintext) {
        $rsa = new RSA;
        $rsa->loadKey($publicKey);
        $rsa->setHash('sha256');
        $rsa->setMGFHash('sha256');
        return $rsa->encrypt($plaintext);
      }
    
      function rsaDecryptionOaepSha256 ($privateKey, $ciphertext) {
        $rsa = new RSA;
        $rsa->loadKey($privateKey);
        $rsa->setHash('sha256');
        $rsa->setMGFHash('sha256');
        return $rsa->decrypt($ciphertext);
      }
      
      function loadRsaPrivateKeyPem() {
        // this is a sample key - don't worry !
        return '
    -----BEGIN PRIVATE KEY-----
    MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDwSZYlRn86zPi9
    e1RTZL7QzgE/36zjbeCMyOhf6o/WIKeVxFwVbG2FAY3YJZIxnBH+9j1XS6f+ewjG
    FlJY4f2IrOpS1kPiO3fmOo5N4nc8JKvjwmKtUM0t63uFFPfs69+7mKJ4w3tk2mSN
    4gb8J9P9BCXtH6Q78SdOYvdCMspA1X8eERsdLb/jjHs8+gepKqQ6+XwZbSq0vf2B
    MtaAB7zTX/Dk+ZxDfwIobShPaB0mYmojE2YAQeRq1gYdwwO1dEGk6E5J2toWPpKY
    /IcSYsGKyFqrsmbw0880r1BwRDer4RFrkzp4zvY+kX3eDanlyMqDLPN+ghXT1lv8
    snZpbaBDAgMBAAECggEBAIVxmHzjBc11/73bPB2EGaSEg5UhdzZm0wncmZCLB453
    XBqEjk8nhDsVfdzIIMSEVEowHijYz1c4pMq9osXR26eHwCp47AI73H5zjowadPVl
    uEAot/xgn1IdMN/boURmSj44qiI/DcwYrTdOi2qGA+jD4PwrUl4nsxiJRZ/x7PjL
    hMzRbvDxQ4/Q4ThYXwoEGiIBBK/iB3Z5eR7lFa8E5yAaxM2QP9PENBr/OqkGXLWV
    qA/YTxs3gAvkUjMhlScOi7PMwRX9HsrAeLKbLuC1KJv1p2THUtZbOHqrAF/uwHaj
    ygUblFaa/BTckTN7PKSVIhp7OihbD04bSRrh+nOilcECgYEA/8atV5DmNxFrxF1P
    ODDjdJPNb9pzNrDF03TiFBZWS4Q+2JazyLGjZzhg5Vv9RJ7VcIjPAbMy2Cy5BUff
    EFE+8ryKVWfdpPxpPYOwHCJSw4Bqqdj0Pmp/xw928ebrnUoCzdkUqYYpRWx0T7YV
    RoA9RiBfQiVHhuJBSDPYJPoP34kCgYEA8H9wLE5L8raUn4NYYRuUVMa+1k4Q1N3X
    Bixm5cccc/Ja4LVvrnWqmFOmfFgpVd8BcTGaPSsqfA4j/oEQp7tmjZqggVFqiM2m
    J2YEv18cY/5kiDUVYR7VWSkpqVOkgiX3lK3UkIngnVMGGFnoIBlfBFF9uo02rZpC
    5o5zebaDImsCgYAE9d5wv0+nq7/STBj4NwKCRUeLrsnjOqRriG3GA/TifAsX+jw8
    XS2VF+PRLuqHhSkQiKazGr2Wsa9Y6d7qmxjEbmGkbGJBC+AioEYvFX9TaU8oQhvi
    hgA6ZRNid58EKuZJBbe/3ek4/nR3A0oAVwZZMNGIH972P7cSZmb/uJXMOQKBgQCs
    FaQAL+4sN/TUxrkAkylqF+QJmEZ26l2nrzHZjMWROYNJcsn8/XkaEhD4vGSnazCu
    /B0vU6nMppmezF9Mhc112YSrw8QFK5GOc3NGNBoueqMYy1MG8Xcbm1aSMKVv8xba
    rh+BZQbxy6x61CpCfaT9hAoA6HaNdeoU6y05lBz1DQKBgAbYiIk56QZHeoZKiZxy
    4eicQS0sVKKRb24ZUd+04cNSTfeIuuXZrYJ48Jbr0fzjIM3EfHvLgh9rAZ+aHe/L
    84Ig17KiExe+qyYHjut/SC0wODDtzM/jtrpqyYa5JoEpPIaUSgPuTH/WhO3cDsx6
    3PIW4/CddNs8mCSBOqTnoaxh
    -----END PRIVATE KEY-----
    ';
      }
    
      function loadRsaPublicKeyPem() {
        // this is a sample key - don't worry !
        return '
    -----BEGIN PUBLIC KEY-----
    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8EmWJUZ/Osz4vXtUU2S+
    0M4BP9+s423gjMjoX+qP1iCnlcRcFWxthQGN2CWSMZwR/vY9V0un/nsIxhZSWOH9
    iKzqUtZD4jt35jqOTeJ3PCSr48JirVDNLet7hRT37Ovfu5iieMN7ZNpkjeIG/CfT
    /QQl7R+kO/EnTmL3QjLKQNV/HhEbHS2/44x7PPoHqSqkOvl8GW0qtL39gTLWgAe8
    01/w5PmcQ38CKG0oT2gdJmJqIxNmAEHkatYGHcMDtXRBpOhOSdraFj6SmPyHEmLB
    ishaq7Jm8NPPNK9QcEQ3q+ERa5M6eM72PpF93g2p5cjKgyzzfoIV09Zb/LJ2aW2g
    QwIDAQAB
    -----END PUBLIC KEY-----
    ';
      }
    
      function base64Encoding ($input) {
        return base64_encode($input);
      }
      function base64Decoding ($input) {
        return base64_decode($input);
      }
    
      echo 'RSA 2048 encryption OAEP SHA-256 string' . PHP_EOL;
      $sDataToEncrypt = "The quick brown fox jumps over the lazy dog";
      echo 'plaintext: ' . $sDataToEncrypt . PHP_EOL;
    
      // encryption
      echo PHP_EOL . '* * * encrypt the plaintext with the RSA public key * * *' .PHP_EOL;
      $ciphertextBase64 = base64Encoding(rsaEncryptionOaepSha256(loadRsaPublicKeyPem(), $sDataToEncrypt));
      echo 'ciphertextBase64: ' . $ciphertextBase64 . PHP_EOL;
    
      // transport the encrypted data to recipient
    
      // receiving the encrypted data, decryption
      echo PHP_EOL . '* * * decrypt the ciphertext with the RSA private key * * *' .PHP_EOL;
      $ciphertextReceivedBase64 = $ciphertextBase64;
      echo 'ciphertextReceivedBase64: ' . $ciphertextReceivedBase64 . PHP_EOL;
      $decryptedtext = rsaDecryptionOaepSha256(loadRsaPrivateKeyPem(), base64Decoding($ciphertextReceivedBase64));
      echo 'decryptedtext: ' . $decryptedtext . PHP_EOL;
    
    ?>
    

    要手动降级到PHPSecLib2并使上述代码正常工作,您需要将phpseclib目录替换为位于该GitHub的文件: https://github.com/phpseclib/phpseclib/tree/2.0