Sample code for 30+ languages & platforms
PureBasic

Encrypt File to PKCS7 .p7m

See more Encryption Examples

_LANGUAGE_ example to public-key encrypt a file creating a PKCS#7 .p7m file as output. Also demonstrates how to decrypt the .p7m to recover the original file.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkCrypt2.pb"
IncludeFile "CkCert.pb"

Procedure ChilkatExample()

    success.i = 0

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

    crypt.i = CkCrypt2::ckCreate()
    If crypt.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    ; Indicate the public-key encryption is to be used.
    ; Do this by setting the encryption algorithm equal 
    ; to "PKI" (an acroynm for public-key infrastructure).
    CkCrypt2::setCkCryptAlgorithm(crypt, "PKI")

    ; Indicate the inner symmetric encryption algorithm to be used.
    ; possible values are "aes", "des", "3des", and "rc2".
    ; For this example, we'll use 256-bit AES encryption.
    CkCrypt2::setCkPkcs7CryptAlg(crypt, "aes")
    CkCrypt2::setCkKeyLength(crypt, 256)

    ; To encrypt, only a certificate w/ public key is needed.
    ; (The certificate w/ private key is required for decryption.)

    ; The LoadFromFile method can load virtually any certificate format:
    ; 1. DER encoded binary X.509 (.CER)
    ; 2. Base-64 encoded X.509 (.CER)
    ; 3. Cryptographic Message Syntax Standard - PKCS #7 Certificates (.P7B)
    ; 4. PEM format
    encryptCert.i = CkCert::ckCreate()
    If encryptCert.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkCert::ckLoadFromFile(encryptCert,"/Users/chilkat/testData/cer/acme.cer")
    If success <> 1
        Debug CkCert::ckLastErrorText(encryptCert)
        CkCrypt2::ckDispose(crypt)
        CkCert::ckDispose(encryptCert)
        ProcedureReturn
    EndIf

    ; Tell the crypt object to use the certificate for encrypting:
    CkCrypt2::ckAddEncryptCert(crypt,encryptCert)

    ; Encrypt a file, producing a .p7m as output.
    ; The input file is unchanged, the output .p7m contains the encrypted
    ; contents of the input file.
    inFile.s = "/Users/chilkat/testData/pdf/sample.pdf"
    outFile.s = "/Users/chilkat/testData/p7m/sample.pdf.p7m"
    success = CkCrypt2::ckCkEncryptFile(crypt,inFile,outFile)
    If success <> 1
        Debug CkCrypt2::ckLastErrorText(crypt)
        CkCrypt2::ckDispose(crypt)
        CkCert::ckDispose(encryptCert)
        ProcedureReturn
    EndIf

    ; For demonstration purposes, a different instance of the object will be used
    ; for decryption.
    decrypt.i = CkCrypt2::ckCreate()
    If decrypt.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    ; To decrypt, the certificate w/ private key is required.  A PFX (also known
    ; as PKCS#12) is a common secure container for certs and private keys.
    pfxFilename.s = "/Users/chilkat/testData/pfx/acme.pfx"
    pfxPassword.s = "secret"

    ; Tell the component to look in the PFX file for certs and private keys.
    success = CkCrypt2::ckAddPfxSourceFile(decrypt,pfxFilename,pfxPassword)
    If success <> 1
        Debug CkCrypt2::ckLastErrorText(decrypt)
        CkCrypt2::ckDispose(crypt)
        CkCert::ckDispose(encryptCert)
        CkCrypt2::ckDispose(decrypt)
        ProcedureReturn
    EndIf

    ; Tell the decrypt object that PKI (public key encryption) is to be used
    ; for decryptiong.
    CkCrypt2::setCkCryptAlgorithm(decrypt, "PKI")
    ; There is no need to set the Pkcs7Alg or KeyLength because this information
    ; is contained within the .p7m

    ; Decrypt the .p7m
    inFile = "/Users/chilkat/testData/p7m/sample.pdf.p7m"
    outFile = "/Users/chilkat/testData/pdf/recovered.pdf"
    success = CkCrypt2::ckCkDecryptFile(decrypt,inFile,outFile)
    If success = 0
        Debug CkCrypt2::ckLastErrorText(decrypt)
        CkCrypt2::ckDispose(crypt)
        CkCert::ckDispose(encryptCert)
        CkCrypt2::ckDispose(decrypt)
        ProcedureReturn
    EndIf

    Debug "Success!"


    CkCrypt2::ckDispose(crypt)
    CkCert::ckDispose(encryptCert)
    CkCrypt2::ckDispose(decrypt)


    ProcedureReturn
EndProcedure