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

Windows下C++ RSA字符显示异常求助:Ubuntu与Dev C++运行正常

嘿,这个问题我之前帮人排查过不少,大概率是字符编码差异和Windows环境的终端/编译设置问题搞的鬼,咱们一步步来解决:

核心原因分析

你的代码在Ubuntu和Dev C++能正常跑,是因为这俩环境默认用的是UTF-8编码,而其他Windows环境(比如Visual Studio、原生CMD)通常默认是GBK编码。RSA加密本质是处理字节流,不同编码下同一个字符的字节表示完全不一样,解密后自然就变成了未知字符。除此之外,还有可能是字节与字符的边界处理、终端输出编码适配的问题。

针对性解决方案

1. 强制代码用UTF-8编码编译

不管Windows环境默认啥编码,咱们直接让编译器用UTF-8处理代码和输出:

  • 如果用Visual Studio:右键项目→属性→C/C++→命令行,在“附加选项”里加 /utf-8 参数;
  • 如果用MinGW系列编译器(比如Code::Blocks):编译选项里加 -finput-charset=utf-8 -fexec-charset=utf-8,确保输入输出都是UTF-8。

2. 明确按字节处理加密解密

C++的string在多字节编码环境下(比如中文),单个字符可能占多个字节,直接按char遍历会破坏字符结构。建议把字符串转成字节数组处理:

// 加密前转成字节数组
string plaintext = "需要加密的文本";
vector<unsigned char> raw_bytes(plaintext.begin(), plaintext.end());

// 这里写你的RSA加密逻辑,操作raw_bytes即可

// 解密后转回字符串
vector<unsigned char> decrypted_bytes = 你的解密结果;
string decrypted_str(decrypted_bytes.begin(), decrypted_bytes.end());

3. 修复Windows终端的编码显示

哪怕代码处理对了,Windows默认CMD也不支持UTF-8输出,会把字符显示成乱码。可以在代码开头加一段Windows专属的编码设置:

#ifdef _WIN32
#include <windows.h>
// 把控制台输入输出都设为UTF-8
SetConsoleOutputCP(CP_UTF8);
SetConsoleCP(CP_UTF8);
#endif

或者直接用Windows Terminal,它默认支持UTF-8,体验会好很多。

4. 代码里的其他潜在坑

从你给的代码片段看,还有两个需要注意的点:

  • 你用了int类型处理RSA的密钥和数据,这会导致能加密的内容长度极短,稍微长点的字符串就会溢出,也可能引发乱码。建议改用大整数库(比如OpenSSL的BN模块)或者自己实现大整数运算;
  • rand()函数的随机性太差,绝对不能用来生成RSA的p、q这类密钥参数,换成C++11的<random>库或者Windows的CryptGenRandom才安全。
附一个简单的编码适配示例

我给你改了下代码,加上了编码设置和字节处理的示例(加密解密部分简化了,你可以替换成自己的RSA逻辑):

#include<iostream>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<vector>
#ifdef _WIN32
#include <windows.h>
#endif

using namespace std;

// 补全的素数检查函数
int check_prime(int number) {
    if (number <= 1) return 0;
    if (number <= 3) return 1;
    if (number % 2 == 0 || number % 3 == 0) return 0;
    for (int i = 5; i * i <= number; i += 6) {
        if (number % i == 0 || number % (i + 2) == 0) return 0;
    }
    return 1;
}

// 模拟RSA加密(实际要替换成你的完整实现)
vector<unsigned char> encrypt(const vector<unsigned char>& raw_bytes) {
    vector<unsigned char> cipher;
    for (unsigned char b : raw_bytes) {
        // 这里只是简单位移,替换成你的RSA加密逻辑
        cipher.push_back(b + 10);
    }
    return cipher;
}

// 模拟RSA解密
vector<unsigned char> decrypt(const vector<unsigned char>& cipher_bytes) {
    vector<unsigned char> plain;
    for (unsigned char b : cipher_bytes) {
        plain.push_back(b - 10);
    }
    return plain;
}

int main() {
    #ifdef _WIN32
    // 设置控制台为UTF-8编码
    SetConsoleOutputCP(CP_UTF8);
    SetConsoleCP(CP_UTF8);
    #endif

    string text = "Hello, 世界!";
    vector<unsigned char> raw_bytes(text.begin(), text.end());
    
    vector<unsigned char> cipher = encrypt(raw_bytes);
    vector<unsigned char> decrypted_bytes = decrypt(cipher);
    string decrypted_str(decrypted_bytes.begin(), decrypted_bytes.end());

    cout << "原始文本: " << text << endl;
    cout << "加密后字节流: ";
    for (unsigned char b : cipher) cout << hex << (int)b << " ";
    cout << endl;
    cout << "解密后文本: " << decrypted_str << endl;

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:36:38