Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从Crypto+获取随机输出+;_C++_Cryptography_Crypto++ - Fatal编程技术网

C++ 从Crypto+获取随机输出+;

C++ 从Crypto+获取随机输出+;,c++,cryptography,crypto++,C++,Cryptography,Crypto++,无法理解为什么我从Crypto++RC2解码器中获得看似随机的输出。输入总是相同的,但输出总是不同的 const char * cipher ("o4hk9p+a3+XlPg3qzrsq5PGhhYsn+7oP9R4j9Yh7hp08iMnNwZQnAUrZj6DWr37A4T+lEBDMo8wFlxliuZvrZ9tOXeaTR8/lUO6fXm6NQpa5P5aQmQLAsmu+eI4gaREvZWdS0LmFxn8+zkbgN/zN23x/sYqIzcHU"); int

无法理解为什么我从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';
const char*密码(“o4hk9p+a3+XLPG3QZRSQ5PGHYSN+7oP9R4j9Yh7hp08iMnNwZQnAUrZj6DWr37A4T+lEBDMo8wFlxliuZvrZ9tOXeaTR8/LUO6FXM6NQPA5AQMQLAMU+eI4gaREvZWdS0LmFxn8+zkbgN/zN23x/sYqIzcHU”);
int-keylen(64);
无符号字符键文本[]={0x1a、0x1d、0xc9、0x1c、0x90、0x73、0x25、0xc6、0x92、0x71、0xdd、0xf0、0xc9、0x44、0xbc、0x72、0x00};
std::字符串键((char*)keyText);
std::字符串数据;
CryptoPP::rc2加密rc2(重新解释强制转换(key.c_str()),keylen);
CryptoPP::ECB_Mode_ExternalCipher::解密rc2Ecb(rc2);
CryptoPP::StringSource
(密码
是的
,新的CryptoPP::Base64解码器
(新CryptoPP::StreamTransformationFilter
(rc2Ecb)
,新CryptoPP::StringSink(数据)
,CryptoPP::BlockPaddingSchemeDef::无填充
)
)
);

std::coutRC2减量应定义为:

CryptoPP::RC2Decryption rc2(reinterpret_cast<const byte *>(key.c_str()), key.size(), keylen);
CryptoPP::RC2Decryption rc2(reinterpret_cast(key.c_str())、key.size()、keylen);

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

如果要指示有效密钥长度,可以使用其他构造函数,如下所示:

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

请注意,您不应该使用std::string来保存密钥。密钥包含0x00字节是完全合法的,std::string并不是用来保存这些字节的。

请给出一个完整的例子:您向我们展示的内容没有明显的错误,因此我的最佳猜测是,问题在于您没有向我们展示的内容(即密钥、密钥和密码来自何处?)它们只是上面直接定义的常量,它们在Java中通过RC2/ECB/NOPADDING正确地解密。啊,我看你自己已经弄明白了。如您所见,该常数可能很重要:keylen是
key
的长度还是有效的key-length(按实际情况)并不明显。您错了。string设计用于保存char类型的任何元素,包括“\0”。参见Bjarne Stroustrup“C++编程语言”,第四版,P1041(第三版中的P583.)。