aes128算法ECB接口
加密接口
注意事项:
-
EVP_EncryptInit_ex初始化算法EVP_aes_128_ecb(),和密钥,key至少16B
-
EVP_EncryptUpdate加密运算,tmplen输出已加密长度
-
EVP_EncryptFinal_ex结束运算,如果在此仍有加密运算,则加密长度tmplen需补充到密文长度中
int openssl_aes128_encrypt_ecb(unsigned char *key,unsigned char *iv, unsigned char in_buf, int in_len, unsigned char out_buf,int out_len)
{
EVP_CIPHER_CTX ctx = NULL;
ctx = EVP_CIPHER_CTX_new();
int tmplen = 0;
printf("%s %d\n", func, LINE);
EVP_EncryptInit_ex(ctx, EVP_aes_128_ecb(), NULL, key, NULL);if (!EVP_EncryptUpdate(ctx, out_buf, &tmplen, in_buf, in_len)) { EVP_CIPHER_CTX_free(ctx); return -1; } *out_len = tmplen; if (!EVP_EncryptFinal_ex(ctx, out_buf + *out_len, &tmplen)) { EVP_CIPHER_CTX_free(ctx); return -2; } *out_len += tmplen; EVP_CIPHER_CTX_free(ctx); return 0 ;
}
解密接口
注意事项:
-
EVP_DecryptInit_ex初始化算法EVP_aes_128_ecb(),和密钥,key至少16B
-
EVP_DecryptUpdate解密运算,tmplen输出已解密长度
-
如果剩余字节是16B,再次使用EVP_DecryptUpdate
-
如果剩余字节不是16B整数倍,使用EVP_EncryptFinal_ex结束运算,输出加密长度tmplen补充到密文长度中
int openssl_aes128_decrypt_ecb(unsigned char *key,unsigned char *iv, unsigned char in_buf, int in_len, unsigned char out_buf,int out_len)
{
int ret = 0 ,tmplen = 0;
EVP_CIPHER_CTX ctx = NULL;
ctx = EVP_CIPHER_CTX_new();
EVP_CIPHER_CTX_set_padding(ctx, 0);
printf("%s %d\n", func, LINE);EVP_DecryptInit_ex(ctx, EVP_aes_128_ecb(), NULL, key, NULL); if (!EVP_DecryptUpdate(ctx, out_buf, &tmplen, in_buf, in_len)) { EVP_CIPHER_CTX_free(ctx); return -1; } *out_len = tmplen; if (in_len > tmplen) { if (!EVP_DecryptUpdate(ctx, out_buf+tmplen, &tmplen, in_buf+tmplen, in_len-tmplen)) { // RSP_TRACE("%s EVP_DecryptUpdate error \n", __func__); EVP_CIPHER_CTX_free(ctx); return -1; } *out_len += tmplen; } if (in_len %16!=0){ ret = EVP_DecryptFinal_ex(ctx, out_buf+tmplen, &tmplen); fprintf(stderr, "err:\n"); if (ret != 0) { // RSP_TRACE("%s EVP_DecryptFinal_ex error ret=%d\n", __func__, ret); EVP_CIPHER_CTX_free(ctx); return -2; } *out_len += tmplen; } EVP_CIPHER_CTX_free(ctx); return 0 ;
}