Deciphering Password

Description

Xiaoming has just come up with a new way for encryption, by calculating the key from a publicly viewable number in the following way: 
Let the public key N = A B, where 1 <= A, B <= 1000000, and a 0, a 1, a 2, …, a k-1 be the factors of N, then the private key M is calculated by summing the cube of number of factors of all ais. For example, if A is 2 and B is 3, then N = A B = 8, a 0 = 1, a 1 = 2, a 2 = 4, a 3 = 8, so the value of M is 1 + 8 + 27 + 64 = 100. 
However, contrary to what Xiaoming believes, this encryption scheme is extremely vulnerable. Can you write a program to prove it? 
 

Input

There are multiple test cases in the input file. Each test case starts with two integers A, and B. (1 <= A, B <= 1000000). Input ends with End-of-File. 
Note: There are about 50000 test cases in the input file. Please optimize your algorithm to ensure that it can finish within the given time limit. 
 

Output

For each test case, output the value of M (mod 10007) in the format as indicated in the sample output. 
 

Sample Input

2 2 1 1 4 7
 

Sample Output

Case 1: 36 Case 2: 1 Case 3: 4393
 


#include<cctype>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<queue>
#include<stack>
#include<set>
#include<map>
#define REP(i,a,b) for (i=(a);i<=(b);i++)
#define CLEAR(a) memset((a),0,sizeof((a)))
#pragma comment(linker, "/STACK:1024000000 , 1024000000")

using namespace std;

typedef long long LL;
const double pi = acos(-1.0);
const int maxn = 1010;
const int mod = 10007;

vector<int> vec;
map<int,bool> prime;

bool vis[maxn + 1];
int n, m, kase = 0;
LL ans;

void init();
void solve();
void outp();

void get_prime()
{
    vec.clear();
    prime.clear();
    CLEAR(vis);
    int k = 0;
    for (int i = 2; i < maxn; i++)
    {
        if (!vis[i])
        {
            vec.push_back(i);
            prime[i]=1;
        }
        for (int j = 1; j <= vec.size() && i * vec[j - 1] <= maxn; j++)
        {
            vis[i * vec[j - 1]] = 1;
        }
    }
}


int main()
{
    get_prime();
    while (~scanf("%d%d", &n, &m))
    {
        init();
        solve();
        outp();
    }
    return 0;
}

void solve()
{
    ans = 1;
    for(int k=0;vec[k]*vec[k]<=n&&k<vec.size();k++)
    {
        int e=0;
        while (!(n % vec[k]))
        {
            n /= vec[k];
            e++;
        }
        if (e)
            //ans*=((e*m+1)*(e*m+2)/2)*((e*m+1)*(e*m+2)/2);
        {
            LL tmp = ((LL)(e * m + 1) * (LL)(e * m + 2) / (LL)2) % mod;
            tmp = (tmp * tmp) % mod;
            ans = (ans * tmp) % mod;
        }
    }
    if (n>1)
    {
        LL tmp = ((LL)(m + 1) * (LL)(m + 2) / (LL)2) % mod;
        tmp = (tmp * tmp) % mod;
        ans = (ans * tmp) % mod;
    }
}

void init()
{
}

void outp()
{
    printf("Case %d: %I64d\n", ++kase, ans);
}


<think>嗯,用户遇到了建行参数解密失败且为空的问题,需要找出解决方案。首先,我需要理解错误信息的具体含义。“ccbParam deciphering fail is null”可能意味着在解密过程中,某个参数的值是空的,或者解密算法出现了问题。接下来,我应该考虑可能的原因,比如参数缺失、加密方式不一致、密钥错误、编码问题或者网络传输中的异常。 根据用户提供的引用内容,特别是引用[2]提到的Java加密和C语言解密的问题,这可能涉及到不同编程语言间加密解密的不兼容性。比如,Java和C可能在实现DES加密时使用不同的填充方式或加密模式,导致解密失败。另外,引用[1]中的URL参数处理可能存在字符串拼接或截断的问题,比如参数顺序、特殊字符处理不当,导致解密时获取的参数不完整或格式错误。 然后,用户需要检查参数是否完整。例如,ORDERID、PAYMENT等参数是否在传输过程中丢失或为空。可以查看日志确认参数是否正确传递。接着,确认加密方式是否一致,比如是否双方都使用相同的算法(如DES、AES)、模式(如ECB、CBC)、填充方式(如PKCS5Padding)以及密钥。例如,Java的DES实现默认使用ECB模式和PKCS5Padding,而C语言可能需要显式设置这些参数,否则会导致解密失败。 编码问题也是一个常见原因。比如,参数在传输过程中可能被错误地编码(如URL编码、Base64),需要确保加密后的数据正确编码,并在解密前进行解码。此外,特殊字符如“&”可能被截断,需要检查参数拼接是否正确,避免使用会干扰参数解析的字符。 密钥管理方面,需要确认双方使用的密钥是否完全一致,包括大小写和特殊字符。同时,网络传输中的异常可能导致参数值被截断或篡改,可以通过日志对比发送和接收的参数值是否一致。 调试建议包括分步验证加密解密流程,使用相同的测试数据在双方环境中测试,确保加解密结果一致。另外,查看解密函数的错误处理,确认是否有异常被捕获但未正确抛出,导致返回空值。 如果以上步骤无法解决,可能需要联系建行技术支持,确认接口文档中的加密要求是否有更新,或者是否存在服务器端的问题。例如,引用[3]中提到的预训练数据对模型的影响,虽然不直接相关,但提醒我们需要确保使用的加密方法和数据符合最新的规范。 总结解决方案步骤:检查参数完整性→核对加密配置→处理编码问题→验证密钥→排查传输问题→分步调试→联系技术支持。同时,用户可能需要参考建行的官方文档或技术支持提供的示例代码,确保加密解密实现符合规范。</think>### 建行参数解密失败且为空问题解决方案 #### 问题分析 错误提示`ccbParam deciphering fail is null`表明以下可能性: 1. **参数缺失或为空**:关键参数未正确传递或解密后为空值。 2. **加密方式不一致**:加密/解密算法、模式或填充方式不匹配[^2]。 3. **编码问题**:参数传输时编码格式(如Base64、URL编码)未正确处理。 4. **密钥错误**:双方使用的密钥不一致或格式错误。 --- #### 分步解决方案 ##### 1. **检查参数完整性** - **验证参数列表**:确认接收的`ORDERID`、`PAYMENT`、`CURCODE`等参数是否完整且非空。 - **日志追踪**:记录请求原始数据,对比建行接口文档的参数要求,例如: ```python # 示例:Python中打印接收参数 print("Received params:", this.Request) ``` - **特殊字符处理**:检查参数是否包含`&`或`=`等符号导致截断,需使用URL编码转义[^1]。 ##### 2. **核对加密配置** - **算法一致性**:确认双方使用相同的加密算法(如DES、AES)、模式(如ECB、CBC)和填充方式(如PKCS5Padding)。 - *Java与C语言差异*:Java默认使用`DES/ECB/PKCS5Padding`,而C需手动配置[^2]。 - **密钥验证**:检查密钥长度和内容是否完全一致(包括大小写、特殊字符)。 ##### 3. 处理编码问题 - **Base64编码**:若加密数据通过Base64传输,需在解密前先解码: ```java // Java示例:Base64解码 byte[] encryptedData = Base64.getDecoder().decode(encryptedString); ``` - **字符集统一**:确保加密/解密双方使用相同字符集(如UTF-8)。 ##### 4. 验证密钥与数据流 - **密钥硬编码测试**:临时使用固定密钥测试,排除动态生成错误。 - **数据流对比**: - 加密端输出密文的Hex/Bytes格式。 - 解密端输入前打印密文,确认两者一致。 ##### 5. 排查网络传输问题 - **参数截断**:检查接收参数的字符串长度是否与发送端一致。 - **HTTPS干扰**:部分代理可能修改参数,需关闭代理调试。 ##### 6. 分步调试解密函数 ```java // Java示例:解密函数调试 public static String decrypt(String data, String key) { try { Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key.getBytes(), "DES")); return new String(cipher.doFinal(Base64.getDecoder().decode(data))); } catch (Exception e) { e.printStackTrace(); // 打印具体异常信息 return null; } } ``` - 若返回`null`,检查`doFinal`输入的密文是否有效。 ##### 7. 联系建行技术支持 - **接口文档**:确认加密要求是否有更新(如算法升级为AES)。 - **错误码查询**:提供`SUCCESS`字段和交易流水号(`ORDERID`)请求建行排查。 --- #### 相关问题§§ 1. 如何在不同编程语言间实现兼容的DES加密解密? 2. HTTPS传输中如何处理特殊字符避免参数丢失? 3. 建行支付接口常见错误码有哪些及解决方案? --- #### 引用说明 - 加解密算法需严格对齐参数,如Java与C的库实现差异可能导致失败。 - URL参数拼接时需注意符号转义,避免截断问题[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值