我想开发加密和解密功能。密钥大小应至少为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位长度的密钥。输入缓冲区和加密缓冲区应具有相同的大小
答案 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>