openssl下SM4算法cbc模式加解密运算实例

SM4算法cbc接口

加密


int openssl_sm4_encrypt_cbc(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();
    printf("%s %d\n", __func__, __LINE__);
    EVP_EncryptInit_ex(ctx, EVP_sms4_cbc(), NULL, key, iv);
    EVP_CIPHER_CTX_set_padding(ctx, 0);

    if (!EVP_EncryptUpdate(ctx, out_buf, out_len, in_buf, in_len))
    {
        EVP_CIPHER_CTX_free(ctx);
        return -1;
    }

    int tmplen = 0;
    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 ;
}

解密


int openssl_sm4_decrypt_cbc(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 ret = 0, tmplen = 0;
    printf("%s %d\n", __func__, __LINE__);

    EVP_DecryptInit_ex(ctx, EVP_sms4_cbc(), NULL, key, iv);

    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);
        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;
}

你可能感兴趣的:(openssl,gmssl算法接口的使用,算法,openssl,cbc)