You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不使用mcrypt的情况下用PHP解密ClickBank通知数据?

用OpenSSL替代Mcrypt解密ClickBank数据

没问题,我帮你把这套基于废弃mcrypt的代码改成PHP推荐的OpenSSL实现——毕竟mcrypt早就被移除了,用openssl不仅更安全,也是现在的标准做法。

首先先拆解一下原来mcrypt代码的核心逻辑,这样我们能精准替换:

  • 用SHA1哈希你的密钥,取前32字节作为AES-256的密钥(因为MCRYPT_RIJNDAEL_128搭配32字节密钥时,实际就是AES-256-CBC)
  • 对加密的通知内容和IV做Base64解码
  • CBC模式解密后,移除开头的控制字符(\0到\32)
  • 最后处理编码和转义得到JSON数据

下面是完全替代的代码,我会标注关键替换点:

$secretKey = "YOUR SECRET KEY"; // 你的ClickBank密钥
// 读取原始请求体的JSON
$message = json_decode(file_get_contents('php://input'));
// 提取加密的通知内容和IV
$encrypted = $message->notification;
$iv = $message->iv;
error_log("IV: $iv");

// --- 核心解密部分替换为OpenSSL ---
// 1. 生成AES-256密钥:SHA1哈希后取前32字节
$aesKey = substr(sha1($secretKey), 0, 32);
// 2. 解码Base64的加密内容和IV
$encryptedData = base64_decode($encrypted);
$ivDecoded = base64_decode($iv);
// 3. 用OpenSSL解密:指定aes-256-cbc算法,PKCS7填充(和原PKCS5兼容)
$decrypted = openssl_decrypt(
    $encryptedData,
    'aes-256-cbc',
    $aesKey,
    OPENSSL_RAW_DATA, // 对应mcrypt的原始输出模式
    $ivDecoded
);
// 4. 移除开头的控制字符,和原代码逻辑一致
$decrypted = trim($decrypted, "\0..\32");
// --- 解密部分结束 ---

error_log("Decrypted: $decrypted");
// 处理编码和转义,转成JSON对象
$sanitizedData = utf8_encode(stripslashes($decrypted));
$order = json_decode($sanitizedData); // 修正原代码小问题:应该用处理后的$sanitizedData

关键说明:

  • 算法匹配:原代码的MCRYPT_RIJNDAEL_128搭配32字节密钥,等价于OpenSSL的aes-256-cbc——因为RIJNDAEL-128的块大小是128位,和AES一致,密钥长度决定了是128/192/256位AES。
  • 填充兼容:原代码用的PKCS5Padding和OpenSSL默认的PKCS7Padding是兼容的(PKCS5是PKCS7的子集,块大小16字节时两者完全一样),所以不需要额外处理填充。
  • 参数注意:OPENSSL_RAW_DATA参数让openssl_decrypt返回原始二进制数据,和mcrypt_decrypt的输出一致,避免自动Base64编码。
  • 小修正:原代码最后一行用未处理的$decrypted解码JSON,这里改成了处理后的$sanitizedData,避免编码问题。

测试的时候可以对比两种方式的输出,确保解密结果完全一致——这套代码能完美替代原来的mcrypt实现,而且兼容所有支持openssl的PHP版本(PHP 5.6+就支持,现在主流PHP版本都满足)。

内容的提问来源于stack exchange,提问作者Tarek Adam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:40:45