fengketrade/addons/shopro/test/test_rsa_decrypt.php

137 lines
6.2 KiB
PHP
Raw Normal View History

2025-10-20 10:37:59 +08:00
<?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";
}
}
}
}