c++ 将向量转换为整数的Crypto++问题< uint8_t>

6jygbczu  于 2023-05-30  发布在  其他
关注(0)|答案(1)|浏览(216)

我正在用C做一个程序,它可以和vector一起工作,并使用Crypto库<uint8_t>。我把我的向量分成小的,并试图把它转换成整数,但有时小向量 * 块 * 包含零在开始,所以当我从整数转换回向量<uint8_t>,这个向量不包含这个零。下面是代码:

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());
        size_t Size = m.MinEncodedSize();
        vector<uint8_t> encrypt(Size);
        m.Encode(encrypt.data(), encrypt.size());
        if (encrypt != block)
        {
            cout << i << " " << unsigned(block[0]) << endl;
        }
    }
}

在这个代码中,_keySize是1024,数据包含140000个元素。下面是输出:

11264 0
17280 0
29952 0
53632 0
57728 0
63104 0
75392 0
137216 0
138880 0

我试图使用OpenSSL库,但有同样的错误。

nwlls2ji

nwlls2ji1#

这个答案是基于 * 假设 *,因为我不熟悉Crypto++库;至少,这是一个“合理”的解释:
Integer听起来很像一个任意大小的整数类型,就像其他大整数库中的一样。
我现在画一个平行的标准输入/输出流:
Decode ing数据上,读取字符串并从中构造一些内部表示。很有可能这不是基于最小的整数类型(有符号或无符号char),而是基于底层CPU本机支持的最大整数类型(即char)。对应于后者的寄存器大小的一个)。
这相当于从控制台阅读一些值到变量中:

int n;
std::cin >> n;

现在可以传入101或任意数量的前导零(当然,不考虑前导零默认情况下会切换为八进制数字格式...)。当你再次输出变量时:

std::cout << n;

您只需得到1作为输出,所有前导零都被丢弃。
类似地:为什么一些大整数类型在创建其内部值的字符串表示时要产生前导零?
如果你不告诉它,至少它不会默认。如果这是可能的,那么就这样做,检查API是否存在这样的函数以及如何调用它。这将对应于:

std::cout << std::setfill('0') << std::setw(4) << n;

打印0001
如果你发现没有这样的API存在,那么你需要手工做;开始如下:

size_t size = m.MinEncodedSize();
if(size > blockLength)
{
    // well, NOW you really are in trouble!
    // TODO: some appropriate error handling
}
else
{
    vector<uint8_t> encrypt(blockLength, '0');
    // (note: NOT size; and initialize to '0', not 0!

    m.Encode(encrypt.data() + blockLength - size, size);
}

如果我的假设是正确的,你现在应该得到想要的结果。

相关问题