【问题标题】:openssl DES_ede3_cbc_encrypt encounter Use of uninitialised value of size 8openssl DES_ede3_cbc_encrypt 遇到使用未初始化的大小为 8 的值
【发布时间】:2016-02-21 18:53:06
【问题描述】:

使用c++调用openssl加密库得到错误信息,流水线:

==8752== 使用大小为 8 的未初始化值

==8752== 在 0x4EC3279:DES_encrypt2(在 /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 中)

==8752== by 0x4EC3A6E: DES_encrypt3(在 /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 中)

==8752== by 0x4EC43C2:DES_ede3_cbc_encrypt(在 /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 中)

==8752== by 0x403808: des3Encrypt (xcode.c:454)

==8752== by 0x402A60: main (server.c:428)

及源代码:

int des3Encrypt(unsigned char *Out,char *Key1,char *Key2,char *Key3, char *Msg, int size)
{

    unsigned char*    Res;

    DES_cblock key1, key2, key3;

    DES_cblock ivsetup = {'\0', '\0', '\0', '\0', '\0','\0', '\0', '\0'};
    DES_cblock ivec;
    DES_key_schedule ks1, ks2, ks3;

    memcpy(&key1,Key1,8);
    memcpy(&key2,Key2,8);
    memcpy(&key3,Key3,8);

    DES_set_key((DES_cblock *)key1, &ks1);
    DES_set_key((DES_cblock *)key2, &ks2);
    DES_set_key((DES_cblock *)key3, &ks3);

    int len =size ;
    /*
    short spure=len%8;
    printf("3des encode add bit before:%d,",len);

    if(spure!=0  ){
            len=(len+8-spure);
    }
    printf("after:%d\n",len);
    */

    Res=(unsigned char * ) malloc(len*sizeof(unsigned char));
    if(!Res) return 0;
    unsigned char * InBuffer=(unsigned char * ) malloc(len*sizeof( unsigned char));
    if(!InBuffer) return 0;
    bzero( InBuffer, len);
    memcpy( InBuffer,Msg,size );
    memcpy(ivec, ivsetup, sizeof(ivsetup));
    if(InBuffer == NULL || Res == NULL || ivec == NULL)
    {
            printf("uninitialised failed.\n");
    }
    DES_ede3_cbc_encrypt(InBuffer, Res, len, &ks1, &ks2, &ks3, &ivec, DES_ENCRYPT); <<<< this is 454 line
    free( InBuffer );
    memcpy(Out,Res,len);
    bzero( Res, len);
    free(Res);
    Res = NULL;

    return len;
}

请帮帮我,3ks。

【问题讨论】:

  • 您是否使用-O0-O1 per The Valgrind Quick Start Guide 编译了库和程序?您可能无法使用/usr/lib/x86_64-linux-gnu/libcrypto.so,因为它可能是使用-O2-O3 编译的。

标签: openssl


【解决方案1】:

即使它不能解决您的问题,您也必须通过您在代码中调用的值初始化填充字节。因此,例如,如果您尝试在输入末尾添加 3 个字节以使 len % 8 == 0 ,那么您实际添加到输入末尾的字节应该是 333。请参阅此处的填充 https://crypto.stackexchange.com/questions/9043/what-is-the-difference-between-pkcs5-padding-and-pkcs7-padding 也你应该归零 ivec memset(&ivec, 0, sizeof(ivec));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多