You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解密场景下如何将含非法字符的string转换为mpz_t类型?

含非法字符的字符串转mpz_t失败的解密场景解决方案

问题背景

需将包含非法字符的string类型密文转换为mpz_t类型以执行RSA解密,但使用mpz_set_str转换时结果始终为0(推测系统使用扩展编码而非标准ASCII,且无法修改编码);尝试直接构造mpz_t时结果不稳定,时而报错时而得到0值。

相关代码片段

解密循环代码

// 解密部分
for (auto& str : decompressedData/*vector<string>*/) {

    // 待解决:如何将"str"转换为"void decrypt(mpz_t m, mpz_t c, mpz_t n, mpz_t d)"所需的"mpz_t"类型?

    // 将解密后的数据更新回原字符串
    char* buffer = mpz_get_str(nullptr, 10, decryptedData);
    if (buffer == nullptr) {
        // 错误处理
        std::cerr << "Failed to convert decryptedData to string." << std::endl;
    }
    else {
        str = buffer;
        free(buffer); // 释放内存
    }

    // 释放内存
    mpz_clear(number);
}

测试转换代码及输出

测试代码:

mpz_t number; 
mpz_init(number);

// 将字符串转换为mpz_t
mpz_set_str(number, str.c_str(), 16); 
cout << "number:" << number 
     << "\nstr:" << str 
     << "\nstr.c_str():" << str.c_str() 
     << endl; 

输出:

number:0
str:***** (乱码)
str.c_str():***** (与上述乱码一致)

可行转换方案

核心问题分析

mpz_set_str的作用是按指定进制解析字符序列(比如16进制要求字符是0-9、a-f/A-F),但你的密文是二进制字节流(显示为乱码),并非符合进制规则的字符串,因此解析失败,返回默认的0值。

正确转换方法:二进制字节直接导入

使用mpz_import函数直接将string的二进制字节数据导入mpz_t,无需解析字符,代码示例:

mpz_t number;
mpz_init(number);

// 导入string的二进制字节到mpz_t
// 参数说明:
// number: 目标mpz_t变量
// str.size(): 导入的字节总数
// 1: 每个"字"的字节数(这里按单字节处理)
// 1: 字节序,1表示大端(需与加密时的字节序一致,RSA密文通常用大端)
// 0: 是否忽略高位字节(0表示不忽略)
// 0: 填充模式(0表示无填充)
// str.data(): 原始字节数据指针
mpz_import(number, str.size(), 1, 1, 1, 0, str.data());

// 可选:验证转换结果(转成十六进制字符串查看)
char* hex_val = mpz_get_str(nullptr, 16, number);
if (hex_val != nullptr) {
    cout << "转换后的mpz_t十六进制值: " << hex_val << endl;
    free(hex_val);
}

// 后续传入decrypt函数使用
mpz_t decryptedData;
mpz_init(decryptedData);
decrypt(decryptedData, number, n, d); // n和d为RSA的公/私钥参数

// 解密后转回字符串(如果解密结果是二进制数据,用mpz_export)
size_t out_size = 0;
unsigned char* out_data = (unsigned char*)mpz_export(nullptr, &out_size, 1, 1, 1, 0, decryptedData);
if (out_data != nullptr) {
    str.assign((char*)out_data, out_size);
    free(out_data);
}

// 清理资源
mpz_clear(number);
mpz_clear(decryptedData);

注意事项

  • 字节序必须与加密时保持一致:加密时用大端导出则这里传1,小端传0
  • 如果密文是Base64/十六进制编码后的字符串,需先解码为二进制字节流再导入
  • 解密后若结果是二进制数据,用mpz_export转回字节流再构造string,而非mpz_get_str(后者仅用于数字字符串转换)

内容的提问来源于stack exchange,提问作者su_mu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 09:43:16