Sample code for 30+ languages & platforms
Unicode C++

Encrypt/Decrypt using PFX to produce -----BEGIN PKCS7----- ... -----END PKCS7-----

See more Encryption Examples

First we encrypt using a certificate + public key to produce output such as:
-----BEGIN PKCS7-----
MIIHPwYJKoZIhvcNAQcEoIIHMDCCBywC ...
...
...
-----END PKCS7-----
Then we decrypt using the cert + private key.

Chilkat Unicode C++ Downloads

Unicode C++
#include <CkCrypt2W.h>
#include <CkCertW.h>
#include <CkStringBuilderW.h>

void ChilkatSample(void)
    {
    bool success = false;

    //  This example requires the Chilkat API to have been previously unlocked.
    //  See Global Unlock Sample for sample code.

    CkCrypt2W crypt;

    //  Specify the encryption to be used.
    //  "pki" indicates "Public Key Infrastructure" and will create a PKCS7 encrypted (enveloped) message.
    crypt.put_CryptAlgorithm(L"pki");
    crypt.put_Pkcs7CryptAlg(L"aes");
    crypt.put_KeyLength(128);
    crypt.put_OaepHash(L"sha256");
    crypt.put_OaepPadding(true);

    //  A certificate is needed as the encryption key.
    //  Althought the PFX contains the associated private key, we don't need it for encryption.
    //  (A certificate usually contains the public key by default.)
    CkCertW cert;
    success = cert.LoadPfxFile(L"qa_data/pfx/cert_test123.pfx",L"test123");
    if (success != true) {
        wprintf(L"%s\n",cert.lastErrorText());
        return;
    }

    //  Tell the crypt object to use the certificate.
    crypt.SetEncryptCert(cert);

    const wchar_t *toBeEncrypted = L"This string is to be encrypted.";

    //  Get the result in multi-line BASE64 MIME format.
    crypt.put_EncodingMode(L"base64_mime");

    const wchar_t *encryptedStr = crypt.encryptStringENC(toBeEncrypted);
    if (success != true) {
        wprintf(L"%s\n",crypt.lastErrorText());
        return;
    }

    //  Make a "-----BEGIN PKCS7-----" ... "-----END PKCS7-----" sandwich...
    CkStringBuilderW sb;
    sb.AppendLine(L"-----BEGIN PKCS7-----",true);
    sb.Append(encryptedStr);
    sb.AppendLine(L"-----END PKCS7-----",true);

    const wchar_t *outStr = sb.getAsString();

    wprintf(L"%s\n",outStr);

    //  Sample output:

    //  -----BEGIN PKCS7-----
    //  MIICXAYJKoZIhvcNAQcDoIICTTCCAkkCAQAxggH0MIIB8AIBADCBrDCBlzELMAkGA1UEBhMCR0Ix
    //  GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
    //  Q09NT0RPIENBIExpbWl0ZWQxPTA7BgNVBAMTNENPTU9ETyBSU0EgQ2xpZW50IEF1dGhlbnRpY2F0
    //  aW9uIGFuZCBTZWN1cmUgRW1haWwgQ0ECEB6M1ZwZdZU7LrAIdurulmUwOAYJKoZIhvcNAQEHMCug
    //  DzANBglghkgBZQMEAgEFAKEYMBYGCSqGSIb3DQEBCDAJBgUrDgMCGgUABIIBAK/BZG/iXJ8az7zL
    //  8EQ77mc+oDPQ4w1hyytK2ip4djkPVvTfYhcoDQ+G/DBU+urJfrVBi5H9gmpXwYyfKlyUxBVRVEJl
    //  V/V5QQi4JmNTFbmgWh5tp9zDS98l6A2Va4Zs0Wy/owGLfvwitlxd1dsfVAV2hmBYS24BMpNcty5/
    //  0atcKYmSou13G78ztTKdMy1tECgZy8kerMsPdDQbSxEZkT3KpQ8C5uEQqYF3bIVaeZzha/Ywieh/
    //  tvO0T4aAmeJufwkNdVECmU7kuhnNaVPXknFl7jeibTl6zA/VcJKBKcIYT9FRC7KjdooI8q+jtQ/V
    //  k6RP4POaowkFg1QWRPEWeqIwTAYJKoZIhvcNAQcBMB0GCWCGSAFlAwQBAgQQEEFQduqeJqXQXzy4
    //  JpkoDoAgdldJDB9zEkpMpgr5/fR2iLvh5kC6BPfhOYjsawBY4Ok=
    //  -----END PKCS7-----

    //  ----------------------------------------------------------------------------------------
    //  Let's Decrypt the above string.

    //  Start with what was produced above..
    sb.Clear();
    bool bCrlf = true;
    sb.AppendLine(L"-----BEGIN PKCS7-----",bCrlf);
    sb.AppendLine(L"MIICXAYJKoZIhvcNAQcDoIICTTCCAkkCAQAxggH0MIIB8AIBADCBrDCBlzELMAkGA1UEBhMCR0Ix",bCrlf);
    sb.AppendLine(L"GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR",bCrlf);
    sb.AppendLine(L"Q09NT0RPIENBIExpbWl0ZWQxPTA7BgNVBAMTNENPTU9ETyBSU0EgQ2xpZW50IEF1dGhlbnRpY2F0",bCrlf);
    sb.AppendLine(L"aW9uIGFuZCBTZWN1cmUgRW1haWwgQ0ECEB6M1ZwZdZU7LrAIdurulmUwOAYJKoZIhvcNAQEHMCug",bCrlf);
    sb.AppendLine(L"DzANBglghkgBZQMEAgEFAKEYMBYGCSqGSIb3DQEBCDAJBgUrDgMCGgUABIIBAK/BZG/iXJ8az7zL",bCrlf);
    sb.AppendLine(L"8EQ77mc+oDPQ4w1hyytK2ip4djkPVvTfYhcoDQ+G/DBU+urJfrVBi5H9gmpXwYyfKlyUxBVRVEJl",bCrlf);
    sb.AppendLine(L"V/V5QQi4JmNTFbmgWh5tp9zDS98l6A2Va4Zs0Wy/owGLfvwitlxd1dsfVAV2hmBYS24BMpNcty5/",bCrlf);
    sb.AppendLine(L"0atcKYmSou13G78ztTKdMy1tECgZy8kerMsPdDQbSxEZkT3KpQ8C5uEQqYF3bIVaeZzha/Ywieh/",bCrlf);
    sb.AppendLine(L"tvO0T4aAmeJufwkNdVECmU7kuhnNaVPXknFl7jeibTl6zA/VcJKBKcIYT9FRC7KjdooI8q+jtQ/V",bCrlf);
    sb.AppendLine(L"k6RP4POaowkFg1QWRPEWeqIwTAYJKoZIhvcNAQcBMB0GCWCGSAFlAwQBAgQQEEFQduqeJqXQXzy4",bCrlf);
    sb.AppendLine(L"JpkoDoAgdldJDB9zEkpMpgr5/fR2iLvh5kC6BPfhOYjsawBY4Ok=",bCrlf);
    sb.AppendLine(L"-----END PKCS7-----",bCrlf);

    CkCrypt2W decrypt;
    decrypt.put_CryptAlgorithm(L"pki");

    //  Use the same cert + private key from the PFX above.
    //  For decryption, we need the private key.  Given that the certificate was loaded from a PFX,
    //  we should already have it.
    success = decrypt.SetDecryptCert(cert);

    decrypt.put_EncodingMode(L"base64");
    const wchar_t *decryptedText = decrypt.decryptStringENC(sb.getBetween(L"-----BEGIN PKCS7-----",L"-----END PKCS7-----"));

    wprintf(L"%s\n",decryptedText);
    }