Sample code for 30+ languages & platforms
DataFlex

Decrypt PKCS7 (CMS) EnvelopedData

This example receives a PKCS7 (CMS) EnvelopedData message that was encrypted to me. To decrypt it:

  1. The CMS structure contains -
    • Encrypted content (ciphertext)
    • The symmetric key used to encrypt the content, itself encrypted with my public key
    • Information identifying the recipient (me), typically by X.509 certificate
  2. Decryption process (what Chilkat does internally)
    • My software uses my digital certificat's private RSA key (which corresponds to the public key used during encryption) to decrypt the encrypted symmetric key.
    • The decrypted symmetric key is then used to decrypt the content-encryption layer, typically encrypted with a symmetric algorithm like AES.
  3. Result -
    • I recover the original plaintext data.

Summary:

  • The content itself is encrypted with a symmetric key (e.g., AES).
  • That symmetric key is encrypted using my RSA public key and included in the EnvelopedData.
  • I use my RSA private key to decrypt the symmetric key and then use it to decrypt the actual data.

Only the intended recipient, who possesses the correct private key, can successfully decrypt the EnvelopedData.

Chilkat DataFlex Downloads

DataFlex
Use ChilkatAx-win32.pkg

Procedure Test
    Boolean iSuccess
    Handle hoSb
    Boolean iBCrlf
    Handle hoCrypt
    String sDecryptedText
    Variant vCert
    Handle hoCert
    String sTemp1
    Boolean bTemp1

    Move False To iSuccess

    // Here's the PKCS7 (CMS) EnvelopedData we received.
    // It was created using this example:  Create PKCS7 CMS EnvelopedData

    // MIICSgYJKoZIhvcNAQcDoIICOzCCAjcCAQAxggHiMIIB3gIBADCBljCBgTELMAkGA1UEBhMCSVQx
    // EDAOBgNVBAgMB0JlcmdhbW8xGTAXBgNVBAcMEFBvbnRlIFNhbiBQaWV0cm8xFzAVBgNVBAoMDkFj
    // dGFsaXMgUy5wLkEuMSwwKgYDVQQDDCNBY3RhbGlzIENsaWVudCBBdXRoZW50aWNhdGlvbiBDQSBH
    // MwIQPCWvkSv8oQ7xRmEHJ6TzEDA8BgkqhkiG9w0BAQcwL6APMA0GCWCGSAFlAwQCAQUAoRwwGgYJ
    // KoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUABIIBAKqHAPQNSsQoX7B2NH7QyEOWQRsSVs8oCHXmy8f4
    // MVZD2er3bvYUCIomxpwbLEAl14qjUIMynahooYGgqip7+4FqL301G+BVjZVfEhHWj+VI1dAWnWuL
    // VHlvc/pbQNBWqV8rKVJsNIsuAZkdj4WSwLVKxYkYX43B8fh/g71XN2DTJu7Z/824v48KBmgpQBOT
    // 2q7IcDGxNPAFN2p6eavIVGn2LvhEbf/Fszyj+GR5tMcnQP1BOLJ3s3JzUBbvj8hcZrF1Vhl9HnTU
    // YQx8G/KdW1mR+Wlhl3BWoK0LYKRTbnTx2BXOs0CY1SXOAdhKr01ZYjA+xW4nGzY0lfXS9QZjh9gw
    // TAYJKoZIhvcNAQcBMB0GCWCGSAFlAwQBKgQQw0xTbfmnt0zjWHo5SaQIp4AgxTVY9E/Ncqy6t+RM
    // 8y4c3Av62/wB8IpPUEmtM2OeuZo=

    Get Create (RefClass(cComChilkatStringBuilder)) To hoSb
    If (Not(IsComObjectCreated(hoSb))) Begin
        Send CreateComObject of hoSb
    End
    Move True To iBCrlf
    Get ComAppendLine Of hoSb "MIICSgYJKoZIhvcNAQcDoIICOzCCAjcCAQAxggHiMIIB3gIBADCBljCBgTELMAkGA1UEBhMCSVQx" iBCrlf To iSuccess
    Get ComAppendLine Of hoSb "EDAOBgNVBAgMB0JlcmdhbW8xGTAXBgNVBAcMEFBvbnRlIFNhbiBQaWV0cm8xFzAVBgNVBAoMDkFj" iBCrlf To iSuccess
    Get ComAppendLine Of hoSb "dGFsaXMgUy5wLkEuMSwwKgYDVQQDDCNBY3RhbGlzIENsaWVudCBBdXRoZW50aWNhdGlvbiBDQSBH" iBCrlf To iSuccess
    Get ComAppendLine Of hoSb "MwIQPCWvkSv8oQ7xRmEHJ6TzEDA8BgkqhkiG9w0BAQcwL6APMA0GCWCGSAFlAwQCAQUAoRwwGgYJ" iBCrlf To iSuccess
    Get ComAppendLine Of hoSb "KoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUABIIBAKqHAPQNSsQoX7B2NH7QyEOWQRsSVs8oCHXmy8f4" iBCrlf To iSuccess
    Get ComAppendLine Of hoSb "MVZD2er3bvYUCIomxpwbLEAl14qjUIMynahooYGgqip7+4FqL301G+BVjZVfEhHWj+VI1dAWnWuL" iBCrlf To iSuccess
    Get ComAppendLine Of hoSb "VHlvc/pbQNBWqV8rKVJsNIsuAZkdj4WSwLVKxYkYX43B8fh/g71XN2DTJu7Z/824v48KBmgpQBOT" iBCrlf To iSuccess
    Get ComAppendLine Of hoSb "2q7IcDGxNPAFN2p6eavIVGn2LvhEbf/Fszyj+GR5tMcnQP1BOLJ3s3JzUBbvj8hcZrF1Vhl9HnTU" iBCrlf To iSuccess
    Get ComAppendLine Of hoSb "YQx8G/KdW1mR+Wlhl3BWoK0LYKRTbnTx2BXOs0CY1SXOAdhKr01ZYjA+xW4nGzY0lfXS9QZjh9gw" iBCrlf To iSuccess
    Get ComAppendLine Of hoSb "TAYJKoZIhvcNAQcBMB0GCWCGSAFlAwQBKgQQw0xTbfmnt0zjWHo5SaQIp4AgxTVY9E/Ncqy6t+RM" iBCrlf To iSuccess
    Get ComAppendLine Of hoSb "8y4c3Av62/wB8IpPUEmtM2OeuZo=" iBCrlf To iSuccess

    Get Create (RefClass(cComChilkatCrypt2)) To hoCrypt
    If (Not(IsComObjectCreated(hoCrypt))) Begin
        Send CreateComObject of hoCrypt
    End

    Set ComCryptAlgorithm Of hoCrypt To "pki"

    // The CMS message contains information about the digital certificate that was used to encrypt.
    // Assuming the certificate is installed in a Windows certificate store, or macOS keychain,
    // Chilkat will automatically locate and use the certificate + private key for decryption.

    Set ComEncodingMode Of hoCrypt To "base64"
    Set ComCharset Of hoCrypt To "utf-8"

    Get ComGetAsString Of hoSb To sTemp1
    Get ComDecryptStringENC Of hoCrypt sTemp1 To sDecryptedText
    Get ComLastMethodSuccess Of hoCrypt To bTemp1
    If (bTemp1 = False) Begin
        Get ComLastErrorText Of hoCrypt To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Showln sDecryptedText

    // We can get the digital certificate used for decryption by calling LastDecryptCert
    Get Create (RefClass(cComChilkatCert)) To hoCert
    If (Not(IsComObjectCreated(hoCert))) Begin
        Send CreateComObject of hoCert
    End
    Get pvComObject of hoCert to vCert
    Get ComLastDecryptCert Of hoCrypt vCert To iSuccess
    Get ComLastMethodSuccess Of hoCrypt To bTemp1
    If (bTemp1 = False) Begin
        Get ComLastErrorText Of hoCrypt To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get ComSubjectCN Of hoCert To sTemp1
    Showln "Cert used to decrypt: " sTemp1


End_Procedure