You need to enable JavaScript to run this app. C++实现维吉尼亚密码结合XOR加密文本文件时密文未生效的问题排查
优惠活动
大模型
产品
解决方案
定价
更多

C++实现维吉尼亚密码结合XOR加密文本文件时密文未生效的问题排查

加密完全失效的核心问题
  • 触发空循环:原代码的加密循环判断条件依赖从未赋值的空字符串str,循环体执行次数为0;循环操作的pch、cch是未初始化的栈数组,即使触发循环也属于未定义行为,无法读取到真实的明文内容。
  • 读写流程错位:代码检测到明文文件打开成功后,未执行任何读取、加密操作,后续直接开启密文文件流,写入的循环逻辑是把明文逐字符原封不动复制到密文文件,完全跳过加密步骤,因此生成的密文和明文内容完全一致。
  • 密钥解析逻辑错误:原代码将由'0'、'1'字符组成的二进制字符串直接作为密钥值参与异或运算,没有把分段的8位二进制串解析成对应的实际字节值,也没有实现维吉尼亚密码要求的循环复用密钥的规则,即使加密逻辑被触发,运算结果也不符合预期。
  • 认知误区澄清:所有文本、文件在内存中本身就以二进制字节形式存储,不需要额外做“明文转二进制”的格式转换,XOR运算可以直接对原始字节操作。
加密逻辑的正确放置位置

加密逻辑不能放在文件打开判断的分支中空跑,需要嵌入到逐字节读取明文的循环内部:每读入一个明文字节,就按照维吉尼亚的循环规则匹配当前位置对应的密钥字节,执行XOR运算后直接将加密结果写入密文文件。这种边读边加密的模式不需要提前把整个文件加载到内存,对大文件兼容性更好。

修复后的可运行代码
#include<iostream>
#include<string>
#include<fstream>
#include<vector>

int main()
{
    // 解析原二进制形式的密钥为实际可运算的字节序列
    std::string keyBinStr = "01100011 01100001 01110100";
    std::vector<unsigned char> keyBytes;
    size_t pos = 0;
    // 按空格拆分每段8位二进制串,转为对应字节值
    while(pos < keyBinStr.size()){
        size_t spacePos = keyBinStr.find(' ', pos);
        if(spacePos == std::string::npos){
            spacePos = keyBinStr.size();
        }
        std::string curBinSeg = keyBinStr.substr(pos, spacePos - pos);
        unsigned char curByte = static_cast<unsigned char>(std::stoi(curBinSeg, nullptr, 2));
        keyBytes.push_back(curByte);
        pos = spacePos + 1;
    }

    std::ifstream pFile("plaintext.txt", std::ios::binary);
    if(!pFile.is_open()){
        std::cout << "Error!" << std::endl;
        return 1;
    }
    std::ofstream cFile("ciphertext.txt", std::ios::binary);

    unsigned char readByte;
    size_t keyIndex = 0;
    // 逐字节读取明文,实时执行加密
    while(pFile.read(reinterpret_cast<char*>(&readByte), sizeof(readByte))){
        unsigned char encryptByte = readByte ^ keyBytes[keyIndex];
        cFile.put(encryptByte);
        // 按维吉尼亚规则循环切换密钥索引
        keyIndex = (keyIndex + 1) % keyBytes.size();
    }

    pFile.close();
    cFile.close();
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.03 14:15:02