生成大小不是16的倍数的加密数据
Generate encrypted data with size not multiple of 16
我想开发加密和解密功能。密钥大小应当至少为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%sn", buf, decbuf);
return 0;
}
程序返回:
$ ./myprogram any
any
2�����S�
我该怎么解决?
顺便说一句,我不能强迫缓冲区是16倍的乘数大小。因为我将把我的函数集成到一个大源代码(SDK)中,在这个SDK中,我将在许多具有不同输入缓冲区大小的地方调用我的函数。
我可以使用任何其他类型的加密(AES除外),但应该支持128位长度的密钥。输入缓冲区和加密缓冲区应具有相同的大小
通常不建议在OpenSSL中直接使用AES*函数。最好使用EVP系列功能。这将允许您提供任何长度的输入缓冲区。
void log_ssl_err(const char *mes)
{
unsigned long err;
char errstr[1000];
while ((err = ERR_get_error())) {
ERR_error_string(err, errstr);
printf("%s: %s", mes, errstr);
}
}
int encrypt_block(const unsigned char *IV, const unsigned char *key,
const unsigned char *src, unsigned int srclen,
unsigned char *dest, unsigned int *destlen)
{
EVP_CIPHER_CTX ctx;
const EVP_CIPHER *cipher = EVP_get_cipherbyname("AES-256-CBC");
int mode, len;
if (cipher == NULL) {
printf("Invalid keytype");
return 0;
}
mode = EVP_CIPHER_mode(cipher);
EVP_CIPHER_CTX_init(&ctx);
if (!EVP_EncryptInit_ex(&ctx, cipher, NULL, NULL, NULL)) {
log_ssl_err("EncryptInit for cipher failed");
return 0;
}
if (!EVP_EncryptInit_ex(&ctx, NULL, NULL, key, IV)) {
log_ssl_err("EncryptInit for key/IV failed");
return 0;
}
len = 0;
if (!EVP_EncryptUpdate(&ctx, dest, &len, src, srclen)) {
log_ssl_err("EncryptUpdate for data failed");
EVP_CIPHER_CTX_cleanup(&ctx);
return 0;
}
*destlen = len;
if (!EVP_EncryptFinal_ex(&ctx, dest + *destlen, &len)) {
log_ssl_err("EncryptFinal failed");
EVP_CIPHER_CTX_cleanup(&ctx);
return 0;
}
*destlen += len;
EVP_CIPHER_CTX_cleanup(&ctx);
return 1;
}
int decrypt_block(const unsigned char *IV, const unsigned char *key,
unsigned char *src, unsigned int srclen,
unsigned char *dest, unsigned int *destlen)
{
EVP_CIPHER_CTX ctx;
const EVP_CIPHER *cipher = EVP_get_cipherbyname("AES-256-CBC");
int mode, len;
if (cipher == NULL) {
printf("Invalid keytype");
return 0;
}
mode = EVP_CIPHER_mode(cipher);
EVP_CIPHER_CTX_init(&ctx);
if (!EVP_DecryptInit_ex(&ctx, cipher, NULL, NULL, NULL)) {
log_ssl_err("DecryptInit for cipher failed");
return 0;
}
if (!EVP_DecryptUpdate(&ctx, dest, &len, src, srclen)) {
log_ssl_err("DecryptUpdate for data failed");
EVP_CIPHER_CTX_cleanup(&ctx);
return 0;
}
*destlen = len;
if (!EVP_DecryptFinal_ex(&ctx, dest + *destlen, &len)) {
log_ssl_err("DecryptFinal failed");
EVP_CIPHER_CTX_cleanup(&ctx);
return 0;
}
*destlen += len;
EVP_CIPHER_CTX_cleanup(&ctx);
return 1;
}
相关文章:
- 加密在 Windows、C++ 和 Java 中传输中的数据
- 在 EAX 模式下加密数据时"program has stopped working"
- 我们是否可以使用 SEAL / PySEAL 库对加密数据执行除法操作Microsoft?
- 如何将加密数据从C 传输到Java
- 在一个应用中使用 AES 加密数据,并在另一个 C++ WinCrypt 中解密
- 使用Windows AES加密提供商在C 中解密C#加密数据
- 使用 libconfig 存储加密数据
- 如何在C++中加密数据并在PHP中解密
- 在libgcrypt的Crypto++中解密加密数据的步骤
- 使用 Boost::asio::async_send_to 发送加密数据时出错
- 使用 Win32/MFC 加密数据
- 将加密数据存储在控制台应用程序中
- 如何在C++中加密数据文件
- 在Java中使用RSA公钥加密数据,在Crypto++中解密
- Python的M2Crypto.EVP.Cipher无法使用C++加密数据
- 如何使用AES(openssl)加密数据
- OpenSSL:尝试使用通过握手获得的密钥材料来本地加密数据
- c++ AES如何逐块加密数据
- 生成大小不是16的倍数的加密数据
- 加密数据中的Null字符