Search code examples
phpencryptionopensslrsaoaep

How to Decrypt RSA OAEP with SHA256 using openssl on PHP


i try decrypt using opensll on php. Required algorithm is rsa-oaep with sha256. what do i need to write for $cipher_algo?

$key = 'examplekey';
$secret = 'examplesecret';
$cipher_algo = '';

$out = openssl_decrypt(base64_decode($secret), $cipher_algo, $key, OPENSSL_RAW_DATA);

or some lib encrypt and decrypt that can use on php


Solution

  • You need the library https://phpseclib.com/ to get the following code to run (I'm using version 3).

    Kindly note that there is no exception handling on the code.

    This is an output:

    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 * * *
    ciphertextBase64: p1SRx16ieLkDOu0SzFblU0WYSVNmspyJW57KG/fXoqvdqQGtO3qKXxPKIe24XBP4I+APx4pdvt3Ye/qVDMxokSzbLLPKplPs6P9NKoyJnrliIK8qUeP921d9G+x2XcRTmQgyCEaukp8sJuqC4gfaBe+houD8AG3jA4h2fBaBepZa9ZYwsMp4UWifCxvb5oWFst5rG3yMNNlg4hH+pFuv3iBT8qYqyznKGFrFRcrQ/KFGrYUtQ62+ak6NKAC0MJCl7AsERFtSW3Zfd/X1hRJun4Wgu/IEjeVw0nX5U78zo4eim7sXkGySFp8YLaH8+bu3rkGI0QT6u3R1NBc20lWjEw==
    
    * * * decrypt the ciphertext with the RSA private key * * *
    ciphertextReceivedBase64: p1SRx16ieLkDOu0SzFblU0WYSVNmspyJW57KG/fXoqvdqQGtO3qKXxPKIe24XBP4I+APx4pdvt3Ye/qVDMxokSzbLLPKplPs6P9NKoyJnrliIK8qUeP921d9G+x2XcRTmQgyCEaukp8sJuqC4gfaBe+houD8AG3jA4h2fBaBepZa9ZYwsMp4UWifCxvb5oWFst5rG3yMNNlg4hH+pFuv3iBT8qYqyznKGFrFRcrQ/KFGrYUtQ62+ak6NKAC0MJCl7AsERFtSW3Zfd/X1hRJun4Wgu/IEjeVw0nX5U78zo4eim7sXkGySFp8YLaH8+bu3rkGI0QT6u3R1NBc20lWjEw==
    decryptedtext: The quick brown fox jumps over the lazy dog
    

    code:

    <?php
    include 'vendor/autoload.php';
    // uses phpseclib version 3
    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 base64Encoding($input) {return base64_encode($input);}
    function base64Decoding($input){return base64_decode($input);}
    
    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-----
    ';
    }
    
    echo 'RSA 2048 encryption OAEP SHA-256 string' . PHP_EOL;
    $dataToEncryptString = "The quick brown fox jumps over the lazy dog";
    echo 'plaintext: ' . $dataToEncryptString . PHP_EOL;
    
    // # # # usually we would load the private and public key from a file or keystore # # #
    // # # # here we use hardcoded keys for demonstration - don't do this in real programs # # #
    
    // encryption
    echo PHP_EOL . '* * * encrypt the plaintext with the RSA public key * * *' .PHP_EOL;
    $ciphertextBase64 = base64Encoding(rsaEncryptionOaepSha256(loadRsaPublicKeyPem(), $dataToEncryptString));
    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;
    ?>