c++ - 从 Crypto++ 获取随机输出

标签 c++ cryptography crypto++

无法弄清楚为什么我从 Crypto++ RC2 解码器中得到看似随机的输出。输入始终相同,但输出始终不同。

const char * cipher     ("o4hk9p+a3+XlPg3qzrsq5PGhhYsn+7oP9R4j9Yh7hp08iMnNwZQnAUrZj6DWr37A4T+lEBDMo8wFlxliuZvrZ9tOXeaTR8/lUO6fXm6NQpa5P5aQmQLAsmu+eI4gaREvZWdS0LmFxn8+zkbgN/zN23x/sYqIzcHU");
int          keylen     (64);

unsigned char keyText[] = { 0x1a, 0x1d, 0xc9, 0x1c, 0x90, 0x73, 0x25, 0xc6, 0x92, 0x71, 0xdd, 0xf0, 0xc9, 0x44, 0xbc, 0x72, 0x00 };
std::string key((char*)keyText);

std::string data;
CryptoPP::RC2Decryption rc2(reinterpret_cast<const byte *>(key.c_str()), keylen);
CryptoPP::ECB_Mode_ExternalCipher::Decryption rc2Ecb(rc2);
CryptoPP::StringSource
    ( cipher
    , true
    , new CryptoPP::Base64Decoder
        ( new CryptoPP::StreamTransformationFilter
            ( rc2Ecb
            , new CryptoPP::StringSink(data)
            , CryptoPP::BlockPaddingSchemeDef::NO_PADDING
            )
        )
    );

std::cout << data << '\n';

最佳答案

RC2::Decryption 构造函数的参数是:(指向 key 字节的指针, key 字节的长度)。您给它一个指向 16 字节的指针,但使用的是 64 字节的长度。 Crypto++ 在读取 key 时正在读取未初始化的内存,因此您会得到随机结果。

如果你想指示一个有效的 key 长度,你可以像这样使用另一个构造函数:

CryptoPP::RC2Decryption rc2(keyText, 16, keylen);

请注意,您应该使用 std::string 来保存您的 key 。 key 包含 0x00 字节是完全合法的,而 std::string 并非设计用于保存这些内容。

关于c++ - 从 Crypto++ 获取随机输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3723922/

相关文章:

c++ - C++中二维数组中的对象切片

c++ - 我如何在不放置 '#include' 语句的情况下访问 cpp 标准库?

c# - 如何在 C# 中验证加盐和散列密码

javascript - 从十六进制哈希生成范围内的 float

ios - 无法为 IOS 编译 Crypto++ 库

c++ - 在 Crypto++ 中使用 Curve25519 签名

c++ - FileSink、StringSink、Filesource、StringSource Crypto++ 之间有什么区别

c++ - 创建alignas(64) 整数 vector

c++ - 计算出内存地址指向的值

CBC-MAC 在 C 中的实现