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

61 lines
3.1 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加密的随机性
*/
// 定义应用目录
define('APP_PATH', __DIR__ . '/application/');
// 加载框架引导文件
require __DIR__ . '/thinkphp/base.php';
// 手动引入需要的类文件
require __DIR__ . '/addons/shopro/library/ccblife/CcbRSA.php';
use addons\shopro\library\ccblife\CcbRSA;
echo "\n========== RSA加密随机性验证 ==========\n\n";
// 使用demo密钥
$publicKey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDC+8V1Or6R6H3a7TjuvoDa5k0W/niEGg4N+0Nni+KfwHVX05pI7Qdq1J5+q31yORAoiSSNZNW4uWykmeSltC2mHGkQXClU4JmMXnWFyRCENw1iDIIIEsNax4jFBZUaDCn69PxWgp5wwk+d0V7QRYZ9jkgUaJK+BSYa0KMraxVfJwIDAQAB';
$privateKey = '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=';
$message = "Hello, CCB!";
echo "原始明文: $message\n\n";
echo "连续加密同一明文3次观察密文差异:\n\n";
$ciphertexts = [];
for ($i = 1; $i <= 3; $i++) {
$encrypted = CcbRSA::encryptForCcb($message, $publicKey);
$encrypted = str_replace(["\r", "\n", "\r\n"], '', $encrypted);
$ciphertexts[] = $encrypted;
echo "{$i}次加密:\n";
echo " 密文(前80字符): " . substr($encrypted, 0, 80) . "...\n";
echo " 密文长度: " . strlen($encrypted) . " 字节\n";
// 验证能否解密
$decrypted = CcbRSA::decrypt($encrypted, $privateKey);
echo " 解密结果: $decrypted\n";
echo " 解密成功: " . ($decrypted === $message ? "✓ 是" : "✗ 否") . "\n\n";
}
// 对比三次密文
echo "========== 密文对比 ==========\n\n";
echo "第1次 vs 第2次: " . ($ciphertexts[0] === $ciphertexts[1] ? "相同" : "✗ 不同") . "\n";
echo "第2次 vs 第3次: " . ($ciphertexts[1] === $ciphertexts[2] ? "相同" : "✗ 不同") . "\n";
echo "第1次 vs 第3次: " . ($ciphertexts[0] === $ciphertexts[2] ? "相同" : "✗ 不同") . "\n";
echo "\n========== 结论 ==========\n\n";
echo "✓ RSA加密每次结果都不同正常现象\n";
echo "✓ 但每次都能正确解密回原始明文\n";
echo "✓ 这是RSA PKCS1 Padding的安全特性\n\n";
echo "【对建行接口的影响】\n";
echo "- 每次发送的cnt密文都不同 → 正常\n";
echo "- 建行服务器用他们的私钥能解密 → 关键\n";
echo "- 489错误不是因为密文不同而是:\n";
echo " 1. 建行没有你的公钥备案\n";
echo " 2. 服务方编号(svcid)与密钥不匹配\n";
echo " 3. 商户信息配置错误\n\n";