EVP_EncryptUpdate缺少4个字节

问题描述 投票:0回答:1

我想用OpenSSL AES-256-cbc加密以100字节的块加密输入数据。但是,EVP_EncryptUpdate仅加密96个字节(参数tmp = 96)。下一次调用EVP_EncryptUpdate会加密其余数据(除了那4个丢失的数据)。

解密很好,除了那些4个失踪的副词。

如果我只调用一次EVP_EncryptUpdate,并立即传入所有数据,一切都很好。

如果我只将100个字节传递给EVP_EncryptUpdate,我不明白为什么这4个字节丢失了。

std::string data = "A12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123hgfedcba";

unsigned char key[] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
                        0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff };
unsigned char iv[] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff };

int  i = 0, tmp = 0, ol = 0;

int res = EVP_EncryptInit(&ctx, EVP_aes_256_ecb(), key, iv);   

std::unique_ptr<unsigned char[]> ret(new unsigned char[dataLen+EVP_CIPHER_CTX_block_size(&ctx)]);

for (i = 0; i < dataLen / 100; i++)
{  
   EVP_EncryptUpdate(&ctx,
   &ret[ol], &tmp, &data[ol], 100); 
   ol += tmp;
}


if (dataLen % 100)
{  
    EVP_EncryptUpdate(&ctx, &ret[ol], &tmp, &data[ol], dataLen % 100);
    ol += tmp;
}

EVP_EncryptFinal(&ctx, &ret[ol], &tmp);
openssl aes c++17
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.