mirror of
https://gitee.com/liuxioabin/fengketrade.git
synced 2026-04-17 21:03:17 +08:00
137 lines
6.2 KiB
PHP
137 lines
6.2 KiB
PHP
|
|
<?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";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|