fengketrade/addons/shopro/test/test_rsa_decrypt.php
2025-10-20 10:37:59 +08:00

137 lines
6.2 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* RSA解密测试脚本
* 测试建行ccbParamSJ参数解密
*/
// 手动加载必要的类
require_once __DIR__ . '/../library/ccblife/CcbRSA.php';
use addons\shopro\library\ccblife\CcbRSA;
echo "========================================\n";
echo " 建行 RSA 解密测试\n";
echo "========================================\n\n";
// 测试参数
$ccbParamSJ = 'cURYdUJxQ2pJTlVWQUltSW9DQWN1T2xJeFI4WjR2ZVY0NENTVmxPQW9RUVJ1bnJ2Ync5MkwzS2dXdDF1TTVSd3NvUFlsZWFURlYvK243aFNGaWRNeTJsZXRxM1VJR2k0VFdqNnU0Z2JXRnVxMnVIcjhzSVcrRW4xOGxaWDA4Snk0VW1hcFllZ05pekxmc2h6dGFCOTloTUtnVXh2ekJNbDFXZzdwT3lOcDBHZGx5N0FidW1FY1NudmlhNGcxZFAwM09BRk5sUE9USkM4QlJNNWtGTzRKVjFqTWx6RlhrblNwWG0rYmxpS2kyOFpYLy91OGZCR1NPNGp2dHN6b3N1TGxNZnUzd2JNeVUyOVpFTzYxWDRyNm0yb2c0ekZCQWpjc1VLdU9Kcmh1VjVwVDdQZlBlQ0MwRWhLQXFWWXBOdi9uS0FQNkZkZ2JER0ljN2tlUXNHdlFMTWlDeU9rVzdFU2phdG5jYjhZOUNaWkVEb29OdGVLdmlscXg4eHRFS1VtWHljU2ZNeUlDbk5yRW5nR3VXS1AvN3NacTNISE5BWSt2azBHdU1IaG5UWkl6bTdXUmhVYnNRclRYb0ljNy9UTnZVT3lmSVFIcTZ0KzZpZGdtc1NDejBkajVsSjkzVXNSM0NWZExCUk85NHQxZGNEOWorUnFhV2hrWmpiYUE4SlY=';
echo "输入参数:\n";
echo "ccbParamSJ 长度: " . strlen($ccbParamSJ) . "\n\n";
// 直接使用配置文件中的默认私钥BASE64格式
// 这是配置文件 ccblife.php 中的默认值
$privateKey = 'MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBALrJmPmtQfP6mURtMxLEXqJHLldN3zYukoaRxG0lw2IdcC86H9C9brFz4YlJ+98z2mdELJaQWu8VWI4actSuPKgHTBr9MSpaii0QQpdINpwXJD9AglIrT7MxhMLYx3qAYDhjKUlC5hnWVYOg4sG32k/3dCebRHY8RDlrXUfHB2+VAgMBAAECgYArgn5R2pv8WymMmOtGudtZbb9LsuYF1v9mvVnGGv/SQQ060w1KMHYye83TjxpOueNsHqNMR0AHZS+Fmn+ZLyUNj9S77oQvUx5HQvY2/TDnsKbETzEMDybIWB+XdLsUkOrB3peVLTbk25i6oSNPOT2Fvd8TWbDqzBL9Ci27uJH72QJBAP/DfDLYoYx9OIRCykkxrDdQVFEkzhXj0wIkLa0Wnf8kP/JfBqvr0AGUPF8nEfh7fLVXYQlh5ab2FL5KvUifSL8CQQC69crW0fryyDHePp6OIVRUbw0T93h52vbGXnoQ6wdvKxZeL3MsfdNUvsJYeSxmtyY+LLgz1p3qOoEn6UpLvCirAkEA4N7qUvY+y3vJdhgXLNV8mkGJcLKQc5SUkJxogHeTQKGJi7ra7ctuXgUMM4jxduxz0CjcS1iEhxBzWn/x/mj1lwJBALgtv39VKLTXx1i7s5Ms/liXdfi/iC3zKbxOAk58WryHY+exMvMXmYMY0Xg7FySxNLl3cJeQy8ydifL5fbmSSTUCQQCj/YUbcTP8BQ6N0AgFdBwmXJyiNkB9zaDI5cEtpSCgq72m8lfn883GJ1MT7nKVXeX69/q5yDQUYiYPBXH4lCEC';
echo "使用默认私钥(来自配置文件)\n";
echo "私钥长度: " . strlen($privateKey) . "\n\n";
// 执行解密
echo "========================================\n";
echo "开始解密...\n";
echo "========================================\n\n";
try {
// 步骤1: URLDecode
echo "步骤1: URLDecode\n";
$urlDecoded = urldecode($ccbParamSJ);
echo " URLDecode 后长度: " . strlen($urlDecoded) . "\n";
echo " 是否改变: " . ($urlDecoded === $ccbParamSJ ? '否' : '是') . "\n\n";
// 步骤2: 显示密钥信息
echo "步骤2: 私钥信息\n";
echo " 私钥长度: " . strlen($privateKey) . "\n";
echo " 是否包含 PEM 头: " . (strpos($privateKey, '-----BEGIN') !== false ? '是' : '否') . "\n\n";
// 步骤3: 尝试 RSA 解密
echo "步骤3: RSA 解密\n";
// 直接调用 CcbRSA::decrypt
$decrypted = CcbRSA::decrypt($urlDecoded, $privateKey);
echo " 解密成功!\n";
echo " 解密后长度: " . strlen($decrypted) . "\n";
echo " 解密内容: " . $decrypted . "\n\n";
// 步骤4: 解析参数
echo "步骤4: 解析参数\n";
parse_str($decrypted, $params);
echo " 解析结果:\n";
foreach ($params as $key => $value) {
echo " {$key} = {$value}\n";
}
echo "\n========================================\n";
echo "✅ 解密成功!\n";
echo "========================================\n";
} catch (\Exception $e) {
echo "\n========================================\n";
echo "❌ 解密失败!\n";
echo "========================================\n";
echo "错误信息: " . $e->getMessage() . "\n";
echo "错误行号: " . $e->getLine() . "\n";
echo "错误文件: " . $e->getFile() . "\n";
echo "\n堆栈跟踪:\n" . $e->getTraceAsString() . "\n";
// 额外诊断
echo "\n========================================\n";
echo "诊断信息\n";
echo "========================================\n";
// 检查 BASE64 解码
echo "\n1. BASE64 解码测试:\n";
$base64Decoded = base64_decode($urlDecoded);
if ($base64Decoded === false) {
echo " ❌ BASE64 解码失败\n";
} else {
echo " ✓ BASE64 解码成功\n";
echo " 解码后长度: " . strlen($base64Decoded) . "\n";
echo " 十六进制预览: " . bin2hex(substr($base64Decoded, 0, 32)) . "...\n";
}
// 检查私钥格式
echo "\n2. 私钥格式测试:\n";
try {
// 格式化私钥
$formattedKey = $privateKey;
if (strpos($formattedKey, '-----BEGIN') === false) {
$formattedKey = preg_replace('/\s+/', '', $formattedKey);
$formattedKey = "-----BEGIN RSA PRIVATE KEY-----\n" .
chunk_split($formattedKey, 64, "\n") .
"-----END RSA PRIVATE KEY-----\n";
}
$keyResource = openssl_pkey_get_private($formattedKey);
if ($keyResource === false) {
echo " ❌ 私钥格式错误: " . openssl_error_string() . "\n";
} else {
echo " ✓ 私钥格式正确\n";
$keyDetails = openssl_pkey_get_details($keyResource);
echo " 密钥类型: " . ($keyDetails['type'] === OPENSSL_KEYTYPE_RSA ? 'RSA' : '未知') . "\n";
echo " 密钥位数: " . $keyDetails['bits'] . "\n";
openssl_free_key($keyResource);
}
} catch (\Exception $e2) {
echo " ❌ 私钥检查失败: " . $e2->getMessage() . "\n";
}
// 检查数据长度
echo "\n3. 数据长度检查:\n";
if (isset($base64Decoded)) {
$dataLen = strlen($base64Decoded);
echo " 加密数据长度: {$dataLen} 字节\n";
if (isset($keyDetails)) {
$keySize = $keyDetails['bits'] / 8;
$blockCount = $dataLen / $keySize;
echo " 密钥大小: {$keySize} 字节\n";
echo " 分块数量: " . $blockCount . " (应该是整数)\n";
if ($blockCount != floor($blockCount)) {
echo " ⚠️ 警告: 数据长度不是密钥大小的整数倍\n";
}
}
}
}