生成大小不是16的倍数的加密数据

时间:2016-08-04 10:17:09

标签: c++ c encryption openssl aes

我想开发加密和解密功能。密钥大小应至少为128位(16字节)。

我使用了OpenSSL中的AES* api函数。但是AES*函数有一些限制:输入数据缓冲区应该是16的倍数!

在我的职能之后:

unsigned char encrypt_aes_key[]={0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF};

static inline int enc_array_decrypt(unsigned char *encarray, unsigned char *decarray, int size)
{
    int i;
    AES_KEY dec_key;
    unsigned char apibuf[512] = {0};
    unsigned char iv[AES_BLOCK_SIZE];
    memset(iv, 0x00, AES_BLOCK_SIZE);

    AES_set_decrypt_key(encrypt_aes_key, sizeof(encrypt_aes_key)*8, &dec_key); // Size of key is in bits
    AES_cbc_encrypt(encarray, apibuf, size, &dec_key, iv, AES_DECRYPT);
    memcpy(decarray, apibuf, size);

    return 0;
}

static inline int enc_array_encrypt(unsigned char *array, unsigned char *encarray, int size)
{
    int i;
    AES_KEY enc_key;
    unsigned char apibuf[512] = {0};
    unsigned char iv[AES_BLOCK_SIZE];
    memset(iv, 0x00, AES_BLOCK_SIZE);

    AES_set_encrypt_key(encrypt_aes_key, sizeof(encrypt_aes_key)*8, &enc_key); // Size of key is in bits
    AES_cbc_encrypt((unsigned char *)array, apibuf, size, &enc_key, iv, AES_ENCRYPT);
    memcpy(encarray, apibuf, size);

    return 0;
}

如果我调用缓冲区大小为9的函数,函数将返回wron输出

示例:

int main(int argc, char *argv[] )
{
    char buf[9] = {0}, encbuf[9] = {0}, decbuf[9] = {0};
    strcpy(buf, argv[1]);

    enc_array_encrypt(buf, encbuf, 9);
    enc_array_decrypt(encbuf, decbuf, 9);

    printf("%s  \n%s\n", buf, decbuf);

    return 0;
}

程序返回:

$ ./myprogram any
any  
2�����S�

我如何解决这个问题?

顺便说一句,我不能强制缓冲区为16倍乘数。因为我会将我的函数集成到一个大的源代码(SDK)中,我会在很多地方用不同的输入缓冲区调用我的函数。

我可以使用任何其他类型的加密(AES除外),但应该支持128位长度的密钥。输入缓冲区和加密缓冲区应具有相同的大小

1 个答案:

答案 0 :(得分:1)

通常不建议在OpenSSL中直接使用AES *功能。最好使用EVP系列功能。这些将允许您提供任何长度的输入缓冲区。

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
<script src="https://code.jquery.com/jquery-1.12.1.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>


<div id="temp"></div>
<div id="container"></div>