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

Crypto++中vector<uint8_t>与Integer转换丢失前导零问题求助

问题分析

Integer类型本质是数学意义上的整数,不会存储前导零的元数据。当你调用Decode把带前导零的vector<uint8_t>块转为Integer时,前导零会被自动忽略(比如整数0x000123和0x123在逻辑上是同一个值)。后续调用MinEncodedSize()得到的是该整数最小表示所需的字节数,自然不会包含原块的前导零,最终Encode输出的字节数组长度比原块短,导致和原块不一致。

OpenSSL的大数类(如BIGNUM)遵循同样的设计逻辑,因此会出现完全相同的问题。

解决方案

要保留原块的所有字节(包括前导零),核心是强制Encode时使用原块的固定长度,而非Integer的最小编码长度:

修改代码中获取编码长度和Encode的部分:

void Test(vector<uint8_t> data)
{
    vector<uint8_t> cipher;
    size_t blockSize = _keySize / 8;
    for (size_t i = 0; i < data.size(); i += blockSize)
    {
        size_t blockLength = min(blockSize, data.size() - i);
        vector<uint8_t> block(data.begin() + i, data.begin() + i + blockLength);
        Integer m;
        m.Decode(block.data(), block.size());
        
        // 关键修改:使用原块长度而非MinEncodedSize()
        size_t Size = blockLength;
        vector<uint8_t> encrypt(Size);
        // 显式指定编码方式(和Decode默认逻辑一致:无符号、大端)
        m.Encode(encrypt.data(), encrypt.size(), Integer::UNSIGNED, Integer::BIG_ENDIAN);
        
        if (encrypt != block)
        {
            cout << i << " " << unsigned(block[0]) << endl;
        }
    }
}
补充说明
  • Crypto++的Decode默认使用无符号大端编码,因此Encode时显式指定相同的编码方式可以避免因默认值变化导致的问题。
  • 如果你是在做加密操作(如RSA块处理),固定块长度是必须的——加密算法要求输入输出块长度匹配密钥长度,此时强制使用原块长度正好符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:10:12