fengketrade/test_key_format.php

118 lines
4.4 KiB
PHP
Raw Permalink Normal View History

2025-10-22 11:34:32 +08:00
<?php
/**
* 调试密钥格式问题
*/
echo "\n========== 密钥格式调试 ==========\n\n";
$demoPrivateKey = 'MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAML7xXU6vpHofdrtOO6+gNrmTRb+eIQaDg37Q2eL4p/AdVfTmkjtB2rUnn6rfXI5ECiJJI1k1bi5bKSZ5KW0LaYcaRBcKVTgmYxedYXJEIQ3DWIMgggSw1rHiMUFlRoMKfr0/FaCnnDCT53RXtBFhn2OSBRokr4FJhrQoytrFV8nAgMBAAECgYEAizhN0thw/altQ4YiIoWvZ50M6iAkWN5prp37kNGWrM40etNB1FQ5+ZN636L+3THVUbwqdzLKTy1GX3jqg05VUIf0sKYYepp+skwZmHVprz4EUKsZXRa+3MnMChJcyHdlyuUNs6HriMq6Qc1+fFEOtZFAf3lo2wYNFw5vIKHGQRECQQDxVKa+6m4y7LmWgiGLYghuL/SGXySFhwBh5+zMNl8V7aAbTX/tH6A0s8JXsSI4iChjWPXthKFTrd7h62vJBjeFAkEAztXpNehF18g3e6JEhtjbTmMsgyj13gdSZSRwjO0Y+IsDI1afnZXzwv96OlukGK8185z0bsbhTCOd6rkcRTnduwJBAOqGknlMh4VTylO66PB0d67lSaPgCDT/al67LcOTPzqnMAX4fc6qAl3VJ5Ni39fCckWB6ZVGZCVW/hfdWmUEdqUCQFFWNXuJd82/YnIwAZq1tKhCv8JkXSuO3YwApHIG2wcCQ52l9ubVjSJlrP8+Am3imOjQFB9r/jUe3H7thHyEoPkCQCay3waa0ll2DY+epkrrF/QO7aMa6NIUArRgWUmqw+1/45csBiWPMUrAD/CPDUr9Jvte92NjoAlz649csbgMM3w=';
echo "原始私钥(BASE64):\n";
echo " 长度: " . strlen($demoPrivateKey) . " 字符\n";
echo " 前50字符: " . substr($demoPrivateKey, 0, 50) . "\n";
echo " 后50字符: " . substr($demoPrivateKey, -50) . "\n\n";
// 方法1chunk_split
$pem1 = "-----BEGIN PRIVATE KEY-----\n";
$pem1 .= rtrim(chunk_split($demoPrivateKey, 64, "\n"), "\n") . "\n";
$pem1 .= "-----END PRIVATE KEY-----\n";
echo "【方法1】使用chunk_split:\n";
echo $pem1;
echo "\n尝试加载...\n";
$key1 = @openssl_pkey_get_private($pem1);
if ($key1) {
echo "✓ 成功加载!\n";
$details = openssl_pkey_get_details($key1);
echo " 密钥类型: " . $details['type'] . "\n";
echo " 密钥大小: " . $details['bits'] . " bits\n";
openssl_free_key($key1);
} else {
echo "✗ 加载失败: " . openssl_error_string() . "\n";
}
echo "\n";
// 方法2wordwrap
$pem2 = "-----BEGIN PRIVATE KEY-----\n";
$pem2 .= wordwrap($demoPrivateKey, 64, "\n", true) . "\n";
$pem2 .= "-----END PRIVATE KEY-----\n";
echo "【方法2】使用wordwrap:\n";
echo $pem2;
echo "\n尝试加载...\n";
$key2 = @openssl_pkey_get_private($pem2);
if ($key2) {
echo "✓ 成功加载!\n";
$details = openssl_pkey_get_details($key2);
echo " 密钥类型: " . $details['type'] . "\n";
echo " 密钥大小: " . $details['bits'] . " bits\n";
openssl_free_key($key2);
} else {
echo "✗ 加载失败: " . openssl_error_string() . "\n";
}
echo "\n";
// 方法3手动循环
$pem3 = "-----BEGIN PRIVATE KEY-----\n";
$offset = 0;
while ($offset < strlen($demoPrivateKey)) {
$pem3 .= substr($demoPrivateKey, $offset, 64) . "\n";
$offset += 64;
}
$pem3 .= "-----END PRIVATE KEY-----\n";
echo "【方法3】手动循环:\n";
echo $pem3;
echo "\n尝试加载...\n";
$key3 = @openssl_pkey_get_private($pem3);
if ($key3) {
echo "✓ 成功加载!\n";
$details = openssl_pkey_get_details($key3);
echo " 密钥类型: " . $details['type'] . "\n";
echo " 密钥大小: " . $details['bits'] . " bits\n";
openssl_free_key($key3);
} else {
echo "✗ 加载失败: " . openssl_error_string() . "\n";
}
echo "\n";
// 检查是否需要PKCS#1格式
echo "【方法4】尝试PKCS#1格式 (RSA PRIVATE KEY):\n";
$pem4 = "-----BEGIN RSA PRIVATE KEY-----\n";
$pem4 .= wordwrap($demoPrivateKey, 64, "\n", true) . "\n";
$pem4 .= "-----END RSA PRIVATE KEY-----\n";
echo $pem4;
echo "\n尝试加载...\n";
$key4 = @openssl_pkey_get_private($pem4);
if ($key4) {
echo "✓ 成功加载!\n";
$details = openssl_pkey_get_details($key4);
echo " 密钥类型: " . $details['type'] . "\n";
echo " 密钥大小: " . $details['bits'] . " bits\n";
openssl_free_key($key4);
} else {
echo "✗ 加载失败: " . openssl_error_string() . "\n";
}
echo "\n";
echo "========== 检查密钥格式特征 ==========\n\n";
// BASE64解码后检查二进制特征
$decoded = base64_decode($demoPrivateKey);
echo "解码后长度: " . strlen($decoded) . " bytes\n";
echo "前30字节(hex): " . bin2hex(substr($decoded, 0, 30)) . "\n\n";
// PKCS#8特征开头应该是 30 82 ... (SEQUENCE)
// 并且包含 06 09 2a 86 48 86 f7 0d 01 01 01 (RSA OID)
$hex = bin2hex($decoded);
if (strpos($hex, '06092a864886f70d010101') !== false) {
echo "✓ 检测到PKCS#8格式特征 (包含RSA OID)\n";
echo " 应该使用: -----BEGIN PRIVATE KEY-----\n\n";
} else {
echo "✗ 未检测到PKCS#8特征\n";
echo " 可能是PKCS#1格式应该使用: -----BEGIN RSA PRIVATE KEY-----\n\n";
}
echo "========== 调试完成 ==========\n\n";