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