fengketrade/doc/demo/TestCCBEncryption.java
2025-10-22 11:34:32 +08:00

126 lines
7.7 KiB
Java
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.

import java.util.Base64;
/**
* 测试建行demo的RSA加密解密
* 验证demo密文能否用demo密钥解密
*/
public class TestCCBEncryption {
// demo密钥来自服务方上送报文样例.txt
private static final String PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDC+8V1Or6R6H3a7TjuvoDa5k0W/niEGg4N+0Nni+KfwHVX05pI7Qdq1J5+q31yORAoiSSNZNW4uWykmeSltC2mHGkQXClU4JmMXnWFyRCENw1iDIIIEsNax4jFBZUaDCn69PxWgp5wwk+d0V7QRYZ9jkgUaJK+BSYa0KMraxVfJwIDAQAB";
private static final String PRIVATE_KEY = "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=";
// demo原始报文
private static final String PLAIN_TEXT = "{\"CLD_HEADER\":{\"CLD_TX_CHNL\":\"YSTEST\",\"CLD_TX_TIME\":\"20191112145911\",\"CLD_TX_CODE\":\"A3341O031\",\"CLD_TX_SEQ\":\"1010114131620697023913271\"},\"CLD_BODY\":{\"USER_ID\":\"user123\",\"ORDER_ID\":\"order123\",\"ORDER_DT\":\"20191112145811\",\"TOTAL_AMT\":\"100.00\",\"PAY_AMT\":\"90.00\",\"DISCOUNT_AMT\":\"10.00\",\"ORDER_STATUS\":\"1\",\"REFUND_STATUS\":\"0\",\"MCT_NM\":\"XXX商户\"}}";
// demo加密报文
private static final String DEMO_CIPHERTEXT = "Y2tFMDFJd2RGMGg5aFdXUGtjVVdaSmo4NHBKQzNNZE1wQTRRSXZVRlhBSWhqVEdXNE1LcE9MOXdxY0hhNUlIZndUU0RLK3NrZ1hpTytJUitpREEwSUp0bktRcWMxRG5hN1R0OEtjcUkxTUFDVE5FY2Z0b3lCeTVTaEo3cmNjSnBOUVFsSjRBR2htSzRheEhNb0p6N215eFViK1ZjeGd5WjVTTjJQcHUxQlBnZXJsQXE2Q1lrQ2VuSmZEYUxVSks5RGx2Yk9YWDlDczJiVVllYjlHSHQrUkFuYTljc2hucGhqVWNwNDgrcThNcGhQOElBL20xNVk5NG9lZEV4SXpmc0pDcDExZjFvQ0E5YkwwOWJOZjM4VHR3TkJkTmhqM3lKSVpWeWVpT0FucGhjS3JpOEs5RnlZbXlNVHF1UER3UjhmQ0p5dk5vYkNMS1BPRmQ3WFdXTVczZ29kSWpLaG5OUnhnaFA3N2txdDU3K2Rkd3hGbDgxUEdYbXJWN1ZKWDFOeXRVUFg2dWp3ZzdsUU1OSTlubU1kVE9nbHZJUHRoS205aEludFc2ZFBVTG1DUlNLNzZDc05qTUIyb1hTR2M2cHBNazMxNDJSa05KR0hvY1ZBNFUzcmc4SVk4ZFlYaTUzZmF3cHRES3pHY2JZVFI0SldRVzRNU2ZmSUxvNFpxTkY=";
// demo MAC签名
private static final String DEMO_MAC = "947CAB4DFEBE59265DD28246E4465157";
public static void main(String[] args) {
System.out.println("\n========== 建行RSA加密解密测试 ==========\n");
// 测试1: Java加密 + Java解密
System.out.println("【测试1】Java加密解密测试");
System.out.println("----------------------------------------");
try {
System.out.println("原始明文: " + PLAIN_TEXT.substring(0, 80) + "...");
System.out.println("明文长度: " + PLAIN_TEXT.length() + " 字符\n");
// 加密
System.out.println("步骤1: 用公钥加密");
String encrypted = RSAUtil.encrypt(PLAIN_TEXT, PUBLIC_KEY);
System.out.println(" 加密成功");
System.out.println(" 密文长度: " + encrypted.length() + " 字符\n");
// 解密
System.out.println("步骤2: 用私钥解密");
String decrypted = RSAUtil.decrypt(encrypted, PRIVATE_KEY);
System.out.println(" 解密成功");
System.out.println(" 解密结果: " + decrypted.substring(0, 80) + "...\n");
// 验证
boolean match = PLAIN_TEXT.equals(decrypted);
System.out.println("验证结果: " + (match ? "✓ 成功!加密解密完全一致" : "✗ 失败"));
if (match) {
System.out.println("\n【结论1】Java的RSA加密解密代码是正确的\n");
}
} catch (Exception e) {
System.err.println("✗ 错误: " + e.getMessage());
e.printStackTrace();
}
// 测试2: MD5签名
System.out.println("\n【测试2】MD5签名测试");
System.out.println("----------------------------------------");
try {
String calculatedMac = MD5Util.getMD5(PLAIN_TEXT + PRIVATE_KEY);
System.out.println("原始明文(前80字符): " + PLAIN_TEXT.substring(0, 80) + "...");
System.out.println("demo提供的MAC: " + DEMO_MAC);
System.out.println("我们计算的MAC: " + calculatedMac);
boolean macMatch = DEMO_MAC.equals(calculatedMac);
System.out.println("MAC验证结果: " + (macMatch ? "✓ 完全一致" : "✗ 不匹配") + "\n");
if (macMatch) {
System.out.println("【结论2】MD5签名算法是正确的\n");
}
} catch (Exception e) {
System.err.println("✗ 错误: " + e.getMessage());
e.printStackTrace();
}
// 测试3: 解密demo密文
System.out.println("\n【测试3】尝试解密demo提供的密文");
System.out.println("----------------------------------------");
try {
System.out.println("demo密文长度: " + DEMO_CIPHERTEXT.length() + " 字符");
System.out.println("demo密文(前100字符): " + DEMO_CIPHERTEXT.substring(0, 100) + "...\n");
System.out.println("开始解密...");
String decrypted = RSAUtil.decrypt(DEMO_CIPHERTEXT, PRIVATE_KEY);
System.out.println("✓ 解密成功!");
System.out.println("解密结果: " + decrypted);
System.out.println();
boolean match = PLAIN_TEXT.equals(decrypted);
System.out.println("与原始明文对比: " + (match ? "✓ 完全一致" : "✗ 不一致"));
if (match) {
System.out.println("\n【结论3】demo密文可以用demo私钥正确解密");
System.out.println("这说明demo密文是真实可用的测试数据。\n");
} else {
System.out.println("\n【分析】demo密文能解密但内容不匹配");
System.out.println("可能原因:");
System.out.println(" 1. demo密文对应的明文不是我们认为的那个");
System.out.println(" 2. 字符编码问题");
System.out.println(" 3. JSON格式化差异\n");
}
} catch (Exception e) {
System.err.println("✗ 解密失败: " + e.getMessage());
e.printStackTrace();
System.out.println("\n【重要发现】demo密文无法用demo私钥解密");
System.out.println("这说明:");
System.out.println(" 1. demo密文不是用demo公钥加密的");
System.out.println(" 2. demo密文只是格式示例不是真实可解密的数据");
System.out.println(" 3. 真实业务需要用建行平台公钥加密\n");
}
System.out.println("========== 测试完成 ==========\n");
System.out.println("【总结】");
System.out.println("如果测试1和测试2成功说明加密解密和签名代码都是正确的。");
System.out.println("如果测试3失败说明demo密文本身有问题不影响实际业务。");
System.out.println("\n489错误的原因很可能是:");
System.out.println(" 1. 需要用建行平台公钥加密(而不是商户公钥)");
System.out.println(" 2. 商户公钥未在建行备案");
System.out.println(" 3. 服务方编号(svcid)与密钥不匹配\n");
}
}