比特币库函数有奇怪的行为

时间:2017-12-28 15:03:48

标签: c++ encryption bitcoin

大家好,并提前感谢您在这里度过的时光。

所以我得到了这个输出以下内容的.cpp文件:

Cipher =(一群奇怪的人物)

Decryp = Allo mon coco

所以一切都很好......但是如果我在第一个上面交换第三个注释行,我会得到以下输出:

Cipher =(一群奇怪的人物)Allo mon coco

Decryp = Allo mon coco

//Like that everything outputs well
#include "Crypto/MainCrypto.h"

namespace Crypto
    {MainCrypto::MainCrypto()
        {const unsigned char Key[16] = "Bob";
        const unsigned char IV[16] = "Random";
        AES128CBCEncrypt m_AES128CBCEncrypt(Key, IV, 0);
        AES128CBCDecrypt m_AES128CBCDecrypt(Key, IV, 0);

        unsigned char ciptxt[16];                   //1
        unsigned char dcptxt[16];                   //2
        unsigned char Data[16] = "Allo mon coco";   //3

        m_AES128CBCEncrypt.Encrypt(Data, 16, ciptxt);
        m_AES128CBCDecrypt.Decrypt(ciptxt, 16, dcptxt);

        std::cout << "Cipher = " <<  ciptxt << std::endl;
        std::cout << "Decryp = " << dcptxt << std::endl;
        }

    MainCrypto::~MainCrypto()
        {}
    }


//Like that, I'm getting unwanted Allo mon coco
#include "Crypto/MainCrypto.h"

namespace Crypto
    {MainCrypto::MainCrypto()
        {const unsigned char Key[16] = "Bob";
        const unsigned char IV[16] = "Random";
        AES128CBCEncrypt m_AES128CBCEncrypt(Key, IV, 0);
        AES128CBCDecrypt m_AES128CBCDecrypt(Key, IV, 0);

        unsigned char Data[16] = "Allo mon coco";   //3
        unsigned char ciptxt[16];                   //1
        unsigned char dcptxt[16];                   //2

        m_AES128CBCEncrypt.Encrypt(Data, 16, ciptxt);
        m_AES128CBCDecrypt.Decrypt(ciptxt, 16, dcptxt);

        std::cout << "Cipher = " <<  ciptxt << std::endl;
        std::cout << "Decryp = " << dcptxt << std::endl;
        }

    MainCrypto::~MainCrypto()
        {}
    }

weird

not weird

我不知道为什么会这样做。如果你理解,请向我解释。

2 个答案:

答案 0 :(得分:0)

我不确定比特币库,但我假设它正常工作,所以可能的罪魁祸首是char数组。

CC++字符数组中应该以空值终止,否则它将不知道字符串何时结束,因此它将输出字符,直到它找到&#39; \ 0&#39;字符。所以这里发生的事情基本上是来自另一个字符数组的内存泄漏,因为它不是空终止的。

要解决此问题,请添加Data[15] = '\0'

答案 1 :(得分:0)

加密库调用正在加载ciptxt中的所有16个内存位置。

&#34; std :: cout&lt;&lt; &#34; Cipher =&#34; &LT;&LT; ciptxt&lt;&lt;的std :: ENDL;&#34;声明期望ciptxt以null结尾,但Encrypt在第16个位置放置一个非null值。然后std :: cout语句将继续打印字符,直到它在内存中达到空值。它在dcptxt char数组中找到一个null终止符。