加密
int openssl_aes128_encrypt_xts(unsigned char *key,unsigned char *iv, unsigned char *in_buf, int in_len, unsigned char *out_buf,int* out_len)
{int len = 0;EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();if (!ctx) {perror("EVP_CIPHER_CTX_new failed");return -1;}printf("%s %d\n", __func__, __LINE__);if (1 != EVP_EncryptInit_ex(ctx, EVP_aes_128_xts(), NULL, NULL, NULL)) {perror("EVP_EncryptInit_ex failed for AES-XTS mode");return -1;}if (1 != EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv)) {perror("EVP_EncryptInit_ex failed for key and IV");return -1;}if (1 != EVP_EncryptUpdate(ctx, out_buf, &len, in_buf, in_len)) {perror("EVP_EncryptUpdate failed");return -1;}*out_len = len;if (1 != EVP_EncryptFinal_ex(ctx, out_buf + len, &len)) {perror("EVP_EncryptFinal_ex failed");return -1;}*out_len += len;
EVP_CIPHER_CTX_free(ctx);return 0;
}
解密
int openssl_aes128_decrypt_xts(unsigned char *key,unsigned char *iv, unsigned char *in_buf, int in_len, unsigned char *out_buf,int* out_len)
{int ret = 0;EVP_CIPHER_CTX* ctx = NULL;ctx = EVP_CIPHER_CTX_new();printf("%s %d\n", __func__, __LINE__);EVP_DecryptInit_ex(ctx, EVP_aes_128_xts(), NULL, key, iv);if (!EVP_DecryptUpdate(ctx, out_buf, out_len, in_buf, in_len)){EVP_CIPHER_CTX_free(ctx);return -1;}int tmplen = 0;ret = EVP_DecryptFinal_ex(ctx, out_buf + *out_len, &tmplen);if (ret){EVP_CIPHER_CTX_free(ctx);return -2;}*out_len += tmplen;EVP_CIPHER_CTX_free(ctx);return 0;
}