Sample code for 30+ languages & platforms
Swift

ClickBank Decrypt Instant Notification

See more ClickBank Examples

Demonstrates how to decrypt a ClickBank instant notification. See Instant Notification Service for more information and alternative code snippets.

Chilkat Swift Downloads

Swift

func chilkatTest() {
    var success: Bool = false

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

    // secret key from your ClickBank account
    var secretKey: String? = "MY_SECRET_KEY"

    var jsonStr: String? = "{\"notification\":\"BASE64_NOTIFICATION\",\"iv\":\"BASE64_IV\"}"

    let json = CkoJsonObject()!
    success = json.load(json: jsonStr)

    // Get the encrypted notification (binary) and IV from the JSON.
    let bdNotif = CkoBinData()!
    let bdIv = CkoBinData()!

    success = bdNotif.appendEncoded(encData: json.string(of: "notification"), encoding: "base64")
    success = bdIv.appendEncoded(encData: json.string(of: "iv"), encoding: "base64")

    // Get an SHA1 digest (as a hex string) of the secret key.
    // A SHA1 digest is 20 bytes.  Therefore the hex string is 40 chars.
    // Treat each us-ascii char as a binary byte of the secret key.
    // 256-bit AES needs a 256-bit key, which is 32-bytes.  Therefore
    // use the 1st 32 us-ascii chars of the hex SHA1 as the AES secret key.

    let crypt = CkoCrypt2()!
    // Because we're using the hex string as the actual AES key, it matters whether the hex is uppercase or lowercase.
    // We want lowercase.
    crypt.encodingMode = "hex_lower"
    crypt.hashAlgorithm = "sha1"
    var hexSha1: String? = crypt.hashStringENC(str: secretKey)
    print("\(hexSha1!)")

    // Treat the hex string as binary data for the AES key..
    let bdKey = CkoBinData()!
    bdKey.appendString(str: hexSha1, charset: "us-ascii")
    bdKey.removeChunk(offset: 32, numBytes: 8)

    crypt.keyLength = 256
    crypt.cryptAlgorithm = "aes"
    crypt.cipherMode = "cbc"

    // We can use any encoding because were just getting the binary bytes in an encoding, and then setting from the same encoding.
    // We'll just use base64..
    crypt.setEncodedIV(ivStr: bdIv.getEncoded(encoding: "base64"), encoding: "base64")
    crypt.setEncodedKey(keyStr: bdKey.getEncoded(encoding: "base64"), encoding: "base64")

    crypt.decryptBd(bd: bdNotif)
    print("Decrypted: \(bdNotif.getString(charset: "utf-8")!)")

}