fengketrade/test_key_format.php
2025-10-22 11:34:32 +08:00

118 lines
4.4 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
/**
* 调试密钥格式问题
*/
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";